那么有了cookie,为什么还要有session呢?
cookie是存在于客户端的,将用户详细信息通过网络发送到客户端保存是极不安全的;
cookie大小不能超过4k,限制cookie不能满足存储用户信息的需求。
2.Session会话机制
2.1.Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上
2.2.存在服务器的一种用来存放用户数据的类ConcurrentHashMap结构
2.3.Session的实现方式和Cookie有一定关系
2.3.1.建立一个连接就生成一个session id,打开几个页面就好几个了,这里就用到了Cookie,
2.3.2.把session id存在Cookie中,每次访问的时候将Session id带过去就可以识别了.
2.3.3.即使cookie被禁用,session仍然可以通过URL重定向方式获取存储数据
2.3.4.如果禁用了cookie而又不采用url重写的话,session是无法保持的
2.4.Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象
session实现原理:
1.服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机
2.只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去
3.服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务
session应用代码示例:
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//将数据存储到session中
session.setAttribute("data", "张三");
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
}
//手工调用session.invalidate方法,摧毁session
session.invalidate();
当session创建成功后,之所以能获取到sessionId = session.getId(),是因为request.getSession()方法中封装了一个方法,示例如下:
//获取session的Id
String sessionId = session.getId();
//将session的Id存储到名字为JSESSIONID的cookie中
Cookie cookie = new Cookie("JSESSIONID", sessionId);
//设置cookie的有效路径
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
2.5.由于Cookie与Session实现手段不同,因此也各有优缺点和各自的应用场景:
1. 应用场景:
(1)Cookie:用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能
(2)Session:用户登录某网站之后,将其登录信息放入session,以后每次请求中查询相应的登录信息以确保该用户合法(购物车等经典场景)
2. 安全性:
(1)Cookie:将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差
(2)Session:安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,总体来讲,session的安全性要高于cookie
3.性能:
(1)Cookie:存储在客户端,消耗的是客户端的I/O和内存,很好地分散了资源消耗
(2)Session:存储在服务端,消耗的是服务端的资源,对服务器造成的压力比较集中
(3)cookie是要优于session的
3. 时效性:
(1)Cookie:可以通过设置有效期使其较长时间内存在于客户端
(2)Session:一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时,默认30分钟)
4.其他:
(1)Cookie:开发中没有session方便,而且cookie在客户端是有数量和大小的限制的
(2)Session;大小只以硬件为限制,能存储的数据无疑大了太多