偶遇springboot+CROS解决跨域的问题

问题:一个项目总有一些公开的接口,而这些接口用于提供对外的请求。

跨域请求

当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

什么是同一个域?

同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。

什么是跨域:

跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

也就是如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容 
如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。

解决方案:

前端的解决方案请各位参考百度

后端解决跨域问题:

代码如下:

在项目中的MyWebAppConfigurer 里面添加一个方法addCorsMappings

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
        .allowCredentials(true)
        .maxAge(3600);
    }
}
具体含义解释一下:registry.addMapping("/**"),参数中可以这样写("/api/**"),就是映射哪些公开的接口的前缀,比如是处理映射以api为前缀的接口;.allowedOrigins("*"),参数是可以申请访问的主机的IP,其他网站的域名,可以("http://192.168.0.101")或者("http://192.168.0.101:8080");.allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")都可以看出来这里是限定请求的方式;.allowCredentials(true)该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。

当我在项目中的MyWebAppConfigurer添加了这些代码后,跨域请求解决了初步的问题。因为能访问到了,但是提示”Access-Control-Allow-Origin

关于提示”Access-Control-Allow-Origin”问题解决方案:

问题描述:

XMLHttpRequest cannot load http://xxxxxxxxxx/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

需要再SpringBoot2配置跨域过滤器允许跨域访问。

跨域过滤器配置

找到Filter所在的位置,或者自己找个合适的位置,新建一个Filter。在doFilter方法中写入代码即可。

@Component

public class CorsFilter implements Filter {

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) res;

response.setHeader("Access-Control-Allow-Origin", "*");

response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, GET");

response.setHeader("Access-Control-Max-Age", "3600");

response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

chain.doFilter(req, res);

}

@Override

public void init(FilterConfig filterConfig) {

}

@Override

public void destroy() {

}

}

启动项目,问题解决,跨域请求问题就ok了。

http://www.ruanyifeng.com/blog/2016/04/cors.html;跨域请求的资源详解

https://blog.csdn.net/moshowgame/article/details/80364904;Access-Control-Allow-Origin问题解决方案

 

你可能感兴趣的:(springboot)