session与cookie
1. 说明
由于http协议是无状态的,所以服务器是不知道客户端是谁的,而当我们进行购物等操作是需要将购物车关联用户,不能导致我的商品到你的购物车的情况,这时就需要服务器记住客户端,此时就需要用到session与cookies
2. Cookies
什么是cookies
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容

查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如下图所示。

代码通过cookies实现记住我
添加Cookies
import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet(name = "loginServlet", value = "/login")
public class loginServlet extends HttpServlet {
UserModel model = new UserModel();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String remember = request.getParameter("rememberme");
try {
// 添加Session
User user = model.selectByNameAndPwd(name, pwd);
HttpSession session = request.getSession();
session.setAttribute("user",user);
if ("on".equals(remember)) {
// 如果勾选记住我,将用户名密码添加到Cookies
response.addCookie(new Cookie("n", user.getName()));
response.addCookie(new Cookie("p", user.getPwd()));
}
if (user == null){
response.sendRedirect("/web/login.html");
}else {
request.getRequestDispatcher("/main.html").forward(request,response);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
获取Cookies
import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet(name = "SaveServlet", value = "/save")
public class SaveServlet extends HttpServlet {
private UserModel model = new UserModel();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=====================");
System.out.println(request.getSession().getAttribute("user"));
Cookie[] cookies = request.getCookies();
for(Cookie c: cookies){
System.out.println(c.getName() + ":" + c.getValue());
}
User user = new User();
String sid = request.getParameter("id");
int id = -1;
if (sid != null && !"".equals(sid.trim())){
id = Integer.parseInt(sid);
}
user.setId(id);
user.setName(request.getParameter("name"));
user.setPwd(request.getParameter("pwd"));
user.setAdmin(Integer.parseInt(request.getParameter("admin")));
try {
if (id == -1){
model.insert(user);
}else {
model.update(user);
}
response.sendRedirect("user_list.jsp");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
3. Session
什么是Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
代码
后端存储Session
import domain.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import model.UserModel;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet(name = "loginServlet", value = "/login")
public class loginServlet extends HttpServlet {
UserModel model = new UserModel();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String remember = request.getParameter("rememberme");
try {
// 添加Session
User user = model.selectByNameAndPwd(name, pwd);
HttpSession session = request.getSession();
session.setAttribute("user",user);
if ("on".equals(remember)) {
// 如果勾选记住我,将用户名密码添加到Cookies
response.addCookie(new Cookie("n", user.getName()));
response.addCookie(new Cookie("p", user.getPwd()));
}
if (user == null){
response.sendRedirect("/web/login.html");
}else {
request.getRequestDispatcher("/main.html").forward(request,response);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
前端获取Session
<%--
Created by IntelliJ IDEA.
User:***
Date: 2022/8/12
Time: 14:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
===========
<%=session.getAttribute("user")%>
===========
<% Object [] os = (Object[]) request.getAttribute("u");%>
<form action="save" method="post">
<% if (os !=null){ %>
ID: <input type="text" name="id" value="<%=os[0]%>"/> <br />
用户名: <input type="text" name="name" value="<%=os[1]%>"/> <br />
密码: <input type="text" name="pwd" value="<%=os[2]%>"/> <br />
用户类型:<select name="admin" class="form-select form-select-lg mb-3" aria-label=".form-select-lg example">
<option selected="">请选择用户类型</option>
<option value="0" <%="0".equals(os[3].toString())?"selected":""%>>普通用户</option>
<option value="1" <%="1".equals(os[3].toString())?"selected":""%>>会员</option>
</select> <br />
<input type="submit" value="保存" />
<%} else {%>
ID: <input type="text" name="id" /> <br />
用户名: <input type="text" name="name" /> <br />
密码: <input type="text" name="pwd" /> <br />
用户类型:<select name="admin" class="form-select form-select-lg mb-3" aria-label=".form-select-lg example">
<option selected="">请选择用户类型</option>
<option value="0" >普通用户</option>
<option value="1" >会员</option>
</select> <br />
<input type="submit" value="保存" />
<%}%>
</form>
</body>
</html>

浙公网安备 33010602011771号