1. 程式人生 > >JavaEE_day35:Servlet-cookie-session

JavaEE_day35:Servlet-cookie-session

http協議的特點:稱之為無狀態, 請求與請求之間不會記錄狀態(狀態就包括請求引數等資訊)

1. Cookie

本意是小甜點, 可以用來記錄多個請求之間的聯絡,儲存伺服器的狀態

實現一個記住使用者名稱的功能

1.1 建立Cookie

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

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

1.2 獲取cookie

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

1.3 中文問題

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

1.4 el表示式獲取cookie值

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

1.5 cookie的限制

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

2.session 會話

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

2.1 session建立

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

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

2.2 典型應用-使用者登入

使用者登陸介面:

        16行

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ankouchen</title>
</head>
<body>

<form action="/login" method="post">

    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="提交">
</form>
</body>
</html>

伺服器獲取引數,如果獲取的使用者名稱和密碼和管理員username和密碼一致,則跳轉到歡迎介面,否則又回到登陸介面:

        27行

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");

//        1獲取請求引數
        Object username = req.getParameter("username");
        Object password = req.getParameter("password");

//        2驗證使用者名稱和密碼
        if ("zhangsan".equals(username) && "1234".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);
        }
    }
}

歡迎介面:

        10行

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ankouchen</title>
</head>
<body>
歡迎來到王者榮耀!
</body>
</html>

新增產品介面:

        16行

@WebServlet(urlPatterns = "/productAdd")
public class ProductAdd extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        獲取LoginServlet物件裡邊的Session物件的值
        HttpSession session = req.getSession();

        if(session.getAttribute("isLogin")==null){
            req.getRequestDispatcher("login.jsp").forward(req, resp);
            return;
        }
        System.out.println("新增商品成功!");
    }
}

刪除商品介面:

        13行

@WebServlet(urlPatterns = "/productDelete")
public class ProductDelete extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        if(session.getAttribute("isLogin")==null){
            req.getRequestDispatcher("login.jsp").forward(req, resp);
            return;
        }
        System.out.println("刪除商品成功!");
    }
}

2.3 典型應用-使用者登出(安全退出)

2.4 jsp頁面獲取session中的變數

${sessionScope.變數名}

2.5 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裡可以儲存任意型別

3. 重定向請求

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

請求重定向: response.sendRedirect("目錄路徑");

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

查詢 servlet --> jsp // 關係密切的跳轉使用請求轉發 forward() 刪除 刪除servlet --> 查詢列表servlet // 關係不密切的跳轉使用重定向 redirect()