pull/4/head
zhouyu 9 months ago
parent ed6bb5fabc
commit cd12d004f6

@ -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
* CookietokenCookie
*
* @param response HTTPCookie
* @param token tokenCookie
*/
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
* HTTPCookietoken
*
* @param request HTTPCookie
* @return CookietokenCookienull
*/
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 HTTPCookie便Cookie
* @param response HTTPCookieCookie
*/
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 {
}
}
}
}
Loading…
Cancel
Save