使用spring webMVC和spring security的ajax登录

Posted

技术标签:

【中文标题】使用spring webMVC和spring security的ajax登录【英文标题】:ajax login with spring webMVC and spring security 【发布时间】:2011-03-27 13:40:14 【问题描述】:

我一直在使用 Spring Security 3.0 作为我们的网站登录机制,使用专用的登录网页。现在,我需要将该登录网页改为我们网站中每个网页上的灯箱/弹出窗口,在登录时,无论成功与否,我都会得到 AJAX 结果。使用 Spring Security 和 Spring webmvc 3.0 解决此问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在客户端,您可以通过 ajax 模拟向您的登录 url 提交普通表单。例如,在 jQuery 中:

$.ajax(
    url: "$pageContext.request.contextPath/j_spring_security_check",
    type: "POST",
    data: $("#loginFormName").serialize(),
    beforeSend: function (xhr) 
        xhr.setRequestHeader("X-Ajax-call", "true");
    ,
    success: function(result) 
        if (result == "ok") 
            ...
         else if (result == "error") 
            ...
        
    
);

在服务器端,您可以自定义AuthenticationSuccessHandlerAuthenticationFailureHandler 以返回值而不是重定向。因为您可能还需要一个正常的登录页面(用于尝试通过直接 url 访问安全页面),所以您应该将 ajax 调用与正常调用区分开来,例如,使用 header:

public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler 
    private AuthenticationSuccessHandler defaultHandler;

    public AjaxAuthenticationSuccessHandler() 

    
    public AjaxAuthenticationSuccessHandler(AuthenticationSuccessHandler defaultHandler) 
        this.defaultHandler = defaultHandler;
    

    public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication auth)
        throws IOException, ServletException 
    if ("true".equals(request.getHeader("X-Ajax-call"))) 
        response.getWriter().print("ok");
        response.getWriter().flush();
     else 
        defaultHandler.onAuthenticationSuccess(request, response, auth);
    


【讨论】:

我没有得到这个工作。用户名和密码从请求变为空【参考方案2】:

我做了类似的事情(感谢 axtavt):

public class AjaxAuthenticationSuccessHandler extends
    SimpleUrlAuthenticationSuccessHandler 

public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication auth)
        throws IOException, ServletException 
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) 
        response.getWriter().print(
                "success:true, targetUrl : \'"
                        + this.getTargetUrlParameter() + "\'");
        response.getWriter().flush();
     else 
        super.onAuthenticationSuccess(request, response, auth);
    

我选择为非 Ajax 请求的默认行为扩展简单的成功处理程序。这是使它工作的 XML:

<http auto-config="false" use-expressions="true" entry-point-ref="authenticationProcessingFilterEntryPoint">
    <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" />
...
...
</http>

<beans:bean id="authenticationProcessingFilterEntryPoint"
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/index.do" />
    <beans:property name="forceHttps" value="false" />
</beans:bean>

<beans:bean id="authenticationFilter" class=
    "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check"/>
    <beans:property name="sessionAuthenticationStrategy" ref="sas" />
    <beans:property name="authenticationFailureHandler" ref="failureHandler"/>
    <beans:property name="authenticationSuccessHandler" ref="successHandler"/>
</beans:bean>

<beans:bean id="successHandler" class="foo.AjaxAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/login.html"/>
</beans:bean>

<beans:bean id="failureHandler" class="foo.AjaxAuthenticationFailureHandler" />

【讨论】:

以上是关于使用spring webMVC和spring security的ajax登录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Shiro 和 Spring WebMVC (Java8, Spring 4.x) 从 WebApp 中注销所有仍然登录的用户

使用 @RequestMapping 注解,需要导入的包:spring-webmvc

Maven 依赖 spring-web 与 spring-webmvc

spring-webmvc/hibernate-validator 在测试期间不会使坏数据失效

spring roo 中的 webmvc-config.xml 在哪里

SpringMVC集成WebMVC执行流程数据响应数据交互