lines-of-code.jpg

[JSP/Servlet][讀書筆記]會話管理-隱藏欄位(Hidden Field) 這篇提到會話管理的觀念後,
我們接下來看看如何用Cookie的方式來達成會話管理的需求

首先我們寫一支Servlet來處理首頁的呈現方式,如下所示:

@WebServlet(name = "IndexServlet", urlPatterns = {"/index.do"})
public class IndexServlet extends HttpServlet {

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    
    Cookie[] cookies = request.getCookies();
    if(cookies != null) {
      for(Cookie cookie : cookies) {
        String name = cookie.getName();
        String value = cookie.getValue();
        if("user".equals(name) && "allen0818".equals(value)) {
          request.setAttribute(name, value);
          request.getRequestDispatcher("/user.view").forward(request, response);
          return;
        }
      }
    }
    
    response.sendRedirect("login.html");
  }
  
  --- 下略 ---  
}

這邊主要作的事情是從Cookied中去找找看有無名為user且值為allen0818的cookie
如果有就直接導向到使用者頁面,如果沒有則導向到登入頁面讓使用者重新登入

接著,我們設計一個簡單的表單login.html如下:

<html>
    <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登入網頁</title>
</head>
    <body>
        <form action="login.do" method="post">
            名稱:<input type="text" name="user"><br>
            密碼:<input type="password" name="passwd"><br>
            自動登入:<input type="checkbox" name="login" value="auto"><br>
            <input type="submit" value="送出">
        </form>
    </body>
</html>

提供了可供使用者填寫帳號密碼及是否允許自動登入的選項的功能


最後我們再寫一支Servlet來處理使用者按下送出按鈕後的驗證功能,程式內容:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    
    String user = request.getParameter("user");
    String passwd = request.getParameter("passwd");
    
    if("allen0818".equals(user) && "123456".equals(passwd)) {
      String login = request.getParameter("login");
      if("auto".equals(login)) {
        Cookie cookie = new Cookie("user", "allen0818");
        cookie.setMaxAge(7 * 24 * 60 * 60); //seconds
        response.addCookie(cookie);
      }
      request.setAttribute("user", user);
      request.getRequestDispatcher("user.view").forward(request, response);
    } else {
      response.sendRedirect("login.html");
    }
  }

這邊可以看到,如果使用者允許自動登入功能的話,程式會幫他建立一個cookie
並透過 response.addCookie(cookie); 的方式回傳給瀏覽器,讓瀏覽器來建立cookie

 

     Cookie cookie = new Cookie("user", "allen0818");
     cookie.setMaxAge(7 * 24 * 60 * 60); //seconds
     response.addCookie(cookie);

 

如此一來就能做到使用者自動登入的需求囉,
跟使用隱藏欄位來暫存資訊一樣,只是這次我們將資訊存到了cookie中
不但不會有被直接透過原始碼得知資訊內容的風險,我們還可以透過setMaxAge()來設定
cookie的存活時間(單位:秒),所以不會因為使用者關閉頁面或瀏覽器就失效了

參考資料:
1. 「Servlet&JSP教學手冊 第二版」

arrow
arrow
    文章標籤
    JSP Servlet Cookie
    全站熱搜

    allen0818 發表在 痞客邦 留言(0) 人氣()