会话技术Cookie和Session

会话技术是什么?它是由一个问题而引出的技术,例如现在购物网站添加商品都是添加到购物车中,用户选择的商品信息需要存储起来,这些添加到购物车的商品都需要传到服务器上,但是这时因为Http协议是无状态的,也就是说每个客服端访问服务器资源的时候,服务器并不知道该客户端是谁?所以由此引出了会话技术来识别客户端的状态。即会话技术是帮助服务器记住客户端状态,区分不同的客户端。

会话技术中的会话两字是指,从打开一个浏览器访问某个站点,到关闭整个浏览器的过程。会话技术分为两种:Cookie和Session。

Cookie是将数据存储在客户端本地,减少服务器的压力,但是它的安全性不好,客户端可以自己清楚Cookie。Session是将数据存储到服务器上,安全性相对较好,但是会增大服务器的压力。

  • Cookie

创建Cookie的方式方式有两种通过response.addCookie()和response.addHeader()两种方式。两者的原理都是通过设置Response的响应头来实现。

会话技术Cookie和Session_第1张图片

客户端会在请求头携带Cookie信息,传递给服务器,服务器只需要解析请求头就可以获取到其中的Cookie。

会话技术Cookie和Session_第2张图片

Cookie的存在也是存在一个时效,如果不设置Cookie的持久化时间,会保存到浏览器的内存中,如果浏览器关闭了,Cookie就回销毁,如果设置了持续化时间,就会保存到浏览器磁盘目录中。在一定的场景下需要设置Cookie的时间,从而实现我们的特定需要,设置的方式是通过setMaxAge(int expiry)来实现,参数的单位是秒。下图就是设置一个持久时间为1分钟。

Cookie的信息并不是任何路由都可以访问,比如你的网站保存的Cookie,别人的网站不应该获取到,不然就会造成很大的麻烦,所以在Cookie中可以设置一个携带的路径,来指定什么位置才能访问到Cookie中的内容,如果是其他的地方就不会获取到Cookie。

删除Cookie时需要注意一个问题,如果被删除的Cookie有指定的位置,那么此时也应该设置Path,否则会重新创建一个空Value的Cookie。

会话技术Cookie和Session_第3张图片

下面一个小案例用Cookie实现获取上次登录时间。

会话技术Cookie和Session_第4张图片

  • Session

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一个内存区域存储数据,但是客户端每次都需要携带一个标识的ID去服务器中寻找属于自己的内容空间。所以需要借助Cookie来存储这个ID,所以说Session技术要借助于Cookie技术来实现。

会话技术Cookie和Session_第5张图片

Session存放在服务器端的时候,是以一个Map集合前天一个Map集合,m每个客户端不同,所以每个客户端对应的内层Map集合也是不同的。

Session的存在也是存在一定的生命周期中,在第一次通过request.getAttrbiute()时创建Session。销毁的时候是在服务器关闭或者Session过期的时候销毁,Session的持续时间是可以在Web.xml中进行配置。

对于Session有一个误区。浏览器关闭了,Session就销毁了的这一说法就是错误的,Session的存在是与浏览器无关的,只是浏览器用Cookie保存了Session的ID,关闭浏览器,Cookie的ID不存在了,所以服务器无法识别对应的Session。

另外Session可以通过invalidate()方法进行销毁。

Session的实现其实也很简单,可以自己实现一个简单版本的Session。首先创建一个Session类。

public class MySession {
	private Map map = new HashMap();
	private String id;
	public MySession(String id){
		this.id=id;
	}
	public String getId(){
		return this.id;
	}
	public void setAttribute(String name,Object value){
		map.put(name, value);
	}
	public Object getAttribute(String name){
		return map.get(name);
	}
	public void removeAttribute(String name){
		map.remove(name);
	}
}

第二部创建一个SessionUtil来操作Session即可。

public class SessionUtil {
	private static Map map = new HashMap();
	public static MySession getSession(HttpServletRequest request,HttpServletResponse response){
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for(Cookie cookie:cookies){
				if(cookie.getName().equals("JSESSIONID")){
					MySession session = map.get(cookie.getValue());
					if(session!=null)
						return session;
				}
			}
		}
		MySession mySession =new MySession(UUID.randomUUID().toString());
		map.put(mySession.getId(), mySession);
		
		Cookie cookie = new Cookie("JSESSIONID",mySession.getId());
		response.addCookie(cookie);
		return mySession;
	}
}

 

你可能感兴趣的:(Java,Web,cookie,session)