如何在 Jersey 中处理 HeaderValueException

问题描述 投票:0回答:1

我们有 Jersey + Spring 的 REST 端点,当我们使用格式错误的标头值向端点发出请求时。例如

Accept: application/json/foobar
抛出带有 HeaderValueException 的异常。

这反过来会生成一个带有错误请求的 HTML 页面,并泄漏有关我们正在运行的服务器的信息。

查看球衣代码,似乎 HeaderValueException 的处理方式不同,我似乎无法使 ExceptionMapper 处理它。 (https://jar-download.com/artifacts/org.glassfish.jersey.core/jersey-server/2.7/source-code/org/glassfish/jersey/server/ServerRuntime.java在注释//内部映射下)

在这种特殊情况下,我们希望返回自定义 JSON。

我们如何确保所有异常,甚至 HeaderValueException 都在我们的控制之下?

注意:执行此操作时,我们的 Endint 尚未被调用..

java jersey glassfish
1个回答
0
投票

Jersey ExceptionMappers 对此不起作用,因为请求在堆栈中较早失败,异常映射器可以从该堆栈开始处理异常。对于 Content-Type 标头的错误标头值,实际上是在 here .

设置响应

处理错误的一种方法是实现一个重写 Response.SendError() 方法的 Servlet Filter,这就是您可以对错误进行自定义处理的地方。

这是一些伪代码:

public class MyErrorFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
      HttpServletResponse httpResponse = (HttpServletResponse) response;

      HttpServletResponseWrapper modifiedResponse =
          new HttpServletResponseWrapper(httpResponse) {
          @Override
          public void sendError(int sc, String msg) throws IOException {
              // Custom error handling here.
          }

      chain.doFilter(request, modifiedResponse);      
  }

}

然后您可以通过

web.xml
或您的自定义
Application
类在球衣应用程序中注册组件,从而注册此过滤器。

© www.soinside.com 2019 - 2024. All rights reserved.