Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器

Posted

技术标签:

【中文标题】Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器【英文标题】:Tomcat Jersey blocks server on "OPTIONS" pre-flight request 【发布时间】:2018-10-25 15:37:39 【问题描述】:

我在过去一年左右运行 Tomcat 7 服务器,上面有多个球衣项目。

以前运行良好的 API 项目之一通常需要很长时间来处理飞行前的“OPTIONS”请求。它确实会响应,但它的行为非常随机,有时需要 5 到 10 秒,有时它会在几毫秒内完成。

Problem shown in Chrome Dev tools - 1

Problem shown in Chrome Dev tools - 2

服务器在很长一段时间(5 - 10 秒)后收到请求以服务 OPTIONS 请求(通过向服务器接收的第一段代码添加调试指针来验证。)。问题是它阻塞了整个服务器,并且服务器无法处理任何额外的请求,直到预检被清除。

注意:如果从 POSTMAN 发出请求,则不会出现此问题,只有外部和跨源工具会导致此问题。

我尝试过的事情:

    删除所有 maven 依赖项。 清理项目,在 IDE 中重新导入它们,重新克隆 repo。 确保没有死锁或无限循环。

过滤代码:

@PreMatching
@Priority(value = 1)
@Provider
public class EnterpriseAPIRequestFilter implements ContainerRequestFilter 
    @Context
    private HttpServletRequest sr;
    private Logger logger = Logger.getLogger(EnterpriseAPIRequestFilter.class);

    public void filter(ContainerRequestContext ctx) throws IOException 

        logger.info("Request Received for :" + sr.getPathInfo());
        logger.info("Remote IP :" + sr.getRemoteAddr());
        logger.info("Remote Host :" + sr.getLocalAddr());
        Authenticator authenticator = new Authenticator();
        MultivaluedMap<String, String> headers = ctx.getHeaders();
        String role = headers.getFirst("channelRole");
        String locale = headers.getFirst("locale");

        if (sr.getMethod().equalsIgnoreCase("OPTIONS"))
            return;

       //MORE CODE EXISTS HERE.


    



@Provider
public class CORSResponseFilter
implements ContainerResponseFilter 

    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)throws IOException 
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Methods", "OPTIONS, GET, POST, DELETE, PUT");         
        headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia, channelRole, channelauthkey,channeltype,channelname,channelidentifier,orgid,id,channelOrgId,key,employeeId,subRole");
    



【问题讨论】:

一个想法。我可以建议您强制您的服务器使用 -Dsun.net.inetaddr.ttl=-1 和 -Dnetworkaddress.cache.negative.ttl=0 缓存 DNS。文档 here 和 here @EugèneAdell 没用。 【参考方案1】:

奇怪的是,删除当前的 tomcat 并放置它的新副本解决了这个问题。

【讨论】:

@EugèneAdell 但是当我生成 .war 文件并将其部署在另一台服务器上时,该问题也会在该服务器上持续存在。这就是我认为项目本身一定有问题的原因。

以上是关于Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器的主要内容,如果未能解决你的问题,请参考以下文章

依赖注入在使用 Jersey 和 OpenWebBeans 的 Tomcat 7 上不起作用

如何将 Swagger 与 Maven + Java + Jersey +Tomcat 集成

Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面

IntelliJ IDEA + Maven + Tomcat + Jersey搭建RESTful服务

如何在 Tomcat 上的 JAX-RS (Jersey) 中返回 HTTP 404 JSON/XML 响应?

jersey + tomcat 实现restful风格