先贴两篇好帖子
https://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html
https://www.cnblogs.com/woshimrf/p/5317776.html
http://blog.csdn.net/lingadobe/article/details/53193008
看完这两篇基本就基本明白了Session和Cookie的关系,这里再做个归纳。
1.Session的创建来自于java程序中request.getSession(),如果没写这句话,则ResponseHeader中不会有setCookie,自然客户端也没有名为JSESSIONID的Cookie。
所以没有调用getSession方法则不会创建session。
Session的销毁只有两种情况:
第一:session调用了 session.invalidate()方法。 (程序主动退出)
第二:前后两次请求超出了session指定的生命周期时间。 (关闭网页、断点时,需要SessionListener来监听session失效,执行某些操作如获取用户退出时间等,可以在web.xml中修改session过期时间)
那为什么浏览器关闭后再次访问网页会获得不同的sessionid呢?这样如何保存登录信息?sessionid到底有什么用?
关闭浏览器后,session并未销毁,但会话cookie是会消失的,那么存储JSESSIONID的cookie也没有了,自然request.getSession()会重新生成一个session,如果想连接到原来的session可以这样
//在servletA中设置cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("name", "张三");
out.println("创建一个session并放入姓名属性");
//手动添加cookie,保存JSESSIONID信息
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);//设置cookie的生命周期为30min
response.addCookie(cookie);
}
//在servletB中就可以正常访问session了
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String name = (String) httpSession.getAttribute("name");
out.println("name = "+name);
}
只要我们手动为cookie中添加JSESSIONID信息,那么不管你的浏览器是否关闭,我的cookie中都会携带JSESSION信息,这样的话,服务器就一定能够找到对应的session,而不会重新建立一个新的session,这样只要session没有消亡,就一定可以访问到对应的session。
sessionid只是用来确定是不是同一个session,在分布式系统中,将session存于redis中,每次会话客户端带cookie JSESSIONID=742C04200E64E469351A41C74608E6AA, 然后系统去redis中取这个session,就可以session.getAttribute("user"),获取session域上存储的值。
2.requset.getSession()其实默认为request.getSession(true),如果requestHeader中有sessionId,则直接取来用;没有则新增。可以用session.isNew()来判断是否为新建
3.session默认是存在服务器内存中,也可以用数据库redis等进行存储管理。
4.Cookie c = new Cookie(name,value);cookie肯定会有键值,还有路径等属性。可以通过response.addCookie(c)来给客户端发送自定义cookie。
5.session可以用来做简单的用户登录验证,进入网站时先判断是否登录
if(request.getSession.getAttribute("user")==null)
如果没有登录则要求登录,登录是判断用户名密码是否正确,正确则
request.getSession().setAttribute("user",user);
注销 request.getSession.removeAttribute("user");
6.session做登录验证有个缺点,关闭浏览器后getSession又会重新生成一个新的session,导致原来的信息缺失,这时候就可以用cookie来替代session。
判断登录: request.getCookies()判断有没有cookie.getName=="user",有则cookie.getValue获得用户id
登录成功:
Cookie c= new Cookie("user",user.getId()); // 一般cookie中只存不敏感信息,因为不安全
c.setMaxAge(1800);
c.setPath("/");
response.addCookie(c);
注销:request.getCookies() 找到 cookie.getName=="user" , c.setMaxAge(0);