cookie session 和登入驗證
阿新 • • 發佈:2019-01-22
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>