sessioncookie 2.0(示例篇)
目录
思路
index.jsp
Java
session&cookie理论文章参见:会话管理-帮你搞懂cookie&session(Java版本)_java cookie 有效期会话-CSDN博客
1.cookie记录上一次的访问时间
思路
本质上就是记录本次的访问请求时间并且创建一个具有一定寿命的cookie;然后遍历网站中所有的cookies,然后筛选出在寿命范围内(就是尚且存活)且距离本次访问时间最近的一次请求,如果没有,就会显示第一次访问。
package com.qcby.cookieLoginTest;
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.io.PrintWriter;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name="lateTime",urlPatterns ="/visit")
public class LastTimeTest extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
// 获取当前时间
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 检查Cookie中是否已经存在上次访问时间
String lastVisitTime = "首次访问";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("lastVisit".equals(cookie.getName())) {
// 对Cookie值进行解码
lastVisitTime = java.net.URLDecoder.decode(cookie.getValue(), "UTF-8");
break;
}
}
}
// 创建一个新的Cookie来记录当前时间
String encodedTime = URLEncoder.encode(sdf.format(now), "UTF-8"); // 对Cookie值进行编码
Cookie lastVisitCookie = new Cookie("lastVisit", encodedTime);
lastVisitCookie.setMaxAge(60); // 设置Cookie有效期为一分钟
response.addCookie(lastVisitCookie);
// 输出响应页面
try (PrintWriter out = response.getWriter()) {
out.println("<html><body>");
out.println("<h1>欢迎访问!</h1>");
out.println("<p>当前时间:" + sdf.format(now) + "</p>");
out.println("<p>上次访问时间:" + lastVisitTime + "</p>");
out.println("</body></html>");
}
}
}
得到结果:
第二次访问:
2.cookie实现自动登录
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="login" method="post">
用户: <input type="text" name="username"/><br>
密码: <input type="password" name="password"/><br>
<input type="checkbox" value="1" name="auto"/> 一分钟内自动登录<br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
Java
package com.qcby.cookieTest;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* 模拟自动登陆方法
*/
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户端提交的表单信息
String username = request.getParameter("username");
String password = request.getParameter("password");
String auto = request.getParameter("auto");
// 统一设置response响应格式及编码
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
// 判断是否提交用户信息
if(username == null && password == null && auto == null){
// 用来接收cookie的value信息
String cookieValue = null;
// 获取用户端cookies
Cookie[] cookies = request.getCookies();
// 如果cookies不为null 尝试获取name为txjavac的cookie的value
if(cookies != null){
for(Cookie ck : cookies){
if(ck.getName().equals("txjavac")){
cookieValue = ck.getValue();
}
}
}
// 如果没有获取到cookie的value 返回信息
if(cookieValue == null){
response.getWriter().write("您还未进行登陆,请进行登陆!!!");
return;
}else{// 如果获取到
// 对该信息进行解码
BASE64Decoder decoder = new BASE64Decoder();
cookieValue = new String(decoder.decodeBuffer(cookieValue));
// 对解码后的字符串进行切分
String[] split = cookieValue.split(":");
// 获取用户名和密码
username = split[1];
password = split[2];
// 创建用户对象
User user = new User(username,password);
// 获取session
HttpSession session = request.getSession();
// 把用户对象存储到session中
session.setAttribute("user",user);
// 返回内容
response.getWriter().write("尊敬的"+username+",欢迎您!!!");
return;
}
}
// 判断用户名或密码是否正确
if(username!=null && password!=null && username.equals("admin") && password.equals("txjava")){
// 创建用户对象
User user = new User(username,password);
// 获取session会话对象
HttpSession session = request.getSession();
// 把用户存入session中
session.setAttribute("user",user);
// 用户名密码正确的话,判断是否勾选了自动登陆
if(auto != null && auto.equals("1")){
// 拼接存储于cookie的value值
String value = "txjava:" + username + ":" + password + ":" + 60;
// 进行BASE64编码
BASE64Encoder encoder = new BASE64Encoder();
value = encoder.encode(value.getBytes());
// 创建cookie并且设置一天失效后添加到response
Cookie cookie = new Cookie("txjavac",value);
cookie.setMaxAge(24*3600);
response.addCookie(cookie);
}
response.getWriter().write("尊敬的"+username+",欢迎您!!!");
return;
}else {
response.getWriter().write("用户名或密码错误!!!");
return;
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
第一次登录或是没有勾选自动登录选项进入这个路径:
输入密码正确且勾选上后:
在一分钟内再进入这个路径,就可以自动登录(如果没勾选,那么后面进这个还是会显示未登录):