【问题标题】:Spring security remember me giving the error: ERR_TOO_MANY_REDIRECTSSpring security 记得我给出错误:ERR_TOO_MANY_REDIRECTS
【发布时间】:2026-02-20 21:35:01
【问题描述】:

我最近在我的Java Spring MVC web application 中实现了Spring Security Token based remember me 功能。我的 spring-security.xml 文件如下:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/login**" access="permitAll" />
    <intercept-url pattern="/layout/**" access="permitAll" />
    <intercept-url pattern="/min/**" access="permitAll" />
    <intercept-url pattern="/rest/v3/**" access="permitAll" />
    <intercept-url pattern="/password/**" access="permitAll" />
    <intercept-url pattern="/register/**" access="permitAll" />
    <intercept-url pattern="/unsubscribe/**" access="permitAll" />
    <intercept-url pattern="/**" access="isFullyAuthenticated()"/>

        <form-login login-page="/login" default-target-url="/"
            authentication-failure-url="/login?error" username-parameter="username"
            password-parameter="password" />
        <logout logout-success-url="/login?logout" invalidate-session="false"  />

        <!-- enable csrf protection
        <csrf />
        -->
        <!-- access denied page -->
        <access-denied-handler error-page="/403" />

        <logout delete-cookies="JSESSIONID"/>
        <remember-me key="myAppKey" />

    </http>

实现此功能后,记住我功能正在运行。但我收到如下错误:

我已尝试将permitAll() 选项添加到登录“URL”,正如某些文档所理解的那样。但似乎没有什么对我有用。我在所有其他 Web 应用程序中都使用了相同的配置。

【问题讨论】:

  • 使用浏览器的 Web 开发人员功能来确定哪些 URL 正在重定向到什么。 (我怀疑某些东西正在重定向到错误的地方......)
  • Hmmm ... "/login**" 是正确的语法吗?如果它与登录页面不匹配,则 permitAll() 将不适用,您将直接进入登录页面的“/**”规则 (!)
  • @Stephen C,我发现 / 是重定向太多的 URL

标签: java spring spring-mvc spring-security remember-me


【解决方案1】:

尝试改变

<intercept-url pattern="/login**" access="permitAll" />

<intercept-url pattern="/login" access="permitAll" />

【讨论】:

    【解决方案2】:

    您实际上不需要登录页面的权限:

    在你的http tag之外,添加这个

    <http security="none" pattern="/login" />
    

    并删除

    <intercept-url pattern="/login**" access="permitAll" />
    

    这也适用于您也想加载 css/js 文件的情况

    您的文件将如下所示,例如:

        <http security="none" pattern="/login" />
        <http security="none" pattern="/layout/**" />
        <http security="none" pattern="/min/**" />
    
        <http auto-config="true" use-expressions="true">
    
            <intercept-url pattern="/rest/v3/**" access="permitAll" />
            <intercept-url pattern="/password/**" access="permitAll" />
            <intercept-url pattern="/register/**" access="permitAll" />
            <intercept-url pattern="/unsubscribe/**" access="permitAll" />
            <intercept-url pattern="/**" access="isFullyAuthenticated()"/>
    
                <form-login login-page="/login" default-target-url="/"
                    authentication-failure-url="/login?error" username-parameter="username"
                    password-parameter="password" />
                <logout logout-success-url="/login?logout" invalidate-session="false"  />
    
                <!-- enable csrf protection
                <csrf />
                -->
                <!-- access denied page -->
                <access-denied-handler error-page="/403" />
    
                <logout delete-cookies="JSESSIONID"/>
                <remember-me key="myAppKey" />
    
         </http>
    

    参考 Spring Security 文档:https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-minimal

    3.2.3 表单和基本登录选项

    请注意,您仍然可以使用自动配置。 form-login 元素只是覆盖了默认设置。另请注意,我们添加了一个额外的intercept-url 元素来说明对登录页面的任何请求都应该可供匿名用户使用[5]。否则请求将被模式 /** 匹配,并且无法访问登录页面本身! 这是一个常见的配置错误,将导致应用程序无限循环。如果您的登录页面看起来是安全的,Spring Security 将在日志中发出警告。也可以让所有匹配特定模式的请求完全绕过安全过滤器链,方法是为模式定义一个单独的 http 元素,如下所示:

    【讨论】: