Web基础之Cookie对象和Session对象项目实战和对比


Web基础之Cookie对象和Session对象项目实战和对比

一、项目背景:
描述:早期电商网站,在不登录的情况下,能够保存商品到购物车,并且在近期再次进入该网站,还能看到购物
车中的商品,这是如何实现呢?

二、项目分析:
购物车主要是能在一定时间内记住用户选择的商品;这和我们学习Cookie和Session的生效时间对应起来;那么具体该如何实现购物车功能呢?

三、项目思路:
为模拟购物车功能,我们需要一个展示商品列表的页面,并且能添加对应的商品到购物车中,当成功添加时,应该有提示信息,提示加入购物车成功,当点击显示购物车时,需要能展示购物车中的商品;

gooList.jsp--->商品展示页面
AddGoodsServlet.java---->处理加入购物车的逻辑

ShowGoodsServlet.java---->处理跳转到购物车中商品的逻辑

shoppingCar.jsp--->展示购物车中的商品

当第一次请求加入购物车时,创建一个Cookie,把商品信息存入到Cookie中,并设置Cookie的有效期为一天(可以根据需要自己设置)当下一次再次有商品再次加入到购物车时,更新Cookie的值;并重新设置Cookie的有效期为一天;显示购物车中的商品时,先获取所有的请求求,看是否有我们需要的请求头,如果有,从该请求头中获取我们所需要的信息,然后展示出来;

四、项目源代码以及运行效果:

商品展示页面:goodsList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




商品列表界面


	
商品列表
商品名商品价格操作
iPhone7Plus$400加入购物车
iPad Pro$200加入购物车
Mac Book$800加入购物车
APPLE$5加入购物车
查看购物车
<% String info=(String)request.getAttribute("success"); if(info!=null){ %> <%=info%> <% } %>



Web基础之Cookie对象和Session对象项目实战和对比_第1张图片


成功加入购物车的提示信息:

Web基础之Cookie对象和Session对象项目实战和对比_第2张图片


添加到购物车的处理逻辑:AddGoodsServlet.java
package com.usc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddGoodsServlet extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//设置请求编码
		req.setCharacterEncoding("UTF-8");
		//获取参数
		String goodsName=req.getParameter("goodsname");
		String goodsPrice =req.getParameter("goodsprice");
		//拿到请求头中所有的Cookie
		Cookie[] cookies=req.getCookies();
		Cookie mycookie=null;
		//遍历所有的Cookie,看是否有我们想要的Cookie
		if(cookies!=null &&cookies.length>0){
			for (Cookie cookie : cookies) {
				//如果有我们需要的Cookie
				if("goodList".equals(cookie.getName())){
					mycookie=cookie;
					
//					测试代码,请忽略
//					int age1=cookie.getMaxAge();
//					int age2=mycookie.getMaxAge();
//					String test=cookie.getValue();
					
//					那么更新Cookie中的值,并重新设置有效期
					cookie.setValue(cookie.getValue()+"#"+goodsName+"@"+goodsPrice);
					cookie.setMaxAge(24*3600);
					
//					测试代码,请忽略			
//					String infos=cookie.getValue(); 
					
					//添加请求头
					resp.addCookie(cookie);
					
//					成功加入购物车
					req.setAttribute("success", goodsName+"成功加入购物车!");
					break;
				}
			}
		}
		
//		如果没有我们需要的Cookie,那么创建我们需要的Cookie
	 if(mycookie==null){
			mycookie = new Cookie("goodList", goodsName+"@"+goodsPrice);
//			设置Cookie的有效期
			mycookie.setMaxAge(24*3600);
//			添加Cookie
			resp.addCookie(mycookie);
//			成功加入购物车
			req.setAttribute("success", goodsName+"成功加入购物车!");
		}
//	 请求转发
		req.getRequestDispatcher("/goodList.jsp").forward(req, resp);
	}
}


跳转到购物车的逻辑:ShowGoodsServlet.java
package com.usc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowGoodsServlet extends HttpServlet{
	
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//设置请求编码
		req.setCharacterEncoding("UTF-8");
		
//		Cookie[] cookies=req.getCookies();
//		if(cookies!=null &&cookies.length>0){
//			for (Cookie cookie : cookies) {
//				if("goodList".equals(cookie.getName())){
//					String values=cookie.getValue();
//					req.setAttribute("goodsinfo", values);
//					break;
//				}
//			}
//		}
		req.getRequestDispatcher("/shoppingCar.jsp").forward(req, resp);
	}
}


显示购物车中商品信息:shoppingCar.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>




购物车界面


	
		
		<%
		String values=null;
		Cookie[] cookies=request.getCookies();
		if(cookies!=null &&cookies.length>0){
			for (Cookie cookie : cookies) {
				if("goodList".equals(cookie.getName())){
					values=cookie.getValue();
					break;
				}
			}
		}
		if(values!=null){
				String goodsinfo[]=values.split("#");
				for(int i=0;i
					
				<%		
				}
		}else{
			out.write("购物车中没有商品!");
		}
		%>
	
我的购物车
商品名 商品价格
<%=goodsName %><%=goodsPrice %>



Web基础之Cookie对象和Session对象项目实战和对比_第3张图片

查看客户端的Cookie信息:
Web基础之Cookie对象和Session对象项目实战和对比_第4张图片

关闭浏览器再次打开商品展示页面,直接进入购物车,查看购物车中的商品是否还在:
(即使关闭浏览器,购物车中的商品还在)
Web基础之Cookie对象和Session对象项目实战和对比_第5张图片




配置文件:


  MyCookieAndSession
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  
  
  
  login
  com.usc.servlet.LoginServlet
  
  
  login
  /login
  
  
   
  myblog
  com.usc.servlet.ShowBlogServlet
  
  
  myblog
  /blog
  
  
   
  addGoods
  com.usc.servlet.AddGoodsServlet
  
  
  addGoods
  /addGoods
  
  
  
  
  showGoods
  com.usc.servlet.ShowGoodsServlet
  
  
  showGoods
  /showGoods
  
  
  
  
  slogin
  com.usc.servlet.SLoginServlet
  
  
  slogin
  /sessionlogin
  
  
  
   
  sshow
  com.usc.servlet.SessionShowBlogServlet
  
  
  sshow
  /sessionblog
  


上面的购物车实例是基于Cookie实现的,我们也可以通过Session实现,实现思路差不多,这里不再赘述;基本思路如下:

Web基础之Cookie对象和Session对象项目实战和对比_第6张图片

五、Cookie和Session的对比:

总的来说:cookie机制采用的是在客户端保持状态的方案,session是一种服务器端保持的机制

存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

隐私策略的不同
Cookie存储在客户端阅读器中,对客户端是可见的,客户端一些程序可能会窥探、复制以至修正Cookie中的内容。
而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。
而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

有效期上的不同
使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。
由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。

服务器压力的不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。
而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。

浏览器支持的不同
Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。
假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。



六、总结
通过这段时间的学习,我们主要学习了两种会话保持技术,一种是客户端会话保持技术,即Cookie技术,另一种是服务器端会话保持技术,即Session技术;我们主要是掌握这两种技术的应用场景以及使用;然后了解两种技术的区别,根据业务场景来选择不同的会话保持技术;
学无止境!共勉!

你可能感兴趣的:(web基础)