ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot项目针对跨域问题的三种解决方案

2021-09-22 14:36:16  阅读:170  来源: 互联网

标签:Control SpringBoot 解决方案 Access Allow 请求 public 跨域


. 什么是跨域

  • 要了解跨域,先要知道同源策略。同源策略是由 Netscape 公司提出的一个著名的安全策略,所有支持 JavaScript 的浏览器都会使用这个策略。所谓同源是指:协议,域名,端口 全部相同。

  • 浏览器从一个域名的网页去请求另一个域名的资源时,协议,域名,端口任意不同,都会出现跨域问题。

  • 现实工作开发中经常会有跨域的情况。因为公司会有很多项目,也会有很多子域名,各个项目或者网站之间需要相互调用对方的资源,所以跨域请求是避免不了的


 

2. 解决跨域的几种方案

方法一:注解

在Spring Boot 中给我们提供了一个注解 @CrossOrigin 来实现跨域,这个注解可以实现方法级别的细粒度的跨域控制。我们可以在类或者方添加该注解,如果在类上添加该注解,该类下的所有接口都可以通过跨域访问,如果在方法上添加注解,那么仅仅只限于加注解的方法可以访问。

示例:
    @RestController
    @RequestMapping("/user")
    @CrossOrigin
    public class UserController {
       @Autowired
        private UserService userService;

       @RequestMapping("/findAll")
        public Object findAll(){
            return userService.list();
        }
    }

 

方法二:实现 WebMvcConfigurer

这里可以通过实现 WebMvcConfigurer 接口中的 addCorsMappings() 方法来实现跨域。

    @Configuration
    public class WebConfig implements WebMvcConfigurer {

        /**
         * 跨域支持
         * @param registry
         */
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowCredentials(true)
                    .allowedMethods("GET", "POST", "DELETE", "PUT")
                    .allowedHeaders(*)
                    .maxAge(3600 * 24);
        }
    }

addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://www.baidu.com",只有百度可以访问我们的跨域资源。
allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以
allowedMethods:允许输入参数的请求方法访问该跨域资源服务器,如:POST、GET、PUT、OPTIONS、DELETE等。
allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-YAUTH-TOKEN"
maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。


 

方法三:Nginx 配置解决跨域问题

如果我们在项目中使用了Nginx,可以在Nginx中添加以下的配置来解决跨域

    location / {
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Headers X-Requested-With;
       add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

       if ($request_method = 'OPTIONS') {
         return 204;
       }
    }

方法四:Filter

我们可以通过实现Fiter接口在请求中添加一些Header来解决跨域的问题:

@Component
public class CORSFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("ok");
            return;
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}
 




标签:Control,SpringBoot,解决方案,Access,Allow,请求,public,跨域
来源: https://www.cnblogs.com/yongyuankuaile/p/15319697.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有