由博客免登录问题重温cookie和session

本文首发于个人博客站,因没有上线,数据保存也不安全,就当在此做一个备份。

在昨天写博客的时候,发现了几个非常令人不适的问题:

1,长时间建立会话后,登陆信息会失效(昨天花很长时间写一篇博客,等提交时登陆信息竟然失效了)

2,客户端关闭后,登陆信息失效,需要重新登陆 对于自己的个人博客网站这样一个只有一个注册用户的网站来说,这显然是不合适的。于是决定重温会话技术,实现登陆一次,15天免登录的目的。

在实现用户登陆时,登陆Controller是这样实现的:

1 User user = userDao.findByUsername(username);
2         if(user!=null&&user.getPassword().equals(password)){
3             httpSession.setAttribute("user",user);
4             return "admin/index";
5         }else {
6             return "admin/login";
7         }

可见之前只是简单的使用发送session的方式实现登陆,这时就会有两个问题:

1,session是一个服务器端会话技术,默认session的存活时间是30min,过期服务器端的session源就会被删除。导致较长时间会话后自动断开问题。

2,session底层是基于cookie的,cookie默认的存活时间是仅限于一次一次会话,即关闭浏览器后,携带sessionid的cookie就失效,重启浏览器后请求无法发送正确是sessionid值,登陆失效。这两点就是导致开头两个问题的原因。

session工作原理简单图解:

基于以上分析我们可以在Controller层做以下修改:

 1 User user = userDao.findByUsername(username);
 2         if(user!=null&&user.getPassword().equals(password)){
 3             httpSession.setAttribute("user",user);
 4             httpSession.setMaxInactiveInterval(60*60*24*15);
 5             Cookie c=new Cookie("JSESSIONID",httpSession.getId());
 6             c.setMaxAge(60*60*24*15);
 7             response.addCookie(c);
 8             return "admin/index";
 9         }else {
10             return "admin/login";
11         }

即将客户端存储sessionid的cookie自定义,使键为"JSESSIONID",值为sessionid,并物理持久化。服务器端session有效时间设置为15day,客户端cookie持久化15day。这样就解决了免登录问题。

 

posted @ 2020-02-29 14:57  codeFlyer  阅读(169)  评论(0编辑  收藏  举报