springboot处理跨域请求

在Spring Boot中处理跨域请求(CORS, Cross-Origin Resource Sharing)通常有几种方法。跨域请求是指从一个域名的网页去请求另一个域名下的资源。为了安全起见,浏览器会阻止这种请求,除非服务器明确允许。

方法一:使用@CrossOrigin注解

这是最简单的方法,直接在Controller类或方法上使用@CrossOrigin注解来指定允许跨域的来源。例如:

@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

如果要对所有来源开放,可以将origins属性设置为*

方法二:配置CORS全局设置

如果你需要更细粒度地控制跨域行为,或者希望整个应用都遵循相同的跨域策略,可以通过实现WebMvcConfigurer接口并重写addCorsMappings方法来全局配置CORS。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

在这个例子中:

  • addMapping("/**") 表示对所有路径生效。
  • allowedOrigins 指定了允许的源。
  • allowedMethods 指定了允许的HTTP方法。
  • allowedHeaders 指定了允许的头信息。
  • allowCredentials 设置是否支持凭证(如cookies)。
  • maxAge 设置预检请求的有效期,单位为秒。

方法三:通过过滤器实现CORS

对于更复杂的场景,可能需要通过实现过滤器(Filter)来处理跨域请求。创建一个实现了Filter接口的类,并注册到Spring容器中。

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");

        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    // 其他方法...
}

这种方法提供了最大的灵活性,但是也相对复杂一些。

选择哪种方式取决于你的具体需求。对于大多数简单的应用来说,使用@CrossOrigin注解或全局配置就足够了。对于更复杂的需求,考虑使用过滤器来实现更精细的控制。

上一篇:第九周预习报告


下一篇:【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组