Spring mvc Spring安全性:多个安全上下文,但返回错误的身份验证失败url

Spring mvc Spring安全性:多个安全上下文,但返回错误的身份验证失败url,spring-mvc,spring-security,Spring Mvc,Spring Security,我使用的是Spring安全版本3.1.2 以下是配置: <http pattern="/embedded/**" auto-config="true" use-expressions="true" access-denied-page="/embedded/login.htm"> <intercept-url pattern="/embedded/login-embedded.html" access="hasRole('ROLE_AUTHENTICATED')"/&g

我使用的是Spring安全版本3.1.2

以下是配置:

<http pattern="/embedded/**" auto-config="true" use-expressions="true" access-denied-page="/embedded/login.htm">
    <intercept-url pattern="/embedded/login-embedded.html" access="hasRole('ROLE_AUTHENTICATED')"/>
    <intercept-url pattern="/embedded/**" access="permitAll"/>
    <form-login login-page="/embedded/login.htm"
                authentication-failure-url="/embedded/login.htm?error=true"
                default-target-url="/embedded/login-embedded.html" />
    <logout logout-success-url="/embedded/index.html"/>

</http>

<http auto-config="true" use-expressions="true" access-denied-page="/login.htm">
    <intercept-url pattern="/login-success.html" access="hasRole('ROLE_AUTHENTICATED')"/>
    <intercept-url pattern="/**" access="permitAll"/>
    <form-login login-page="/login.htm"
                authentication-failure-url="/login.htm?error=true"
                default-target-url="/login-success.html"/>
    <logout logout-success-url="/index.html"/>
</http>

我的问题是,验证码被验证后,请求被转发到Spring Security并且验证失败,它转发到的错误页面是
/login.htm?error=true
,而不是
/embedded/login.htm?error=true
/j_Spring\u Security\u check不匹配
/embedded/**
,所以使用了身份验证失败url=“/login.htm?error=true”——第二个配置中的一个

最近也有人提出类似的问题:

Spring Security的一位创作者回答了这个问题。我建议你读一读

另一个值得注意的堆栈溢出:

谢谢。第一个链接帮助很大。配置
表单登录的
登录处理url
解决了我的问题。
@RequestMapping(value ="/embedded/login.htm", method = RequestMethod.POST)
public String authenticateCaptcha(HttpServletRequest request,
                                  HttpServletResponse response,
                                  @RequestParam String verificationText) throws IOException, ServletException {
    HttpSession session = request.getSession();
    String sessionId = session.getId();
    if (captchaService.validate(sessionId, verificationText)) {
        request.getRequestDispatcher("/j_spring_security_check").forward(request, response);
        return null;
    }
    return buildErrorRedirect(request);
}