java解决CORS跨域问题【总结】

在 Java 后端处理 CORS 错误,一般需要通过设置响应头信息来实现。具体而言,可以在响应头中添加 Access-Control-Allow-Origin 等相关的 CORS 头信息,以告诉浏览器该请求是否允许跨域访问。

一、出现原因

为了维护浏览器的安全,指定了同源策略也就是域名、协议、端口均相同的才能进行访问,当页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,就会被浏览器拦截

示例:

1.1 端口不同

html 复制代码
http://localhost:8080/index.html
http://locahost/user     //(默认80)

1.2 域名不同

html 复制代码
http://abc.com
http://abd.com/post/

1.3 协议不同

html 复制代码
http://abc.com
https://abc.com

二. 解决办法(二选一)

2.1 使用过滤器:

Java Servlet 规范提供了 Filter 接口,可以用于在请求和响应之间添加额外的处理逻辑。你可以编写一个过滤器来拦截所有的请求,并在响应头中添加 CORS 相关的头信息。例如:

java 复制代码
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
@Component
public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化方法,可以留空
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        
        // 设置允许访问的来源地址,这里设置为允许任何来源进行跨域请求
        response.setHeader("Access-Control-Allow-Origin", "*");
        
        // 设置允许的请求方法,如 GET、POST 等
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        
        // 设置允许的请求头信息
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        
        // 继续执行过滤器链
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        // 销毁方法,可以留空
    }
}
  • 在上述示例中,我们通过设置 Access-Control-Allow-Origin 头信息为 *,表示允许任何来源进行跨域请求。
  • 在上面的示例中,我们使用 @WebFilter("/") 注解标记了这是一个过滤器,并且指定了需要过滤的 URL 模式为 "/",即所有的请求。当你的 Servlet 容器支持 Servlet 3.0 及以上的规范时,就可以使用这种方式来配置过滤器,而不必再使用传统的 web.xml 文件。
  • 如果你的项目运行在较老的 Servlet 容器中,可能不支持基于注解的方式,这时你仍然需要在 web.xml 中进行过滤器的显式声明。如下
xml 复制代码
<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>com.example.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2.2 定义Configuration

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 

@Configuration
public class CorsConfig {
    /**
     * 跨域过滤器
     * @return
     */
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        /** 允许任何域名使用 */
//        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedOriginPattern("*");
        /** 允许的请求头 */
        corsConfiguration.addAllowedHeader("*");
        /** 允许的方法 */
        corsConfiguration.addAllowedMethod("*");
 
        corsConfiguration.addExposedHeader("Set-Cookie");
        corsConfiguration.setAllowCredentials(true);
        return corsConfiguration;
    }
 
}
  • 这里只需要对域名、头、使用方法设置"*",即全部允许就可以了。
  • 注解释义:
    @Configuration 标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
    @Bean 标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象
相关推荐
第二只羽毛18 分钟前
重载和继承的实践
java·开发语言
王嘉俊92523 分钟前
设计模式--适配器模式:优雅解决接口不兼容问题
java·设计模式·适配器模式
王嘉俊92525 分钟前
设计模式--组合模式:统一处理树形结构的优雅设计
java·设计模式·组合模式
道199332 分钟前
50 台小型无人车与50套穿戴终端 5 公里范围内通信组网方案深度研究
java·后端·struts
迎風吹頭髮37 分钟前
UNIX下C语言编程与实践35-UNIX 守护进程编写:后台执行、脱离终端、清除掩码与信号处理
java·c语言·unix
光军oi1 小时前
全栈开发杂谈————JAVA微服务全套技术栈详解
java·开发语言·微服务
帮帮志1 小时前
目录【系列文章目录】-(关于帮帮志,关于作者)
java·开发语言·python·链表·交互
聪明的笨猪猪1 小时前
Java Spring “MVC ”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
qiuiuiu4131 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
草莓熊Lotso1 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list