Session学习小结

前言:java

1.咱们在学习一项技术的时候,首先应该是何时会用到这项技术。此次学习session也是如此,通常的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户每每是存在于session中的。web

  说到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返回的。cookie

  上图中截图的部分就是浏览器发送给服务器的一个简单的sessionId的cookie。session

2.随着时代的发展,session出现了,大有取代cookie的形势,可是常规的session仍是依赖cookie的存储的,存储的是session的Id值,如上面的截图中的JSESSIONID。app

 下面咱们来讲说session这个玩意。jsp

    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();
相关文章
相关标签/搜索