2017-06-19 65 views
0

我有表单登录工作的高度为浏览器用户登录:春季安全配置2种登录行为 - Ajax响应JSON和表单登录重定向新的一页

@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无法区分应该提供哪种响应,因为没有某种指示器可以提供。

希望有人可以在此指导。 谢谢。

回答

0

试想只需在登录表单或阿贾克斯

<input type="hidden" name="responseJson" value="true"/> 

提交其他参数劈然后,在扩展了“SimpleUrlAuthenticationFailureHandler”级(其它任何你喜欢的),里面覆盖“onAuthenticationFailure”的方法,此方法得到param调用“HttpServletRequest”,检查如下:

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(); 
}