1.声明
当前的内容用于本人学习和复习的作用,主要用于解决当前的跨域的问题!
什么是跨域?个人理解就是:使用一个端口访问另外一个端口中的内容,这就存在跨域问题,一般是由于浏览器出于安全设定,不允许跨域请求
,但是某些时候又需要跨域的支持(例如:前后端分离的项目,前端在一个端口,后端在另外一边,但是前端需要访问后端获取数据
)
2.不配置跨域直接访问
这里报了一大堆的错误,通过debug发现请求到达了SpringMVC中,但是没有数据返回
3.SpringBoot中配置跨域(当你的Spring版本大于或等于4.2版本时可以使用)
从当前的SpringBoot中的CROS中可以知道
只有Spring版本从4.2开始才有跨域支持!
1.使用的方式用@Controller和@CrossOrgin一起使用,可以实现跨域!
2.使用定义全局的跨域配置:可以通过实现WebMvcConfigurer并重写addCorsMappings方法来实现跨域
使用第二种方式实现跨域:(这里我使用配置类方式)
/**
* @description 当前的跨域的配置
* @author hy
* @date 2020-03-28
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH").maxAge(3600);
}
}
这里的意思就是配置跨域映射为访问任意的Mapping,就是允许任意地方访问这个
4.另外一种通用的配置(基于Filter方式实现的跨域)
@Order(value = 1)
@WebFilter(filterName = "myCorsFilter", urlPatterns = "/*")
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
ResponseFacade response = (ResponseFacade) servletResponse;
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", "*");
chain.doFilter(servletRequest, servletResponse);
}
}
注意:
1.使用这个注解方式需要开启@ServletComponentScan在@Configuration类的上面
2.由于当前Spring的版本中可能已经注册了CorsFilter
,注意当前的filterName可能不能为corsFilter
,出现两个名称一致的Filter,就会报错!
这个是SpringBoot 2.2.5.RELEASE,中已经存在的CorsFilter
如果时在SpringMVC环境中需要在web.xml中配置Filter!
5.总结
1.跨域可能导致不能访问的情况,解决需要按照特定的方式解决
2.使用过滤器方式实现,需要小心当前SpringBoot中是否已经注册了名称为corsFilter,否则报错,需要修改filterName
3.使用注解方式实现的缺点就是每个类都需要配置一次,复杂
4.建议使用添加addCorsMappings方式更加简单,但是需要注意你的Spring的版本,否则无效
!
5.我们需要按照不同的情况实现不同的跨域方式!
以上纯属个人见解,如有问题请联系本人!