前端Ajax请求Tomcat10部署的Jersey接口出现CORS跨域错误如何解决
解决Jersey+Tomcat10环境下的CORS跨域错误方案
你的问题是前端服务端口(8083)和后端服务端口(8085)不符合浏览器同源策略要求,所以被CORS规则拦截了,按照以下任意一种方案配置即可解决:
方案1:Tomcat项目级CORS过滤器配置(无需修改业务代码,优先推荐)
直接在你的web.xml中添加以下过滤器配置,放在原有servlet配置之前即可:
<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <!-- 允许的前端源,开发阶段可以写*,生产环境替换为实际前端域名 --> <param-value>http://localhost:8083</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,PUT,DELETE,OPTIONS,HEAD</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <!-- 如果需要传递Cookie等凭证设为true,此时allowed.origins不能用* --> <param-value>false</param-value> </init-param> <init-param> <param-name>cors.preflight.maxage</param-name> <param-value>1800</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
配置完重启Tomcat即可生效。
方案2:Jersey服务端自定义CORS配置
如果不想修改Tomcat相关的过滤器配置,可以通过Jersey的扩展机制实现:
- 第一步:新建CORS过滤器类,放在
com.demoRest包下即可被Jersey自动扫描加载:
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.ext.Provider; import java.io.IOException; @Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:8083"); responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); responseContext.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, X-Requested-With"); // 处理OPTIONS预检请求 if ("OPTIONS".equals(requestContext.getMethod())) { responseContext.setStatus(200); } } }
- 第二步:重启后端服务即可生效。
注意事项
- 生产环境不要直接配置
*作为允许的源,要明确指定前端实际的访问域名,避免安全风险 - 如果配置了允许携带凭证(比如需要传递Cookie),允许的源不能使用
*,必须填写具体的源地址
内容的提问来源于stack exchange,提问作者It's Siddiqi
相关产品推荐
相关产品推荐

