From 5972772ef983e6a753a2269593c9c040a6959e07 Mon Sep 17 00:00:00 2001 From: gitee-bot Date: Thu, 5 Feb 2026 15:25:09 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20=E4=B8=BA=20CustomCookieRememberMeManag?= =?UTF-8?q?er=20=E6=B7=BB=E5=8A=A0=E8=AF=A6=E7=BB=86=E7=9A=84=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为解决'记住我请求头过大'问题的新增类添加完整的 JavaDoc 文档,包括: - 类的作用和背景说明 - 问题分析和解决方案 - 方法级别的详细注释,包含处理流程和注意事项 - 使用场景和配置方式示例 参考:https://gitee.com/test-data---external/sadfasdfasfdsadf/pulls/8 --- .../CustomCookieRememberMeManager.java | 92 ++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java index 81230927..412b751e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java @@ -16,12 +16,75 @@ import com.ruoyi.framework.shiro.service.SysLoginService; /** * 自定义CookieRememberMeManager * + *

该类继承自 Shiro 的 {@link CookieRememberMeManager},用于解决"记住我"功能中 + * HTTP 请求头过大的问题。

+ * + *

问题背景

+ *

在原始实现中,"记住我"功能会将用户的所有角色权限信息(permissions)序列化为 + * Base64 编码后存储在 Cookie 中。当用户拥有大量权限时,Cookie 的大小会变得非常大, + * 可能导致 HTTP 请求头超出服务器限制(如 Tomcat 默认的 8192 字节)。

+ * + *

解决方案

+ *

本类采用以下策略解决此问题:

+ *
    + *
  1. 存储时优化:在 {@link #rememberIdentity(Subject, PrincipalCollection)} 方法中, + * 暂时清除角色对象的 permissions 权限字符串,仅序列化必要的用户身份信息。
  2. + *
  3. 使用时恢复:在 {@link #getRememberedPrincipals(SubjectContext)} 方法中, + * 从服务器重新加载用户的角色权限信息,确保权限验证正常工作。
  4. + *
+ * + *

使用场景

+ *

适用于以下情况:

+ * + * + *

配置方式

+ *
+ * 在 {@link com.ruoyi.framework.config.ShiroConfig} 中配置:
+ *
+ * @Bean
+ * public CustomCookieRememberMeManager rememberMeManager()
+ * {
+ *     CustomCookieRememberMeManager cookieRememberMeManager = new CustomCookieRememberMeManager();
+ *     cookieRememberMeManager.setCookie(rememberMeCookie());
+ *     // 设置加密密钥等配置...
+ *     return cookieRememberMeManager;
+ * }
+ * 
+ * * @author ruoyi + * @see org.apache.shiro.web.mgt.CookieRememberMeManager + * @see com.ruoyi.framework.shiro.service.SysLoginService#setRolePermission(SysUser) */ public class CustomCookieRememberMeManager extends CookieRememberMeManager { /** - * 记住我时去掉角色的permissions权限字符串,防止http请求头过大。 + *去掉角色的permissions权限字符串 记住我时,防止http请求头过大。 + * + *

该方法在用户登录并选择"记住我"时调用。

+ * + *

处理流程:

+ *
    + *
  1. 遍历所有主体(Principal),找到 {@link SysUser} 类型的用户信息
  2. + *
  3. 提取每个角色的 permissions 权限集合并暂存到 Map 中
  4. + *
  5. 将角色的 permissions 设置为 null,避免序列化到 Cookie
  6. + *
  7. 调用父类方法将精简后的身份信息序列化为字节数组
  8. + *
  9. 恢复原始的 permissions 数据(不修改原始对象)
  10. + *
  11. 将字节数组存储到 Cookie
  12. + *
+ * + *

注意事项:

+ * + * + * @param subject 当前主题 + * @param principalCollection 用户身份信息集合,包含用户和角色信息 */ @Override protected void rememberIdentity(Subject subject, PrincipalCollection principalCollection) @@ -58,6 +121,33 @@ public class CustomCookieRememberMeManager extends CookieRememberMeManager /** * 取记住我身份时恢复角色permissions权限字符串。 + * + *

该方法在用户通过"记住我"功能自动登录时调用。

+ * + *

处理流程:

+ *
    + *
  1. 调用父类方法从 Cookie 中解析出用户身份信息
  2. + *
  3. 检查解析结果是否为空,如果为空则直接返回
  4. + *
  5. 遍历解析出的主体,找到 {@link SysUser} 类型的用户信息
  6. + *
  7. 调用 {@link SysLoginService#setRolePermission(SysUser)} 方法重新加载权限
  8. + *
  9. 返回完整的用户身份信息(包含重新加载的权限)
  10. + *
+ * + *

注意事项:

+ * + * + *

异常处理:

+ *

如果 {@link SysLoginService} 获取失败或返回异常,用户仍可登录, + * 但部分权限验证功能可能受影响。

+ * + * @param subjectContext 主题上下文,包含 Cookie 解析的身份信息 + * @return 完整的主身份信息集合,包含重新加载的权限 + * @see org.apache.shiro.subject.PrincipalCollection + * @see com.ruoyi.framework.shiro.service.SysLoginService */ @Override public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext) -- Gitee