一、前提
-
WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
-
WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
在 Servlet 规范中,常用以下两种机制完成会话跟踪Cookie
Session
二、Cookie
2.1.Cookie机制
- Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件
- 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
- 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
- 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
2.2.Cookie的使用:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie 并保存信息
Cookie cookie = new Cookie("username","admin");
//将cookie信息响应给客户端
resp.addCookie(cookie);
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
2.3.cookie的获取
<%-- 获取所有的cookie对象 --%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
String name = cookie.getName();
String value = cookie.getValue();
%>
<h1><%=name%></h1>--- <h1><%=value%></h1>
<br/>
<%
}
%>
JSSESIONID:是服务端产生 来标记一次会话的数据 会话ID 每一个会话值都是唯一的
存储我们自定义的信息
username= admin
在cookie中寻找自己关注的cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
String name = cookie.getName();
String value="";
//寻找关注的cookie信息
if(name.equals("username")){
value = cookie.getValue();
}
}
2.4.Cookie的分类:
cookie分为会话cookie和持久cookie
setMaxAge()设置cookie的存储时间
时间单位为秒
如果是-1 则表示永久存储 无限期
如果cookie没有设置maxAge 则为会话cookie
//存储时间为一天
cookie.setMaxAge(60*60*24);
2.5.Cookie的应用案例
2.5.1.自动登录
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆页面</title>
</head>
<body>
<form action="/login.do" method="post">
<input type="text" name="username" value=""><br><br>
<input type="checkbox" name="isAutoLogin">
<input type="submit" value="登陆">
</form>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户名
//如果用户名不为空 则进行用户名密码的校验 如果校验通过 则直接登陆 并将登陆信息保存到cookie
//如果用户名为空 获取cookie中的数据 cookie中是否有登陆所需信息 如果有 则直接进行校验 校验通过登陆
//校验不通过 则返回登陆页面 让用户重新登陆
String username = req.getParameter("username");
if (username !=null && !username.equals("")){
if ("admin".equals(username)){
//校验通过
//并将信息保存到cookie中
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(30);
resp.addCookie(cookie);
resp.sendRedirect("/home.jsp");//重定向到主页
}else{
return;
}
}else{
Cookie[] cookies= req.getCookies();
if (cookies!=null && cookies.length > 0){
for (Cookie cookie:cookies){
String cookieName = cookie.getName();
if ("username".equals(cookieName)){
String cookieValue = cookie.getValue();
if ("admin".equals(cookieValue)){
resp.sendRedirect("/home.jsp");//重定向到主页
}
}
}
}else{
resp.sendRedirect("/login.jsp");
}
}
}
}
2.5.2.显示用户最后访问该应用的时间
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java