|
|
|
@ -10,60 +10,86 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
/**
|
|
|
|
|
* cookie读写
|
|
|
|
|
*/
|
|
|
|
|
// 使用lombok的@Slf4j注解,用于自动生成日志相关的代码,方便在类中记录各种操作相关的日志信息,便于后续查看操作情况以及进行问题排查。
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class CookieUtil {
|
|
|
|
|
// 定义一个静态的常量字符串,表示Cookie的作用域域名,即该Cookie在哪些域名下有效,这里设置为"oursnail.cn",意味着这个Cookie在该域名及其子域名下都可以被识别和使用。
|
|
|
|
|
private final static String COOKIE_DOMAIN = "oursnail.cn";
|
|
|
|
|
// 定义一个静态的常量字符串,作为Cookie的名称,用于唯一标识这个Cookie,在这里设定为"snailmall_login_token",可能用于存储用户登录相关的标识信息等。
|
|
|
|
|
private final static String COOKIE_NAME = "snailmall_login_token";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 登陆的时候写入cookie
|
|
|
|
|
* @param response
|
|
|
|
|
* @param token
|
|
|
|
|
* 该方法用于在用户登录时向客户端写入Cookie,将登录相关的标识信息(token)以Cookie的形式存储在客户端浏览器中。
|
|
|
|
|
*
|
|
|
|
|
* @param response 表示HTTP响应对象,通过它可以向客户端发送响应信息,包括设置Cookie等操作。
|
|
|
|
|
* @param token 表示登录生成的令牌(token),是要存储到Cookie中的具体值,用于后续验证用户登录状态等操作。
|
|
|
|
|
*/
|
|
|
|
|
public static void writeLoginToken(HttpServletResponse response,String token){
|
|
|
|
|
// 创建一个Cookie对象,使用预先定义好的COOKIE_NAME作为Cookie的名称,传入的token作为Cookie的值,以此构建一个用于存储登录信息的Cookie实例。
|
|
|
|
|
Cookie ck = new Cookie(COOKIE_NAME,token);
|
|
|
|
|
// 设置Cookie的作用域域名,使其与前面定义的COOKIE_DOMAIN一致,确保该Cookie能在指定的域名下被正确识别和使用。
|
|
|
|
|
ck.setDomain(COOKIE_DOMAIN);
|
|
|
|
|
// 设置Cookie的路径为根目录("/"),这意味着该Cookie在整个网站的所有页面路径下都有效,方便在不同页面间共享和使用这个Cookie。
|
|
|
|
|
ck.setPath("/");//设值在根目录
|
|
|
|
|
// 设置Cookie的HttpOnly属性为true,这样浏览器脚本(如JavaScript)就无法访问该Cookie,能有效避免跨站脚本攻击(XSS攻击),提高安全性。
|
|
|
|
|
ck.setHttpOnly(true);//不允许通过脚本访问cookie,避免脚本攻击
|
|
|
|
|
// 设置Cookie的最大存活时间,这里设置为一年(60 * 60 * 24 * 365秒),表示该Cookie在客户端浏览器上保存一年的时间,-1表示永久有效,若不设置该属性,Cookie默认只在内存中存在,仅在当前页面有效,不会写入硬盘持久化存储。
|
|
|
|
|
ck.setMaxAge(60*60*24*365);//一年,-1表示永久,单位是秒,maxage不设置的话,cookie就不会写入硬盘,只会写在内存,只在当前页面有效
|
|
|
|
|
// 使用日志记录即将写入的Cookie的名称和值,方便后续查看写入操作以及排查可能出现的问题,比如Cookie是否按预期设置等情况。
|
|
|
|
|
log.info("write cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
// 通过HTTP响应对象将构建好的Cookie添加到响应中,发送给客户端浏览器,使得浏览器可以接收到并存储这个Cookie。
|
|
|
|
|
response.addCookie(ck);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 读取登陆的cookie
|
|
|
|
|
* @param request
|
|
|
|
|
* @return
|
|
|
|
|
* 该方法用于从客户端的HTTP请求中读取登录相关的Cookie值,也就是获取之前存储的登录令牌(token),用于验证用户是否已经登录等操作。
|
|
|
|
|
*
|
|
|
|
|
* @param request 表示HTTP请求对象,通过它可以获取客户端发送过来的各种信息,包括携带的Cookie信息。
|
|
|
|
|
* @return 返回从Cookie中读取到的登录令牌(token)值,如果没有找到对应的Cookie,则返回null。
|
|
|
|
|
*/
|
|
|
|
|
public static String readLoginToken(HttpServletRequest request){
|
|
|
|
|
// 通过HTTP请求对象获取客户端发送过来的所有Cookie数组,如果没有Cookie则返回null。
|
|
|
|
|
Cookie[] cks = request.getCookies();
|
|
|
|
|
if(cks != null){
|
|
|
|
|
if(cks!= null){
|
|
|
|
|
// 遍历获取到的Cookie数组,逐个检查每个Cookie。
|
|
|
|
|
for(Cookie ck:cks){
|
|
|
|
|
// 使用日志记录当前遍历到的Cookie的名称和值,方便查看读取过程以及排查可能出现的问题,比如是否有预期的Cookie存在等情况。
|
|
|
|
|
log.info("cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
// 判断当前Cookie的名称是否与预先定义的登录相关Cookie名称(COOKIE_NAME)相等,如果相等,则说明找到了需要的登录Cookie。
|
|
|
|
|
if(StringUtils.equals(ck.getName(),COOKIE_NAME)){
|
|
|
|
|
// 使用日志记录找到的登录Cookie的名称和值,并返回该Cookie的值,也就是登录令牌(token)的值,用于后续的业务逻辑处理,比如验证登录状态等。
|
|
|
|
|
log.info("return cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
return ck.getValue();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 如果遍历完所有Cookie都没有找到对应的登录Cookie,则返回null,表示没有获取到登录相关的令牌信息。
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 注销的时候进行删除
|
|
|
|
|
* @param request
|
|
|
|
|
* @param response
|
|
|
|
|
* 该方法用于在用户注销登录时,从客户端删除存储的登录相关Cookie,清除用户的登录状态标识。
|
|
|
|
|
*
|
|
|
|
|
* @param request 表示HTTP请求对象,用于获取客户端携带的Cookie信息,以便查找并删除对应的登录Cookie。
|
|
|
|
|
* @param response 表示HTTP响应对象,通过它向客户端发送响应,实现删除Cookie的操作(通过设置相应属性并重新发送Cookie给客户端)。
|
|
|
|
|
*/
|
|
|
|
|
public static void delLoginToken(HttpServletRequest request,HttpServletResponse response){
|
|
|
|
|
// 获取客户端发送过来的所有Cookie数组,如果没有则返回null。
|
|
|
|
|
Cookie[] cks = request.getCookies();
|
|
|
|
|
if(cks != null){
|
|
|
|
|
if(cks!= null){
|
|
|
|
|
// 遍历所有Cookie,查找名称与登录相关Cookie名称(COOKIE_NAME)一致的Cookie,以便进行删除操作。
|
|
|
|
|
for(Cookie ck:cks) {
|
|
|
|
|
if(StringUtils.equals(ck.getName(),COOKIE_NAME)){
|
|
|
|
|
// 设置要删除的Cookie的作用域域名,与之前设置的一致,确保能准确删除对应的Cookie。
|
|
|
|
|
ck.setDomain(COOKIE_DOMAIN);
|
|
|
|
|
// 设置Cookie的路径为根目录,与之前设置保持一致,这是准确删除该Cookie的必要条件之一。
|
|
|
|
|
ck.setPath("/");
|
|
|
|
|
// 设置Cookie的最大存活时间为0秒,表示立即删除该Cookie,让客户端浏览器清除掉这个Cookie的存储信息。
|
|
|
|
|
ck.setMaxAge(0);//0表示消除此cookie
|
|
|
|
|
// 使用日志记录即将删除的Cookie的名称和值,方便查看删除操作以及后续排查问题,比如是否成功删除等情况。
|
|
|
|
|
log.info("del cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
// 通过HTTP响应对象将设置好删除属性的Cookie重新发送给客户端,实现从客户端删除该Cookie的操作,完成后直接返回,因为找到并处理了对应的登录Cookie就无需继续遍历其他Cookie了。
|
|
|
|
|
response.addCookie(ck);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -71,4 +97,4 @@ public class CookieUtil {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|