|
|
|
@ -10,39 +10,55 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
/**
|
|
|
|
|
* cookie读写
|
|
|
|
|
*/
|
|
|
|
|
// 使用lombok的@Slf4j注解,用于自动生成日志相关的代码,方便在类中记录各种操作相关的日志信息,便于后续查看操作情况以及进行问题排查,例如在对Cookie进行写入、读取、删除等操作时,通过日志记录关键信息,有助于了解Cookie操作的执行情况以及可能出现的问题。
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class CookieUtil {
|
|
|
|
|
// 定义一个私有静态常量字符串COOKIE_DOMAIN,用于指定Cookie的作用域(域名),这里设置为"oursnail.cn",意味着该Cookie在这个域名及其子域名下有效,在设置和操作Cookie时会用到这个域名信息来确定其作用范围。
|
|
|
|
|
private final static String COOKIE_DOMAIN = "oursnail.cn";
|
|
|
|
|
// 定义一个私有静态常量字符串COOKIE_NAME,用于指定Cookie的名称,这里设置为"snailmall_login_token",通过这个固定的名称来标识特定用途(如用户登录相关)的Cookie,方便在后续的读取、操作等过程中进行识别和区分。
|
|
|
|
|
private final static String COOKIE_NAME = "snailmall_login_token";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 登陆的时候写入cookie
|
|
|
|
|
* @param response
|
|
|
|
|
* @param token
|
|
|
|
|
* 此方法用于在用户登录时向客户端写入Cookie,主要功能是创建一个Cookie对象,设置好相关属性后添加到响应(HttpServletResponse)中,以便客户端接收到并保存该Cookie。
|
|
|
|
|
*
|
|
|
|
|
* @param response 用于向客户端发送响应的HttpServletResponse对象,通过这个对象将设置好的Cookie发送给客户端,使其能够保存到本地。
|
|
|
|
|
* @param token 要写入Cookie的值,通常是代表用户登录状态的令牌(token)等相关信息,会被存储在名为"snailmall_login_token"的Cookie中。
|
|
|
|
|
*/
|
|
|
|
|
public static void writeLoginToken(HttpServletResponse response,String token){
|
|
|
|
|
Cookie ck = new Cookie(COOKIE_NAME,token);
|
|
|
|
|
public static void writeLoginToken(HttpServletResponse response, String token) {
|
|
|
|
|
// 创建一个名为"snailmall_login_token"的Cookie对象,将传入的token作为其值,后续会对这个Cookie对象进行一系列属性设置,使其符合业务需求。
|
|
|
|
|
Cookie ck = new Cookie(COOKIE_NAME, token);
|
|
|
|
|
// 设置Cookie的作用域(域名),使用之前定义好的COOKIE_DOMAIN常量,确保该Cookie在指定的域名("oursnail.cn")及其子域名下有效,这样在该域名相关的页面访问时,浏览器会带上这个Cookie信息。
|
|
|
|
|
ck.setDomain(COOKIE_DOMAIN);
|
|
|
|
|
// 设置Cookie的路径为根目录("/"),表示该Cookie在整个网站的所有页面路径下都有效,无论访问哪个页面,浏览器都会将这个Cookie发送给服务器,方便在不同页面间共享该Cookie所携带的信息(比如登录状态等)。
|
|
|
|
|
ck.setPath("/");//设值在根目录
|
|
|
|
|
// 设置HttpOnly属性为true,这意味着该Cookie不能通过客户端脚本(如JavaScript)访问,主要是为了增强安全性,避免恶意脚本通过获取Cookie信息来进行攻击,例如防止跨站脚本攻击(XSS)获取用户登录相关的敏感信息。
|
|
|
|
|
ck.setHttpOnly(true);//不允许通过脚本访问cookie,避免脚本攻击
|
|
|
|
|
ck.setMaxAge(60*60*24*365);//一年,-1表示永久,单位是秒,maxage不设置的话,cookie就不会写入硬盘,只会写在内存,只在当前页面有效
|
|
|
|
|
log.info("write cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
// 设置Cookie的最大存活时间,这里设置为一年(60 * 60 * 24 * 365秒),表示该Cookie在客户端保存一年后才会过期失效,如果设置为 -1则表示永久有效,若不设置这个属性(即maxage不设置),Cookie就不会写入硬盘,只会临时保存在内存中,且只在当前页面有效,下次访问其他页面时该Cookie就不存在了。
|
|
|
|
|
ck.setMaxAge(60 * 60 * 24 * 365);//一年,-1表示永久,单位是秒,maxage不设置的话,cookie就不会写入硬盘,只会写在内存,只在当前页面有效
|
|
|
|
|
// 使用日志记录即将写入的Cookie的名称和值信息,方便后续查看Cookie的写入情况,例如在排查是否正确写入了期望的Cookie等问题时,可以通过日志进行确认。
|
|
|
|
|
log.info("write cookieName:{},cookieValue:{}", ck.getName(), ck.getValue());
|
|
|
|
|
// 将设置好的Cookie添加到HttpServletResponse对象中,这样在响应发送给客户端时,客户端浏览器就会接收到并保存这个Cookie,从而实现登录相关信息(通过token体现)在客户端的存储。
|
|
|
|
|
response.addCookie(ck);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 读取登陆的cookie
|
|
|
|
|
* @param request
|
|
|
|
|
* @return
|
|
|
|
|
* 该方法用于从客户端发送的请求(HttpServletRequest)中读取名为"snailmall_login_token"的Cookie值,主要逻辑是遍历请求中的所有Cookie,找到名称匹配的Cookie并返回其值,如果没有找到则返回null。
|
|
|
|
|
*
|
|
|
|
|
* @param request 用于接收客户端请求的HttpServletRequest对象,从中获取包含的所有Cookie信息,以便查找特定名称的Cookie。
|
|
|
|
|
* @return 返回找到的名为"snailmall_login_token"的Cookie的值,如果没有找到则返回null,调用者可以根据返回值判断是否获取到了有效的登录相关Cookie信息,进而进行后续的业务逻辑处理,比如根据登录状态决定是否允许访问某些页面等。
|
|
|
|
|
*/
|
|
|
|
|
public static String readLoginToken(HttpServletRequest request){
|
|
|
|
|
public static String readLoginToken(HttpServletRequest request) {
|
|
|
|
|
// 从HttpServletRequest对象中获取客户端发送过来的所有Cookie数组,如果没有Cookie则返回null。
|
|
|
|
|
Cookie[] cks = request.getCookies();
|
|
|
|
|
if(cks != null){
|
|
|
|
|
for(Cookie ck:cks){
|
|
|
|
|
log.info("cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
if(StringUtils.equals(ck.getName(),COOKIE_NAME)){
|
|
|
|
|
log.info("return cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
if (cks!= null) {
|
|
|
|
|
// 遍历获取到的Cookie数组,逐个检查每个Cookie的名称是否与期望的"snailmall_login_token"一致。
|
|
|
|
|
for (Cookie ck : cks) {
|
|
|
|
|
// 使用日志记录当前遍历到的Cookie的名称和值信息,方便后续查看Cookie的读取情况,例如排查是否正确遍历到了所有Cookie以及是否有符合要求的Cookie等问题时,可以通过日志进行分析。
|
|
|
|
|
log.info("cookieName:{},cookieBValue:{}", ck.getName(), ck.getValue());
|
|
|
|
|
if (StringUtils.equals(ck.getName(), COOKIE_NAME)) {
|
|
|
|
|
// 如果找到名称匹配的Cookie,再次使用日志记录这个匹配的Cookie的名称和值信息,然后返回其值,以便调用者获取到登录相关的Cookie中存储的信息(如登录令牌等)进行后续操作。
|
|
|
|
|
log.info("return cookieName:{},cookieBValue:{}", ck.getName(), ck.getValue());
|
|
|
|
|
return ck.getValue();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -51,24 +67,31 @@ public class CookieUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 注销的时候进行删除
|
|
|
|
|
* @param request
|
|
|
|
|
* @param response
|
|
|
|
|
* 此方法用于在用户注销时,从客户端删除名为"snailmall_login_token"的Cookie,通过遍历请求中的Cookie找到目标Cookie后,修改其属性使其立即失效(通过设置最大存活时间为0),然后添加到响应中发送给客户端,通知客户端删除该Cookie。
|
|
|
|
|
*
|
|
|
|
|
* @param request 用于接收客户端请求的HttpServletRequest对象,从中获取包含的所有Cookie信息,以便查找并处理特定名称的Cookie。
|
|
|
|
|
* @param response 用于向客户端发送响应的HttpServletResponse对象,通过这个对象将修改后的(设置为失效状态)Cookie发送给客户端,让客户端执行删除操作。
|
|
|
|
|
*/
|
|
|
|
|
public static void delLoginToken(HttpServletRequest request,HttpServletResponse response){
|
|
|
|
|
public static void delLoginToken(HttpServletRequest request, HttpServletResponse response) {
|
|
|
|
|
// 从HttpServletRequest对象中获取客户端发送过来的所有Cookie数组,如果没有Cookie则无需进行后续删除操作。
|
|
|
|
|
Cookie[] cks = request.getCookies();
|
|
|
|
|
if(cks != null){
|
|
|
|
|
for(Cookie ck:cks) {
|
|
|
|
|
if(StringUtils.equals(ck.getName(),COOKIE_NAME)){
|
|
|
|
|
if (cks!= null) {
|
|
|
|
|
// 遍历获取到的Cookie数组,逐个检查每个Cookie的名称是否与期望的"snailmall_login_token"一致。
|
|
|
|
|
for (Cookie ck : cks) {
|
|
|
|
|
if (StringUtils.equals(ck.getName(), COOKIE_NAME)) {
|
|
|
|
|
// 如果找到名称匹配的Cookie,先设置其作用域(域名),使用之前定义好的COOKIE_DOMAIN常量,确保修改的是正确域名下的该Cookie。
|
|
|
|
|
ck.setDomain(COOKIE_DOMAIN);
|
|
|
|
|
// 设置Cookie的路径为根目录("/"),保持与之前设置一致,使其在整个网站的所有页面路径下都能正确执行删除操作。
|
|
|
|
|
ck.setPath("/");
|
|
|
|
|
// 设置Cookie的最大存活时间为0,表示让客户端立即删除这个Cookie,使其失效,不再在后续的请求中携带该Cookie信息。
|
|
|
|
|
ck.setMaxAge(0);//0表示消除此cookie
|
|
|
|
|
log.info("del cookieName:{},cookieBValue:{}",ck.getName(),ck.getValue());
|
|
|
|
|
// 使用日志记录即将删除的Cookie的名称和值信息,方便后续查看Cookie的删除情况,例如在排查是否正确删除了期望的Cookie等问题时,可以通过日志进行确认。
|
|
|
|
|
log.info("del cookieName:{},cookieBValue:{}", ck.getName(), ck.getValue());
|
|
|
|
|
// 将设置为失效状态的Cookie添加到HttpServletResponse对象中,发送给客户端,客户端浏览器接收到这个响应后,会根据设置删除对应的Cookie,从而实现注销时删除登录相关Cookie的功能。
|
|
|
|
|
response.addCookie(ck);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|