Spring安全性配置了2种登录行为--ajax响应JSON&表单登录重定向新页面

时间:2017-06-19 03:15:01

标签: spring-security

我已经登录了浏览器用户登录的工作:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().cors()                                                   
        .and().authorizeRequests() 
        .antMatchers("/api/**").authenticated()                                       
        .anyRequest().permitAll()                                                      
        .and().formLogin().loginPage("/login").failureUrl("/login?error")              
        .usernameParameter("username").passwordParameter("password")                   
        .successHandler(loginSuccessConfig)
        .failureHandler(loginFailureConfig)         
        .and().logout().logoutUrl("/logout")                                           
        .logoutSuccessHandler(logoutSuccessConfig)
        .logoutSuccessUrl("/index");
}

但我确实喜欢通过AJAX和响应JSON进行另一种登录,而不是重定向到另一个页面。 我是否知道有可能有另一个登录路径“/ api / login”,因为successHandler和failureHandler无法区分应该提供哪些响应,因为没有某种指示符可以这样做。

希望有人可以为此提供指导。 感谢。

1 个答案:

答案 0 :(得分:0)

只需在登录表单或Ajax

中提交其他参数即可
<input type="hidden" name="responseJson" value="true"/>

然后,在扩展&#34; SimpleUrlAuthenticationFailureHandler&#34; class(任何其他你喜欢的),内部覆盖&#34; onAuthenticationFailure&#34;方法,这个方法得到了param调用&#34; HttpServletRequest&#34;,检查如下:

String responseJson = request.getParameter("responseJson"); 
if (responseJson != null && responseJson.equals("true")){
    response.setContentType("text/json");
    PrintWriter out = response.getWriter();
    out.print(jsonObjectAboutFailLogin.toString());
    out.flush();
}