在我的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 @Secured完成并通过重新抛出AccessDeniedException将用户重定向到登录页面。 此外,当请求来自Ajax时,我将响应状态设置为SC_UNAUTHORIZED并在客户端处理错误。 现在,这似乎工作正常,但每次我从handleAccessDeniedException方法重新抛出异常时,我得到以下错误:

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的新手,我猜我没有正确地做到这一点。 有什么建议? 谢谢!

===============>>#1 票数:3 已采纳

您的异常处理程序不应该抛出另一个异常。 它应该处理它并发送响应。 如果从类中获取错误以查看其行为,则最好检查代码

对于非ajax情况,如果这是你想要的,你最好将响应重定向到登录页面。 或者,您可以自定义Spring Security使用的AuthenticationEntryPoint ,并从MVC处理中省略AccessDeniedExceptions 该行为基本上与默认的LoginUrlAuthenticationEntryPoint相同,但是当检测到ajax请求时,您将扩展它以返回403。

  ask by AtomHeartFather translate from so

未解决问题?本站智能推荐: