pull/4/head
zhouyu 9 months ago
parent ca55c0240d
commit 8c14df8534

@ -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
* CookieCookieHttpServletResponse便Cookie
*
* @param response HttpServletResponseCookie使
* @param token Cookietoken"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"CookieCookieCookienull
*
* @param request HttpServletRequestCookie便Cookie
* @return "snailmall_login_token"CookienullCookie访
*/
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"CookieCookieCookie使0Cookie
*
* @param request HttpServletRequestCookie便Cookie
* @param response HttpServletResponseCookie
*/
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;
}
}
}
}
}
}
Loading…
Cancel
Save