Cookie和Session(实现自动登录)
- Cookie
定义:服务器发送给客户端并存储在客户端的一份数据(有大小限制和时间限制)。
分类:会话cookie和持久cookie。会话cookie关闭浏览器则消失,持久cookie在指定的时间后消失,默认时间存储7天,可以通过setMaxAge(60 * 60* 24 * 7)设置时间,其中的单位是秒。
使用cookie的原因:因为http请求是无状态,即服务器不会保存客户端前一次请求的信息,但有时候项目中有这样的需求,需要后一次请求的时候将客户端前一次请求的某些信息传送给服务器,这个时候就需要使用cookie保存前一次的数据。
应用场景:自动登录,购物网站浏览记录,购物车等。
常用方法:
1.Cookie cookie = new Cookie(“username”, “admin”);//创建
response.addCookie(cookie);//添加
2.Cookie[] cookies = request.getCookies();//获取发送给客户端的cookie,结果是数组
3.cookie.setMaxAge(60 * 60 * 24 * 7);//设置有效期
4.cookie.setDomain(".roriring.com");//设置指定的域名下有效,少用
5.cookie.setPath("/CookieDemo");//设置在域名包含指定的子域名有效
6.cookie.setMaxAge(0); //清空cookie
- Session
定义:存放在服务器的内存中的一份数据,基于cookie的一种技术。
创建session:request.getSession();
销毁session:1.关闭服务器;2.回话超时(默认30分钟);3.session.invalidate();
常用方法:
1.setAttribute() 存数据
2.getAttribute() 取数据
3.removeAttribute() 移除数据
4.getSessionId() 获取会话id
应用场景:基本上每个系统都会用到session,一般会在过滤器中判断是否存在session,有则放行跳转到目的路径请求数据,没有则返回登录页面;还有一个场景就是配合cookie实现自动登录。下面通过案例实现自动登录功能:
-
案例
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest request = (HttpServletRequest) req; //先判断,现在session中还有没有那个userBean. UserBean userBean = (UserBean) request.getSession().getAttribute("userBean"); if(userBean != null){//session中农存在用户信息,session有效 chain.doFilter(request, response); }else{//session失效 //1. 来请求的时候,先从请求里面取出cookie , 但是cookie有很多的key-value Cookie[] cookies = request.getCookies(); //2. 从一堆的cookie里面找出我们以前给浏览器发的那个cookie Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");//自动登录checkbox值 if(cookie == null){//第一次请求,暂时没有cookie chain.doFilter(request, response); }else{//不是第一请求。 String value = cookie.getValue(); String username = value.split(",")[0]; String password = value.split(",")[1]; //完成登录 UserBean user = new UserBean(); user.setUsername(username); user.setPassword(password); UserDao dao = new UserDaoImpl(); userBean = dao.login(user); //使用session存这个值到域中,方便下一次未过期前还可以用。 request.getSession().setAttribute("userBean", userBean); chain.doFilter(request, response); } } } catch (Exception e) { e.printStackTrace(); chain.doFilter(req, response); } }
本案例只实现了servlet部分,service层和dao层代码没有提供,其实就是在用户表中查询用户信息,希望堵着能够理解,理解这种思想就是收获
上一篇: 第12讲——对象和类