JavaWeb開發03——會話管理

會話管理


一.會話技術概念

會話技術:瀏覽器開始訪問網站到訪問網站結束期間產生的屢次請求響應組合在一塊兒叫作一次會話。會話的過程當中會產生會話相關的數據,咱們須要將這些數據保存起來。保存的技術大抵分爲兩種:Cookie(客戶端技術)和Session(服務器端技術)。html

二.Cookie和Session概念

Cookie:Cookie是客戶端技術,程序把每一個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去。這樣,web資源處理的就是用戶各自的數據了。java

image

Session:Session是服務器端技術。利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個其獨享的session對象。因爲session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時,能夠把各自的數據放在各自的session中。當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。web

image

三.Cookie(name+value)
1.獲取全部的Cookie並組成組(名字+值):
request.getCookies();
2.添加Cookie(名字+值):
response.addCookie(Cookie c);
3.Cookie的構造(造的時候就須要設定好cookie的名字和值):
new  Cookie(String name,String value)
4.獲取Cookie名稱:
getName();
5.獲取Cookie的值:
getValue();
6.設置Cookie的值:
setValue
7.設置Cookie的最大留存時間和獲取Cookie的留存時間:
setMaxAge與getMaxAge
8.通知瀏覽器在訪問服務器中的哪一個路徑及其子路徑時會獲取當前cookie
setPath與getPath
9.通知瀏覽器在訪問哪一個域名的時候帶着當前的cookie信息(通常不使用)
setDomain與getDomain
實例:顯示用戶上次訪問的時間
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
      
        //解決中文亂碼
        response.setContentType("text/html;charset=utf-8");
        //獲取全部的Cookie並組成組(名字+值)
        Cookie []  cs = request.getCookies();
        Cookie findC = null;
        if(cs!=null){
            for(Cookie c : cs){
        //獲取Cookie名稱
                if("lastTime".equals(c.getName())){
                    findC = c;
                } 
            }
        }
        if(findC == null){
            response.getWriter().write("您是第一次訪問本網站!");
        }else{
        //獲取Cookie的值
            Long lastTime = Long.parseLong(findC.getValue());
            response.getWriter().write("您上次訪問時間是:"+new Date(lastTime).toLocaleString());
        }
        
        Date date = new Date();
        //構造Cookie(名字+值)
        Cookie c = new Cookie("lastTime",date.getTime()+"");
        //設置Cookie留存的最大時間
        c.setMaxAge(3600*24*30);
        //設置會設置Cookie的訪問路徑
        c.setPath(request.getContextPath());
        //c.setDomain(".baidu.com");
        //添加
        response.addCookie(c);
    }
Tips:

1.一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。瀏覽器

2.刪除cookie時,path必須一致,不然不會刪除(瀏覽器經過cookie的name+path來標識一個cookie).安全

3.若是建立了一個cookie,並將他發送到瀏覽器,默認狀況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器以後即被刪除。若但願瀏覽器將該cookie存儲在磁盤上,則須要使用maxAge,並給出一個以秒爲單位的時間。服務器

四.Session(name+value)
1.做用範圍和保留時間

做用範圍:當前會話
保留時間:Session不會由於瀏覽器關閉而立刻銷燬,會保留一段時間cookie

2.Session和Sessionid

瀏覽器第一次向客戶端發送請求時,服務器會自動生成一個Session和sessionid,sessionid惟一標識這個sessionsession

3.Session的原理

1)request.getSession()方法會檢查請求中有沒有Jsession的 cookie,若是有拿出他的值找到對應的session爲他服務.網站

2)若是沒有則檢查請求的URL後有沒有以參數的形式帶着Jsession過來,若是有則找到對應的Session爲瀏覽器服務。url

3)若是還找不到則認爲這個瀏覽器沒有對應的Session,建立一個Session而後再在響應中添加JSESSIONID cookie,這個Jsessionid的值就是這個Session 的id。

4)默認狀況下,Jsession 的path爲當前web應用的名稱,而且沒有設置過MaxAge,是一個會話級別的cookie。

