前言:
1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术。这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中的。
说到session就不得不提cookie了,个人对互联网的发展不是很了解,只是简单的知道早期的网站都是使用cookie进行用户管理的。
cookie是什么呢?我们先简单的了解下。
javax.servlet.http.Cookie是servlet自带的类,所以jsp页面可以调用。下面简单的介绍下cookie的使用
Cookie cookie = new Cookie("name", "dawa"); //设置域名 cookie.setDomain(".google.com"); //设置cookie的访问路径 cookie.setPath("/server"); //设置cookie有效时间 cookie.setMaxAge(1800); //设置cookie是否只能由安全的协议访问如https cookie.setSecure(true);
cookie类似于工作证,浏览器每次访问web项目时,会发送对应的cookie,而发送的cookie是之前response返回的。
上图中截图的部分就是浏览器发送给服务器的一个简单的sessionId的cookie。
2.随着时代的发展,session出现了,大有取代cookie的形势,但是常规的session还是依赖cookie的存储的,存储的是session的Id值,如上面的截图中的JSESSIONID。
下面我们来说说session这个玩意。
Web项目中我们一般把用户保存在session中,为什么这样使用呢?
因为我们在Web获取session时一般简单的通过request.getSession()的方式来获取session,用户的请求与session有了直接的关联,而用户的信息放在session中就形成一对一的关系。
之前我曾简单的考虑过一个问题,我们一般在登陆的时候通过request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser)这样的方式来讲user存放到session中取得,此处不禁想到,
多个用户登陆设置session的时候,key不都是一样的么,那么session是如何区分的呢?
这里就要说到之前截图里的JSESSIONID,在用户登陆之后,服务器会将session的Id以cookie的方式保存到response中返回给浏览器,浏览器再次发起请求的时候就会带上之前返回的cookie,
服务器在request.getSession()会根据cookie里的sessiondId获取对应的session,所以是不会造成混乱的。
说到这里,我们大致了解了一些session的知识。
实际项目中对于session的操作一般用户login和sessionFilter中,下面贴上login和sessionFiler的简单代码:
LoginController部分代码:
1 @RequestMapping("/login.do") 2 public String loginHandler(HttpServletRequest request, HttpServletResponse response, ModelMap model){ 3 String action = request.getParameter("action"); 4 if("do".equals(action)){ 5 String workno = request.getParameter("account"); 6 String password = request.getParameter("password")==null ? "":request.getParameter("password"); 7 if(!"".equals(workno) && !"".equals(password)){ 8 Map<String, Object> param = new HashMap<String, Object>(); 9 param.put("name", workno); 10 param.put("password", password); 11 User user = userService.get(param); 12 if(user != null){ 13 SessionUser sessionUser = new SessionUser(); 14 sessionUser.setWorkno(user.getId()); 15 sessionUser.setNickName(user.getName()); 16 System.out.println("设置session"); 17 request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser);
//此处演示下cookie的使用 18 Cookie cookie = new Cookie("name","dawa"); 19 response.addCookie(cookie); 20 return "redirect:home.do"; 21 22 } else { 23 model.put("errMsg", "用户名或者密码错误"); 24 return "login"; 25 } 26 } else { 27 model.put("errMsg", "用户名或者密码不能为空"); 28 return "login"; 29 } 30 } 31 return "login"; 32 }
SessionFiler部分代码:
1 public void doFilter(ServletRequest request, ServletResponse response, 2 FilterChain chain) throws IOException, ServletException { 3 HttpServletRequest hsrq = (HttpServletRequest) request; 4 HttpServletResponse hsrp = (HttpServletResponse) response; 5 6 SessionUser person = null; 7 String reqPage = hsrq.getServletPath().trim(); 8 if (!reqPage.equals("/login.do") && !reqPage.equals("/login_out.do")) { 9 System.out.println("sesion拦截"); 10 person = (SessionUser) hsrq.getSession().getAttribute(Constants.SESSION_USER_KEY); 11 if (person == null) { 12 hsrp.sendRedirect("login.do"); 13 return; 14 } 15 } 16 chain.doFilter(request, response); 17 }
代码都比较简单,没什么可说的,最后补充下session的过期时间和失效方法:
Web项目的session过期时间一般设置在web.xml中
<!-- 默认的session超时时间 ,单位为分钟--> <session-config> <session-timeout>30</session-timeout> </session-config>
而session的失效要调用invalidate()才能使session销毁,也只有这样才能触发HttpSessionListener的sessionDestroyed的方法,关闭浏览器只是断开了session,断开的session会在session过期后销毁。
request.getSession().invalidate();