You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat服务器Jersey REST服务Vue前端跨域请求拦截问题求助

解决Jersey + Vue跨域请求的CORS问题

这是典型的跨域资源共享(CORS)问题——Vue前端和Jersey后端不在同一个源(域名、端口或协议任一不同),Firefox会根据同源策略拦截请求,除非后端返回正确的CORS响应头。下面是几种靠谱的解决办法,按推荐程度排序:

方法1:使用Jersey原生CORS过滤器(最通用)

这是框架层面的解决方案,适用于所有Jersey版本,能全局处理跨域请求。

  1. 创建CORS过滤器类
    新建一个实现ContainerResponseFilter的类,加上@Provider注解让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 {
        // 生产环境建议替换成你的前端实际域名,比如http://localhost:8080
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        // 允许的HTTP方法,根据你的接口需求调整
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        // 允许的请求头,比如Content-Type、Authorization等
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
        // 如果前端需要携带cookie或认证信息,开启这个(注意此时Origin不能用*)
        responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
    }
}
  1. 注册过滤器到Jersey
  • 如果用ResourceConfig配置Jersey:
import org.glassfish.jersey.server.ResourceConfig;

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // 扫描你的资源类所在包
        packages("com.yourpackage.resources");
        // 注册CORS过滤器
        register(CORSFilter.class);
    }
}
  • 如果用web.xml配置Jersey:
    在jersey.config.server.provider.packages参数里添加过滤器所在的包,比如:
<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.yourpackage.resources;com.yourpackage.filters</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

方法2:使用@CrossOrigin注解(单个资源/方法级控制)

如果只需要给特定的接口开启跨域,Jersey 2.13及以上版本支持@CrossOrigin注解,直接加在资源类或方法上:

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.server.CrossOrigin;

@Path("/login")
public class LoginResource {

    @POST
    // 允许所有源访问,指定允许的请求头
    @CrossOrigin(origins = "*", allowedHeaders = "Content-Type")
    public Response login(LoginRequest request) {
        // 你的登录逻辑
        return Response.ok("登录成功").build();
    }
}

方法3:Tomcat全局配置CORS(无需修改Jersey代码)

如果不想改动后端代码,可以直接在Tomcat的web.xml中添加全局CORS过滤器:

<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>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,PUT,DELETE,OPTIONS</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,Authorization</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

重要注意事项

  • 生产环境安全建议:不要用*作为Access-Control-Allow-Origin,最好指定你的前端实际域名(比如http://your-frontend-domain.com),避免任意网站都能访问你的接口。
  • 带凭证的请求:如果前端需要发送cookie或HTTP认证信息,必须将Access-Control-Allow-Credentials设为true,同时Access-Control-Allow-Origin不能用*,必须指定具体域名。
  • OPTIONS预检请求:浏览器会在发送复杂请求(比如POST带自定义头)前先发一个OPTIONS请求,上面的几种方案都会自动处理这个请求,不用额外写逻辑。

内容的提问来源于stack exchange,提问作者JollyRoger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:53