java中的Servlet/过滤器特定异常处理

Posted

技术标签:

【中文标题】java中的Servlet/过滤器特定异常处理【英文标题】:Servlet/filter specific exception handling in java 【发布时间】:2015-07-07 00:37:45 【问题描述】:

我有一个扩展 HttpServlet 并实现 GET 请求的 servlet。我还使用映射到上述 servlet url 的过滤器(来自外部库)。现在过滤器抛出异常,正如预期的那样,我得到了这个

严重:Servlet.service() for servlet [myServlet] 在上下文中 路径 [] 抛出异常

我知道error-page 描述可能是捕获此异常的标准方法,但是有没有办法从特定的 servlet 过滤器中捕获异常?我已经有一个 error-page 描述并重定向到一个简单的 html 页面。我也不想重定向到一个jsp页面左右,并玩弄错误参数。简而言之,我的问题是:

是否有更简单、优雅的方法来捕获特定 servlet 的异常并处理它们? error-page 描述符似乎没有任何字段可以选择引发异常的 servlet。 如果过滤器抛出的异常不是自定义异常,是否可以捕获特定过滤器中发生的异常并处理它们?

【问题讨论】:

这是一个已检查或未检查的异常? 异常是ArrayIndexOutOfBoundsException,其原因是已知的,来自用户的无效输入。这记录在过滤器文档中,这是否归类为已检查异常?问题是,它也可能是“NullPointerException”,我希望能够知道它来自特定过滤器。 那个异常没有被选中。但是如果这个过滤器是你的,你为什么不在过滤器本身修复它呢?如果你知道它可以被抛出并且在这种情况下你应该返回 401,那么就这样做而不是让异常松散 过滤器不是我的,正如问题中所说,我使用外部库。 对不起,我没有正确阅读该部分...也许在此之前插入一个过滤器以检查输入正确性?但它看起来像另一个过滤器中的错误 【参考方案1】:

能不能不扩展Filter并处理super抛出的异常?

public class MyFilter extends CustomFilter

        private static final Map<String, String> exceptionMap = new HashMap<>();

        public void init(FilterConfig config) throws ServletException 
              super.init(config);
              exceptionMap.put("/requestURL", "/redirectURL");
              exceptionMap.put("/someOtherrequestURL", "/someOtherredirectURL");
        
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
           try
                   super.doFilter(request, response, chain);
              catch(Exception e)
                    //log
                    String errURL = exceptionMap.get(request.getRequestURI());
                    if(errURL != null)
                        response.sendRedirect(errURL);
                    
              
       

【讨论】:

好的,谢谢。这也许是可能的。唯一的问题是,我有一些使用相同过滤器的 servlet,因此使用此解决方案,我需要添加额外的代码来识别 servlet_name 等,并为每个 servlet 采取措施。想知道是否有任何更简单的解决方案,我可以在其中指定我正在为其处理异常的 servlet。 它还没有到达 Servlet,所以它只是一个指向 Servlet 的 url(如果没有发生异常,它将访问 Servlet)。您可以维护此类 servlet url 的映射并查找它以进行异常处理。我将编辑我的代码以显示我在说什么, 好的。它可能不会比上述更容易,除非它是作为一个功能带来的。 :) 再次感谢!

以上是关于java中的Servlet/过滤器特定异常处理的主要内容,如果未能解决你的问题,请参考以下文章

(34)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Zuul过滤器介绍及使用(传递数据拦截请求和异常处理)

JAX-WS servlet 过滤器异常

Servlet异常处理

servlet 异常处理

servlet异常处理

Servlet 笔记-异常处理