1. 程式人生 > >cookie session 和登入驗證

cookie session 和登入驗證

cookie、session 簡單理解

cookie 和 session 的目的是追蹤使用者會話,標識使用者,讓伺服器知道是誰在訪問網站.

cookie 是儲存在客戶端的使用者資訊,在瀏覽器首次訪問伺服器時由伺服器建立併發給客戶端。瀏覽器收到cookie後會根據cookie時效,選擇將cookie內容儲存在記憶體或硬碟。當瀏覽器再次訪問伺服器是會在請求中攜帶cookie。

session 是儲存在服務端的使用者資訊,伺服器為每個會話建立一個session,session裡面可以儲存使用者資訊,session是通過以cookie的方式傳送session ID 給客戶端作為標識。來識別使用者。而瀏覽器每次訪問都會攜帶session ID

所以當cookie被禁用時也會導致session不可用。通常情況下,伺服器是通過session儲存使用者登入資訊,驗證使用者是否登入。那麼當cookie不可用時,如何驗證使用者登入?
一般有下面幾種方法:
1 URL重寫
response物件有一個encodeURL(String URL)方法.可以自動的給url新增session ID 字尾,以提交引數的方式攜帶session ID
例如:

String newURL = response.encodeURL("/cart/ProductList");
print(newURL) -> /cart/ProductList;jsessionid=110E31172
D5630A31E296D40730B3521

這樣,伺服器發給瀏覽器的page裡的link都如此處理。那伺服器也能確認使用者。

2 form 表單隱式提交
3 http協議攜帶

使用者登入實現

使用者登入邏輯:使用者從登入頁面提交登入資訊,驗證通過就跳轉到welcome頁面,不通過就回到登入頁面,並提示資訊錯誤。 使用sision儲存使用者登入資訊,如果cookie被禁用,就使用url重寫技術
login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>login</title> </head> <body> <h1>登入</h1> <form action="login" method="post"> name: <input type="text" name="name"> password: <input type="password" name="password"> <input type="submit" value="login"> <input type="button" value = "註冊" onclick="/cart/register"> </form> <!--提示登入錯誤資訊--> <p>${warning}</p> </body> </html>

LoginServlet.java

package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import DAO.UserDAO;
import bean.User;

/**
 * Servlet implementation class Login
 */
@WebServlet("/Login")
public class LoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //獲取客戶端傳遞的引數
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        //查資料庫
        User user = new UserDAO().getUser(name,password);

        if(user == null){
            request.setAttribute("warning","user name or password is wrong");
                   request.getRequestDispatcher("/login.jsp").forward(request,response);
        }else{

            //session要佔用伺服器記憶體,所以伺服器不會預設建立(沒有設定的話jsp會建立一個session物件(jsp隱式物件之一))
            //沒有建立session的話 encodeURL()不會起效
            request.getSession().setAttribute("username",name);

            String URL = response.encodeURL("/cart/ProductList"); 
            request.setAttribute("URL",URL);

            request.getRequestDispatcher(("/welcome.jsp")).forward(request,response);
        }

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

welcome.jsp

<!--其他省略-->
<body>
WELCOME ${username}
<br/>
<a href="${URL}">product list</a>
<P>${URL}</P>
</body>