首页 > 代码库 > 登陆状态持久化
登陆状态持久化
前几天,一直都想实现登陆持久化功能,于是到网上各种翻阅资料。最终总结实现登陆持久化无非那么几种方法。
1.将信息存入session
2.将信息存入cookie,(可以采用MD5加密)
3.拉长cookie的有效时间
第一种操作最简单,也很容易实现,但是有个缺点:就是它的持久化只是在一次会话里面,也就是说当你关掉页面重新开启页面的时候,发觉信息已经被清除干净了。这样做显然不合适,第二种是用户名和密码(经过加密后)存入cookie,每次对cookie的信息进行校验,实现持久化。这也不是很好的办法,毕竟把密码等重要信息存进cookie,也是不安全的。
我要讲的就是第三种方法,也是我觉得可行性最高的方法。
session(会话)有一个sessionid这样一个属性,用来标识每一个用户。而sessionid实际上还是存在cookie里面的。所以只要拉长sesiionid在cookie的存活时间就可以实现持久化了。
在struts2中访问session或者cookie有两种方法:
1.伪访问:实现SessionAware接口(获得session)
CookiesAware接口(获得cookie)
CookieProvider接口(写入cookie)
再者你如果要访问Cookie还得在struts2里面配置拦截器。
<interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="cookieProvider"></interceptor-ref><interceptor-ref name="cookie"> <param name="cookiesName">ValidationMsg</param> <param name="cookiesValue">*</param></interceptor-ref>
但是这种方法是无法获取sessionid,为什么呢?
因为它是伪访问,通过这种方法返回的是一个Map.什么是Map?就是值对,它是用这样方式去模拟HttpServletSession。
获取不到那怎么呢?
只能以耦合性为代价了,去使用HttpServletAPI.
我们只需要这样写:
HttpServletResponse response = ServletActionContext.getResponse();HttpServletRequest request =ServletActionContext.getRequest();HttpSession session =request.getSession();session.setAttribute("userName",user.getUserName());String sessionid = session.getId();Cookie cookie = new Cookie("JSESSIONID",sessionid);//注意key值必须和原来一样,否则服务器无法标识用户cookie.setMaxAge(1*1800); // 设置cookie的生命周期1800scookie.setPath("/");response.addCookie(cookie); //cookie添加完毕
这样就可以利用cookie的持久化,去实现关闭页面下次打开还可以自动登陆了。