【发布时间】:2016-08-15 20:12:19
【问题描述】:
我的项目中有一个控制器来处理所有定义如下的异常:
@ControllerAdvice
public class GlobalExceptionHandlingController {
@ResponseBody
@ExceptionHandler(value = AccessDeniedException.class)
public ResponseEntity accessDeniedException() {
Logger.getLogger("#").log(Level.SEVERE, "Exception caught!");
return new ResponseEntity("Access is denied", HttpStatus.FORBIDDEN);
}
}
我在这里关注一个特定的异常,即 Spring Security 在未经授权的请求时抛出的 AccessDeniedException。这适用于“正常”又名非 ajax 请求。我可以点击链接或直接在地址栏中输入 URL,如果请求未经授权,我会看到此消息。
但是在 AJAX 请求(使用 Angular)时,我收到标准 403 错误页面作为响应,但有趣的是我可以看到 AccessDeniedException 被此控制器捕获!
我做了一些研究,似乎我需要自定义 AccessDeniedHandler,所以我做了这个:
在我的 Spring Security 配置中添加了这一行:
.and()
.exceptionHandling().accessDeniedPage("/error/403/");
我制作了特殊的控制器来处理这个问题:
@Controller
public class AjaxErrorController {
@ResponseBody
@RequestMapping(value = "/error/403/", method = RequestMethod.GET)
public ResponseEntity accessDeniedException() {
return new ResponseEntity("Access is denied (AJAX)", HttpStatus.FORBIDDEN);
}
}
现在这工作正常,但异常仍被第一个控制器捕获,但该方法的返回值被忽略。为什么?
这是应该的吗?我有一种感觉,我在这里遗漏了一些东西。
我正在使用 Spring 4.2.5 和 Spring Security 4.0.4。
【问题讨论】:
标签: java angularjs spring spring-security