一级建设造师网站,创意个人网页设计,昆山市建设监察大队网站,河北seo技术交流前后端分离大势所趋#xff0c;跨域问题更是老生常谈#xff0c;随便用标题去google或百度一下#xff0c;能搜出一大片解决方案#xff0c;那么为啥又要写一遍呢#xff0c;不急往下看。 文章目录 问题背景#xff1a;解决办法#xff1a;第一种办法#xff1a;第二种…前后端分离大势所趋跨域问题更是老生常谈随便用标题去google或百度一下能搜出一大片解决方案那么为啥又要写一遍呢不急往下看。 文章目录 问题背景解决办法第一种办法第二种方法第三种方法 问题背景 Same Origin Policy译为“同源策略”。它是对于客户端脚本 尤其是JavaScript的重要安全度量标准其目的在于防止某个文档或者脚本从多个不同“origin”源装载。 它认为自任何站点装载的信赖内容是不安全的。 当被浏览器半信半疑的脚本运行在沙箱时它们应该只被允许访问来自同一站点的资源而不是那些来自其它站点可能怀有恶意的资源。 注具有相同的Origin也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同那么该资源就将被认为是从不同的Origin得来的进而不被允许访问。 CORS就是为了解决SOP问题而生的当然CORS不是唯一的解决方案不过这里不赘述其他解决办法了。
解决办法
第一种办法
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
Configuration
public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping(/**).allowedOrigins(*).allowedMethods(GET, HEAD, POST, PUT, DELETE, OPTIONS).allowCredentials(true).maxAge(3600).allowedHeaders(*);}
}这种方式是全局配置的网上也大都是这种解决办法但是很多都是基于旧的spring版本比如 WebMvcConfigurerAdapter 在spring5.0已经被标记为Deprecated点开源码可以看到
/*** An implementation of {link WebMvcConfigurer} with empty methods allowing* subclasses to override only the methods theyre interested in.** author Rossen Stoyanchev* since 3.1* deprecated as of 5.0 {link WebMvcConfigurer} has default methods (made* possible by a Java 8 baseline) and can be implemented directly without the* need for this adapter*/
Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {}
像这种过时的类或者方法spring的作者们一定会在注解上面说明原因并告诉你新的该用哪个这是非常优秀的编码习惯点赞
spring5最低支持到jdk1.8所以注释中明确表明你可以直接实现WebMvcConfigurer接口无需再用这个适配器因为jdk1.8支持接口中存在default-method。
第二种方法
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
WebFilter(filterName CorsFilter )
Configuration
public class CorsFilter implements Filter {Overridepublic 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-Credentials, true);response.setHeader(Access-Control-Allow-Methods, POST, GET, PATCH, DELETE, PUT);response.setHeader(Access-Control-Max-Age, 3600);response.setHeader(Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept);chain.doFilter(req, res);}
}这种办法是基于过滤器的方式方式简单明了就是在response中写入这些响应头好多文章都是第一种和第二种方式都叫你配置其实这是没有必要的只需要一种即可。
这里也吐槽一下大家不求甚解的精神。另外关注公众号Java技术栈在后台回复面试可以获取我整理的 Spring Boot 面试题和答案。
第三种方法
public class GoodsController {
CrossOrigin(origins http://localhost:4000)
GetMapping(goods-url)
public Response queryGoodsWithGoodsUrl(RequestParam String goodsUrl) throws Exception {}
} 没错就是CrossOrigin注解点开注解
Target({ ElementType.METHOD, ElementType.TYPE })
Retention(RetentionPolicy.RUNTIME)
Documented
public interface CrossOrigin {}从元注解Target可以看出注解可以放在method、class等上面类似RequestMapping也就是说整个controller下面的方法可以都受控制也可以单个方法受控制。
也可以得知这个是最小粒度的cors控制办法了精确到单个请求级别。
以上三种方法都可以解决问题最常用的应该是第一种、第二种控制在自家几个域名范围下足以一般没必要搞得太细。
这三种配置方式都用了的话谁生效呢类似css中样式就近原则懂了吧。
所以在开发新项目时不需要等联调时候让前端来找你了我早就解决了跨域问题。 来源:https://www.cnblogs.com/javastack/p/14255114.html 来源:https://www.telami.cn/2019/springboot-resolve-cors/