【发布时间】:2017-07-03 00:10:26
【问题描述】:
您好,我用 Spring Boot 和 Spring Security 构建了一个项目。现在,我想为 Jquery.ajax({...}); 提供登录 restfull 服务;我想:
- 处理来自 HTML 页面的登录请求(如
<form>提交)。 - HTML页面请求时自动检查会话超时,将超时重定向到登录页面。
- 处理来自 Ajax 的登录请求。
- Ajax 请求时自动检查登录状态。
我是这样编码的
安全配置
从 WebSecurityConfigurerAdapter 扩展
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
String requestType = request.getHeader("x-requested-with");
if (!StringUtils.isEmpty(requestType)) {
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().print("{\"invalid_session\": true}");
response.getWriter().flush();
} else {
response.sendRedirect("/security/login");
}
});
http.authorizeRequests()
.antMatchers("/security/**").permitAll()
.antMatchers("/reader/**").hasRole("READER")
.anyRequest().authenticated()
// session time out
.and().sessionManagement().invalidSessionUrl("/security/session_timeout")
.and().cors()
// login
.and()
.formLogin()
.successHandler(successHandler)
.failureHandler(faildHandler)
.loginPage("/security/login")
.permitAll()
// logout
.and()
.logout().permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(readerRepository::findOne);
}
我有两个处理程序来处理 AuthenticationSuccess 和 AuthenticationFailure。
故障处理程序
从 SimpleUrlAuthenticationFailureHandler 扩展
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println("Failed to auth.");
String requestType = request.getHeader("x-requested-with");
if (!StringUtils.isEmpty(requestType)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().print("{\"success\": false}");
} else {
setDefaultFailureUrl("/security/login?error=true");
super.onAuthenticationFailure(request, response, exception);
}
}
成功处理程序
从 SavedRequestAwareAuthenticationSuccessHandler 扩展
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("Success to auth.");
String requestType = request.getHeader("x-requested-with");
if (!StringUtils.isEmpty(requestType)) {
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().print("{\"success\": true}");
} else {
setDefaultTargetUrl("/index/index");
setAlwaysUseDefaultTargetUrl(true);
super.onAuthenticationSuccess(request, response, authentication);
}
}
控制器
base RequestMapping 是 '/security'
@RequestMapping(value = "/login")
public String login(@RequestParam(value = "error", defaultValue = "false") boolean error, Model model) {
model.addAttribute("error", error);
return "login";
}
@RequestMapping("/session_timeout")
public void sessionTimeout(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("session was timeout.");
if (request.getHeader("x-requested-with") != null) {
// handler for ajax
response.getWriter().print("{\"sessionTimeout\": true}");
response.getWriter().close();
} else {
response.sendRedirect("login");
}
}
当我在页面 (thymeleaf) 中进行测试时,一切正常。 但是.. 当我使用 Jquery Ajax 时。 问题:
当我使用 Jquery.ajax({}) API 发送请求时,请求无法到达服务器。如何用jquery编写ajax请求,我尝试了很多jquery方法,页面在控制台没有响应代码。 spring security不支持ajax吗?
【问题讨论】:
-
能否提供您的 ajax javascript 代码以及服务器响应状态代码?
标签: ajax spring spring-boot spring-security