Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringMVC架构中实现站点范围的异常处理?_Java_Spring_Spring Mvc_Exception Handling_Spring Security - Fatal编程技术网

Java 如何在SpringMVC架构中实现站点范围的异常处理?

Java 如何在SpringMVC架构中实现站点范围的异常处理?,java,spring,spring-mvc,exception-handling,spring-security,Java,Spring,Spring Mvc,Exception Handling,Spring Security,注意:跳到底部的两个更新以找到答案 我有一个在Tomcat上运行的Spring(3)MVC web应用程序。此web应用程序用作远程WSDL服务层的UI。我已经编写了一个自定义AuthenticationProvider来验证此远程服务。那很好。我的问题是: 每个控制器方法或多或少都会导致对此远程WSDL的远程调用。我的计划是不让Tomcat或Spring过期会话,而是等到远程服务器告诉我会话已经过期,然后将用户重新路由到登录页面,告诉他们会话已经过期 所有其他控制器从中扩展的BaseContr

注意:跳到底部的两个更新以找到答案

我有一个在Tomcat上运行的Spring(3)MVC web应用程序。此web应用程序用作远程WSDL服务层的UI。我已经编写了一个自定义AuthenticationProvider来验证此远程服务。那很好。我的问题是:

每个控制器方法或多或少都会导致对此远程WSDL的远程调用。我的计划是不让Tomcat或Spring过期会话,而是等到远程服务器告诉我会话已经过期,然后将用户重新路由到登录页面,告诉他们会话已经过期

所有其他控制器从中扩展的BaseController具有以下方法:

protected void addBindingErrors(HttpSession session, MTAResponse response, BindingResult binding, boolean allowDefault) {
switch (response.getResponseCode()) {
case SESSION_EXPIRED:
     UserInfo nfo = (UserInfo)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
     SecurityContext context = SecurityContextHolder.getContext();
     System.out.println("token in handle session expired: " + nfo.getMtaCoreSessionId());
     if(session != null){
          System.out.println("invalidating session");
          session.invalidate();
          //1.  throw new SessionAuthenticationException("session expiredd");
          ModelAndView mav = new ModelAndView("error");
          throw new ModelAndViewDefiningException(mav);
          //3.  something else?
     }
     context.setAuthentication(null);
  break;      
case INVALID_PARAMETER_VALUE:
  binding.addError(...);
  break;
case ACCESS_DENIED:
  binding.addError(...);
  break;          
default:
  if(allowDefault){
    binding.addError(...);
    break;
  }
}
}

我已经找到了一些解决方案,但我对Spring还不熟悉,所以我不知道它们是否是“正确的”解决方案,也不知道它们是否有潜在的问题

  • (有点欺骗)在BaseController.addBindingError()方法中,如果收到远程会话过期代码,则抛出SessionAuthenticationException
    • 优点:这是可行的,自动地将用户重新路由到登录页面(我想是因为我设置了认证失败url?)
    • 缺点:我必须更改addBindingError的签名才能引发这种异常
    • 缺点:我还必须更改每个控制器方法的签名以引发这种异常,因为它们都对WSDL进行远程服务调用
    • 缺点:用户不知道他们为什么回到登录页面,我不确定有没有办法让他们知道
  • 在BaseController.addBindingError()方法中,如果收到远程会话过期代码,则引发ModelAndViewDefiningException

    • 优点:这样做可以自动将用户重新路由到相应的错误页面,该页面可以包含登录页面的链接
    • 赞成:我们可以在本页向用户解释他们是如何来到这里的
    • 缺点:我必须更改addBindingError的签名才能引发这种异常
    • 缺点:我还必须更改每个控制器方法的签名以抛出这种异常,因为它们都对远程WSDL进行远程服务调用
  • 在BaseController.addBindingError()方法中,如果收到远程会话过期代码,则抛出MyCustomRemoteSessionExpiredException,然后在SimpleMappingExceptionResolver中捕获它

    • 优点:这样做可以自动将用户重新路由到相应的错误页面,该页面可以包含登录页面的链接
    • 赞成:我们可以在本页向用户解释他们是如何来到这里的
    • 缺点:我必须更改addBindingError的签名才能引发这种异常
    • 缺点:我还必须更改每个控制器方法的签名以抛出这种异常,因为它们都对远程WSDL进行远程服务调用
  • 数字2和#3有相同的优点/缺点#3看起来这可能是一个更“正确”的解决方案。有人有任何反馈、建议或替代方案吗

    2013年5月30日更新:

    我想我可能已经找到了我想要的,我想这需要我升级到最新的Spring3.2@ControllerAvice a la la本文如下: 在BaseController.addBindingError中,我将抛出MyCustomException(它扩展了RuntimeException,这样方法签名就不需要声明throws语句),并在新的@ControllerAdvice类中处理它(该类将包含@ExceptionHandler方法)。
    有人能确认或否认这种方法吗?
    还有更好的建议吗

    谢谢

    2013年3月12日更新**


    这个问题的标题应该更好:“如何在SpringMVC架构中实现站点范围的异常处理?”。因此,我正在更改标题(前一个标题是基于我的误解,即与远程SOAP服务器的交互与我真正的问题有关)。我在五月份实施了讨论过的解决方案,效果非常好。我甚至扩展了@ControllerAdvice类来处理其他运行时异常。

    #1:Spring的
    SessionAuthenticationException
    RuntimeException
    ,因此它不会强制您更改签名#3如果您将
    MyCustomRemoteSessionExpiredException
    a
    RuntimeException
    ,则无需更改方法签名。对WS-return MTAResponse对象的每次调用?@Maksym:是的,每次调用都将是MTAResponse对象或其子类。好的,关于RuntimeException的观点很好,这在这里是合适的。还有人提到@ExceptionHandler,我需要调查一下。