我们有 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 尚未被调用..
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
类在球衣应用程序中注册组件,从而注册此过滤器。