1. 程式人生 > >cookie-session

cookie-session

cookie

可以用來記錄多個請求之間的聯絡,儲存伺服器的狀態

 

1. 建立Cookie

Cookie c = new Cookie("名字", "值"); // 建立cookie
c.setMaxAge(整數);      // 設定cookie的壽命,單位是秒,沒有設定壽命的是會話cookie瀏覽器關閉就刪除
c.setMaxAge(0);         // 設定壽命為0,意味著刪除此cookie
response.addCookie(c);  // 通過響應物件,把建立的cookie返回給瀏覽器

瀏覽器每次傳送請求時,就會根據域名進行檢查,把該域名下的所有cookie發給伺服器

 

2. 獲取cookie

Cookie[] cookies = request.getCookies(); // 獲取請求中所有的cookie

 

3. 中文編碼

URLEncoder.encode(中文, "utf-8");  // 將編碼後的中文存入cookie的值
URLDecoder.decode("編碼後的內容", "utf-8"); // 把編碼後的內容進行解碼

 

4. el表示式獲取cookie值

語法 : ${cookie.cookie的名稱.value}

 

5. cookie的限制

瀏覽器每個域名下能夠包含30~50個cookie
每個cookie的長度大約是4k左右

 

 

session 會話

session也是用來儲存多次請求之間的狀態資訊,session是把這些資訊存在伺服器的內容當中

1. session的建立

HttpSession session = request.getSession();  
// 首次呼叫getSession方法就是建立session物件
// 後續再呼叫getSession方法是獲取第一次建立好的session物件

1.1 存入內容
session.setAttribute("變數名", 任意資訊);
1.2 獲取內容
Obejct 資訊 = session.getAttribute("變數名");
1.3 刪除內容
Obejct 資訊 = session.removeAttribute("變數名");
1.4 讓session失效(會清空session中所有內容)
session.invalidate();

 

2. 典型應用-使用者登入/登出

2.1 建立一個jsp

<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    <input type="text" name="username" placeholder="請輸入使用者名稱">
    <input type="password" name="password" placeholder="請輸入密碼">
    <input type="submit" value="登入">
</form>
</body>
</html>

2.2 建立一個LoginServlet

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 獲取請求引數
        req.setCharacterEncoding("utf-8");
        Object username = req.getParameter("username");
        String password = req.getParameter("password");

        // 2. 執行使用者名稱密碼驗證
        if("zhangsan".equals(username) && "123".equals(password)) { // 正確
            // 3. 獲取session物件
            HttpSession session = req.getSession();
            // 4. 儲存登入標記
            session.setAttribute("isLogin", true);
            session.setAttribute("username", username);
            // 5. 跳轉到歡迎頁面
            req.getRequestDispatcher("welcome.jsp").forward(req,resp);
        } else { // 錯誤
            req.getRequestDispatcher("login.jsp").forward(req,resp); // 跳回登入頁面
        }
    }
}

2.3 建立一個LogoutServlet

@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate();
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }
}

 

3. jsp頁面獲取session中的變數

session 必須針對同一個瀏覽器,才能實現在請求儲存資訊,在之後的請求獲取資訊的效果

 

4. session實現的原理

session 必須針對同一個瀏覽器,才能實現在請求儲存資訊,在之後的請求獲取資訊的效果

每個使用者訪問伺服器時,伺服器會為他們建立一個獨立的session

1) 首次建立session時,tomcat會產生一個名為`JSESSIONID=session的唯一標識` 的特殊cookie
   這個`JSESSIONID=1`就會隨著響應返回給瀏覽器   
2) 瀏覽器會記錄這個cookie。之後的所有請求會把此cookie傳送給伺服器。
   伺服器根據cookie的值找到對應的session
3) jsessionid 這個cookie屬於會話cookie,瀏覽器關閉就會消失

 

session和cookie的區別
1. session是將資訊儲存於伺服器端,cookie是將資訊儲存於瀏覽器端
2. session與cookie相比,更為安全
3. session的生命週期相對較短, 
    兩次請求間隔超過30分鐘,伺服器會銷燬session
    呼叫session.invalidate方法時,會立刻銷燬
   cookie 
    會話cookie是瀏覽器關閉就銷燬
    setMaxAge的cookie會根據設定的壽命存活一段時間
4. 儲存的資訊量上
    cookie 每個最大大小是4k左右
    session 理論上沒有限制,但session要佔用伺服器記憶體,所以不太適合儲存太多的內容
    資訊要永久儲存,還是需要使用資料庫
5. cookie裡資料都得是字串,而session裡可以儲存任意型別

 

重定向

請求轉發:
 request.getRequestDispatcher("目錄路徑").forward(request,response);
 
請求重定向:
 response.sendRedirect("目錄路徑");
 

 重定向與轉發的區別:
    1. 請求轉發時,位址列不會改變(是第一個servlet的地址)
        重定向,位址列會發生變化(是最後一個servlet的地址)
    2. 請求轉發時一次請求,跳轉發生在伺服器內部
        重定向是兩次請求,第一次請求會返回302的狀態碼和目標地址,
        瀏覽器根據目標地址傳送第二次請求,才完成整個流程
    3. 重定向是兩次請求,所以不能利用request作用域存值取值
        但可以使用session作用域來存值取值       
        請求轉發因為是同一次請求,所以可以使用request作用域存值取值
    4. 請求轉發的目標只能是本專案的servlet或jsp
        重定向跳轉的目標可以是任意的

一般來說
1. 查詢資料庫,多為轉發          
   或者關係密切的跳轉使用請求轉發 forward()
    servlet  -->  jsp  
2. 刪除,多為重定向
    關係不密切的跳轉使用重定向 redirect()
     servlet --> 查詢列表servlet