之前我們介紹的cookie是把用戶的身份信息存在了客戶端,而session說白了就是把用戶的信息保存在了服務端。由於session是保存在了服務端,所以當用戶關閉瀏覽器時session並不會消失。一般session保存在服務器的內存中當然也可以持久化到硬盤或者數據庫中。session的默認過期時間是30分鍾,過期的session會被服務器自動的銷毀。注意如果大量的創建session可能導致服務器的內存溢出。
一、session的創建流程
當客戶端瀏覽器訪問服務器時,服務器會先檢查該請求是否攜帶一個叫JESESSIONID的cookie,如果存在會根據JESESSIONID的cookie值獲取存放在服務器端的session值;如果不存在會新建一個session然后把sessionId寫到cookei中返回給瀏覽器,下次瀏覽器訪問時就會攜帶這個cookie。
圖片的來源地址:http://blog.tommyyang.cn/img/session/processofsession.png
在javaweb開發中我們使用HttpServlet對象獲取session,session也是一個域對象可以通過setAttribute方法和getAttribute方法獲取存儲在session中的值。代碼如下:
public class TestSessionServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); response.setCharacterEncoding("utf-8"); response.setHeader("content-type","text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); String loginName = (String) session.getAttribute("loginName"); String sessionId = session.getId(); if(StringUtils.isEmpty(loginName)){ session.setAttribute("loginName","張三"); writer.println("session中沒有值!"); }else{ writer.println("loginName="+loginName); } writer.println("sessionId="+sessionId); writer.close(); } }
用戶第一次訪問時:
服務端沒有session會在給瀏覽器響應時添加一個cookie,當用戶第二次訪問時:
會攜帶這個cookie。當瀏覽器被禁用cookie后服務器端可以通過重寫URL地址實現sessionId的傳遞。在java中我們使用HttpServletResponse對象的encodeURL(java.lang.String url)方法和encodeRedirectURL(java.lang.String url)方法實現URL的重寫,其中前者是對表單action和超鏈接的url地址進行重寫,后者是對重定向后的地址進行重寫。
二、session的銷毀
session默認的過期時間是30分鍾,當然這個過期時間也可以我們自己來修改但是我們一般不會修改session的過期時間而是手動讓session失效只需要調用HttpSession對象的invalidate方法即可。