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());
}
}
注意事项
- 安全性:生产环境中应避免使用
allowedOrigins("*"),需明确指定可信域名。 - 预检请求(Preflight):复杂请求(如
Content-Type: application/json)会先发送OPTIONS请求,需配置Access-Control-Allow-Headers。 - 凭证模式:若请求带 Cookie,需设置
Access-Control-Allow-Credentials: true,且Allow-Origin不能为通配符*。

被折叠的 条评论
为什么被折叠?



