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

时间:2018-05-15 17:45:46

标签: java tomcat jersey cors preflight

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

以前工作正常的API项目之一通常需要很长时间来处理飞行前的“OPTIONS”请求。它确实响应,但它有一个非常随机的行为,有时它需要5-10秒,其他它在几毫秒内服务它。

Problem shown in Chrome Dev tools - 1

Problem shown in Chrome Dev tools - 2

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

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

我尝试过的事情:

  1. 删除所有maven依赖项。
  2. 清理项目,在IDE中重新导入它们,重新开​​始回购。
  3. 确保没有死锁或无限循环。
  4. 过滤代码:

    @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");
        }
    
    
    }
    

1 个答案:

答案 0 :(得分:0)

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