为什么 CORSFilter 与 ExceptionMapper<Throwable> 冲突?
Why CORSFilter conflicts with ExceptionMapper<Throwable>?
我有这个 Java thorntail 应用程序,我想在其中捕获所有未捕获的异常。
我想用 500 而不是 JAXRS 提供的默认错误页面来响应,所以我只使用了 ExceptionMapper<Throwable>
的实现。
使用 Postman 进行的测试是否没有问题,但是一旦我尝试在浏览器中进行 AJAX 调用,我最终发送了失败的 OPTIONS 请求。
CORS部分也是通过实现ContainerResponseFilter
在应用端实现的。
我有一种感觉,MATCHING 发生在请求的早期阶段,只有在后期 CORSFilter 才会对响应产生影响。
我已经尝试过的一些东西:
- @PreMatching
- @优先级
- 试图导入 jboss.resteasy CorsFilter
- 试图通过
exception instanceof DefaultOptionsMethodException
过滤掉异常,但最终发现 DefaultOptionsMethodException
不在类路径中,它是包含在 thorntails 类路径中的内部 (?) 包 (??)
- ...
// CORSFilter
package com.testapplication.test.rest;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
responseContext.getHeaders().add("Access-Control-Max-Age", "-1");
responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
}
// UncaughtExceptionMapper
package com.testapplication.test.rest;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class UncaughtExceptionMapper extends Throwable implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
exception.printStackTrace();
return Response.status(500).entity("{\"message\": \"a\"}").build();
}
}
示例存储库:https://github.com/trimpirim/cors-filter-conflict-exception-mapper
试试 this post 底部的过滤器。就 CORS 交互而言,仅使用响应过滤器将无法正确执行。您还需要一个请求过滤器来中止预检请求。
我有这个 Java thorntail 应用程序,我想在其中捕获所有未捕获的异常。
我想用 500 而不是 JAXRS 提供的默认错误页面来响应,所以我只使用了 ExceptionMapper<Throwable>
的实现。
使用 Postman 进行的测试是否没有问题,但是一旦我尝试在浏览器中进行 AJAX 调用,我最终发送了失败的 OPTIONS 请求。
CORS部分也是通过实现ContainerResponseFilter
在应用端实现的。
我有一种感觉,MATCHING 发生在请求的早期阶段,只有在后期 CORSFilter 才会对响应产生影响。
我已经尝试过的一些东西:
- @PreMatching
- @优先级
- 试图导入 jboss.resteasy CorsFilter
- 试图通过
exception instanceof DefaultOptionsMethodException
过滤掉异常,但最终发现DefaultOptionsMethodException
不在类路径中,它是包含在 thorntails 类路径中的内部 (?) 包 (??) - ...
// CORSFilter
package com.testapplication.test.rest;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
responseContext.getHeaders().add("Access-Control-Max-Age", "-1");
responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
}
// UncaughtExceptionMapper
package com.testapplication.test.rest;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class UncaughtExceptionMapper extends Throwable implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
exception.printStackTrace();
return Response.status(500).entity("{\"message\": \"a\"}").build();
}
}
示例存储库:https://github.com/trimpirim/cors-filter-conflict-exception-mapper
试试 this post 底部的过滤器。就 CORS 交互而言,仅使用响应过滤器将无法正确执行。您还需要一个请求过滤器来中止预检请求。