2

我有这个 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

4

1 回答 1

0

试试这篇文章底部的过滤器。在 CORS 交互方面,仅使用响应过滤器将无法正确执行。您还需要一个请求过滤器来中止预检请求的请求。

于 2020-01-31T16:17:13.837 回答