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();
相關文章
相關標籤/搜索