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页面左右,并玩弄错误参数。简而言之,我的问题是:
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过滤器介绍及使用(传递数据拦截请求和异常处理)