Tomcat Jersey 在 "OPTIONS" 飞行前请求时阻止服务器
Tomcat Jersey blocks server on "OPTIONS" pre-flight request
我是 运行 在过去一年左右的 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");
}
}
奇怪的是,删除当前 tomcat 并放置一个新副本解决了这个问题。
我是 运行 在过去一年左右的 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");
}
}
奇怪的是,删除当前 tomcat 并放置一个新副本解决了这个问题。