這意味着一旦關閉瀏覽器再新開瀏覽器時,因爲Jsessionid丟失,會找不到以前的Session。

咱們能夠手動的發送Jsessionid cookie,名字和path設置的和自動發送時同樣,可是設置一下MaxAge,使瀏覽器除了在內存中保存Jsessionid信息之外還在臨時文件夾中以文件的形式保存,這樣即便重開瀏覽器仍然可使用以前的Session

image

3.建立Session的id
request.getSession()
HttpSession session = request.getSession()
4.儲存Session的值
session.setAttribute("name", "zhang");
5.獲取Session的值
session.getAttribute("xxx")
6.獲取Session的id
session.getid
7.URL重寫(瀏覽器禁用Cookie後的解決方法)
response. encodeRedirectURL(java.lang.String url)··· 若是有重定向,就用這個方法
response. encodeURL(java.lang.String url)
Tip:

url重寫的方法一旦發現瀏覽器帶回了任意cookie信息,則認爲客戶端沒有禁用cookie,就不會再進行重寫操做

實例1:關掉瀏覽器,重開,原來的Session還在

Session的id是名爲Jsessionid的Cookie保存的,默認爲會話級Cookie,因此咱們能夠本身來創造名爲Jsessionid的Cookie,而後設置Maxage來使它能夠在瀏覽器被關掉後還能夠存在,最後,關掉瀏覽器,而後重開,getSession方法會找到咱們設置了Maxage的Jsessionid的id,從而找到對應的Session來完成操做。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        String prod = request.getParameter("prod");
        prod = new String(prod.getBytes("iso8859-1"),"utf-8");
        
        HttpSession session = request.getSession();
        Cookie jc = new Cookie("JSESSIONID",session.getId());
        jc.setPath(request.getContextPath());
        jc.setMaxAge(1800);
        response.addCookie(jc);
        
        session.setAttribute("prod", prod);
        
    }
實例2:當Session和Cookie被禁用時如何使用Session(服務器建立了Session但瀏覽器中沒法保存)

客戶點擊商品,造成的URl中帶prod和Session,而後,在BuyServlet中,經過getSession方法,獲取URL中的Session的id,而後將prod的值賦給Session,最後,PayServlet經過getSession方法獲取URL的Session的id,取出對應Session中的prod,完成操做。

BuyServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        String prod = request.getParameter("prod");
        prod = new String(prod.getBytes("iso8859-1"),"utf-8");
        
        HttpSession session = request.getSession();
        session.setAttribute("prod", prod);
        
    }

PayServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession();
        String prod = (String) session.getAttribute("prod");
        response.getWriter().write("您購買的是"+prod+"價值99999999999元");
    }
    
JSP頁面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  <%
      //URL重寫
      request.getSession();
  
      String url1 = request.getContextPath()+"/servlet/BuyServlet?prod=電視機";
      url1 = response.encodeURL(url1);
      String url2 = request.getContextPath()+"/servlet/BuyServlet?prod=冰箱";
      url2 = response.encodeURL(url2);
      String url3 = request.getContextPath()+"/servlet/PayServlet";
      url3 = response.encodeURL(url3);
   %>
      <a href="<%= url1 %>">電視機</a>
      <a href="<%= url2 %>">冰箱</a>
      <a href="<%= url3 %>">結帳</a>
  </body>
</html>
五.Session和Cookie的對比

Cookie:
1)cookie是客戶端技術
2)數據保存在客戶端,這個信息能夠保存很長時間
3)數據隨時有可能被清空,因此cookie保存的數據是不太靠譜的
4)數據被保存在了客戶端,隨時有可能被人看走,可能有安全問題

Session:1)session是服務器端技術2)數據保存在服務區端,相對來講比較穩定和安全3)佔用服務器內存,因此通常存活的時間不會太長,超過超時時間就會被銷燬.咱們要根據服務器的壓力和session 的使用狀況合理設置session的超時時間,既能保證session的存活時間夠用,同時不用的session能夠及時銷燬減小對服務器內存的佔用.

相關文章
相關標籤/搜索