在我的 Web 应用程序中,我使用 Spring Security 和 Spring MVC。
我已经使用了几种方法@Secured
注释并以这样一种方式配置 Spring Security:当没有适当角色的情况下访问其中一个方法时,用户将被带到登录页面。但是,当有问题的请求来自 Ajax 时,我不希望出现这种行为,因此我实现了自定义@ExceptionHandler
带注释的方法来确定请求的上下文。
这是我的异常处理程序:
@ExceptionHandler(AccessDeniedException.class)
public void handleAccessDeniedException(AccessDeniedException ex, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (isAjax(request)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
} else {
throw ex;
}
}
这样我就可以自己处理异常(例如,记录访问@Secured
方法),然后让 Spring 发挥其作用,通过重新抛出 AccessDeniedException 将用户重定向到登录页面。另外,当请求来自 Ajax 时,我将响应状态设置为SC_UNAUTHORIZED
并在客户端处理错误。
现在,这个seems工作正常,但每次我重新抛出异常时都会收到以下错误handleAccessDeniedException
method:
ERROR org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: public void app.controller.BaseController.handleAccessDeniedException(org.springframework.security.access.AccessDeniedException,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception
org.springframework.security.access.AccessDeniedException:
at app.controller.BaseController.handleAccessDeniedException(BaseController.java:23)
at app.controller.BaseController$$FastClassByCGLIB$$8f052058.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
(...)
我没有向 spring xml 配置文件添加任何异常处理细节。
我没有看到应用程序本身有任何问题,但错误确实存在,而且由于我对 Spring MVC 和 Spring Security 很陌生,我猜测我没有正确执行此操作。有什么建议么?谢谢!
您的异常处理程序不应引发另一个异常。它应该处理它并发送响应。这是个好主意检查代码 https://github.com/SpringSource/spring-framework/blob/0758e7246578c766bbd76e56aa39ecd1144c13e1/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java#L324如果你从一个类中得到一个错误,看看它的行为如何。
对于非 ajax 情况,如果您想要的话,最好将响应重定向到登录页面。或者,您可以自定义AuthenticationEntryPoint
由 Spring Security 使用并省略AccessDeniedExceptions
来自 MVC 处理。该行为本质上与默认行为相同LoginUrlAuthenticationEntryPoint
但您可以扩展它以在检测到 ajax 请求时返回 403。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)