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=110E31172D5630A31E296D40730B3521
這樣,服務器發給瀏覽器的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>