初阶问题:HTTP 请求跨域的原因,JavaEE 后端如何配置解决

HTTP 请求跨域的原因

跨域问题是由于浏览器的同源策略(Same-Origin Policy)导致的。同源策略要求请求的协议、域名、端口必须完全一致,否则会被视为跨域请求。常见的跨域场景包括:

  • 不同域名(如 example.com 请求 api.example.com
  • 不同协议(如 http:// 请求 https://
  • 不同端口(如 8080 请求 8081

浏览器会拦截跨域请求的响应,除非服务器明确允许。


JavaEE 后端解决跨域的配置方法

方法一:使用 @CrossOrigin 注解(Spring 框架)

在控制器类或方法上添加注解,允许指定来源的跨域请求:

@RestController
@CrossOrigin(origins = "http://example.com") // 允许特定域名
public class MyController {
    @GetMapping("/data")
    public String getData() {
        return "response";
    }
}

方法二:全局配置 CORS(Spring 框架)

通过实现 WebMvcConfigurer 配置全局跨域规则:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*") // 允许所有域名(生产环境应限制)
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*");
    }
}

方法三:手动设置响应头(Servlet 原生)

在 Servlet 中通过 response.setHeader 添加 CORS 头:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "GET, POST");
    // 其他必要头...
}

方法四:使用过滤器(Filter)

通过过滤器统一处理跨域头:

@WebFilter("/*")
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        chain.doFilter(req, res);
    }
}

方法五:JAX-RS 配置(如 Jersey)

在 JAX-RS 应用中使用 CorsFilter

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new CorsFilter());
    }
}


注意事项

  1. 安全性:生产环境中应避免使用 allowedOrigins("*"),需明确指定可信域名。
  2. 预检请求(Preflight):复杂请求(如 Content-Type: application/json)会先发送 OPTIONS 请求,需配置 Access-Control-Allow-Headers
  3. 凭证模式:若请求带 Cookie,需设置 Access-Control-Allow-Credentials: true,且 Allow-Origin 不能为通配符 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值