1.首先我们项目是个前后端分离项目,当我们前端访问后端时出来了一下页面时
就出现了CROS跨越问题,导致我们访问不到我们后端的请求, 所以我就总结了下解决方案
首先介绍CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
- 浏览器端:
目前,所有浏览器都支持该功能(IE10以下不行)。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。
- 服务端:
CORS通信与AJAX没有任何差别,因此你不需要改变以前的业务逻辑。只不过,浏览器会在请求中携带一些头信息,我们需要以此判断是否运行其跨域,然后在响应头中加入一些信息即可。这一般通过过滤器完成即可。
2.注解方式加springSecurity配置
2.1在接口或者类上打上@CrossOrigin
然后我们需要在springSecurity里面配置一下内容
//关闭csrf防护
http.csrf().disable();
// 解决跨域问题
http.cors();
然后就解决了,但是注解方式的方式的话,我们需要在每个接口或者类上打上这个注解,这样的哈就太麻烦了,所以这里我不建议使用注解方式
3.配置类加springSecurity配置
3.1 创一个config包 然后在包里创一个类打上@Configuration交给spring管理
然后配置请求方式啊,CORS信息啊等
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//1) 允许的域,不要写*,否则cookie就无法使用了
// config.addAllowedOrigin("http://127.0.0.1:8080");
config.addAllowedOrigin("*");
//2) 是否发送Cookie信息
config.setAllowCredentials(true);
//3) 允许的请求方式
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
// 4)允许的头信息
config.addAllowedHeader("*");
//2.添加映射路径,我们拦截一切请求
UrlBasedCorsConfigurationSource configSource = new
UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}
然后我们也需要在SpringSecurty里面配置
// 授权规则配置
@Override
protected void configure(HttpSecurity http) throws Exception {
//关闭csrf防护
http.csrf().disable();
// 解决跨域问题
http.cors();
http.authorizeRequests() //授权配置
//登录路径放行
.antMatchers("/login").permitAll()
.anyRequest().authenticated() //其他路径都要认证之后才能访问
.and().formLogin() //允许表单登录
// 设置登陆成功页
.successForwardUrl("/loginSuccess")
.and().logout().permitAll() //登出路径放行
.and().csrf().disable(); //关闭跨域伪造检查
}
这样就可以了,推荐使用这种方式
3.第三种方式的话就是前端用代理类做加上SpringSecurity的配置
在前端的cofig包下的config先找到index.JS加入如下代码
proxyTable: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': '' //类似于nginx反向代理所有以api开头的访问
}
},
},
然后在main.js中引入
axios.defaults.baseURL='/api'
最后我们在SpriingSercurity里面配置如下信息就可以了,建议使用第二种当然如果是单纯的Springboot项目没有整合SpringSecurity的话,就不用管SpringSecurity的配置这些
// 授权规则配置
@Override
protected void configure(HttpSecurity http) throws Exception {
//关闭csrf防护
http.csrf().disable();
// 解决跨域问题
http.cors();
http.authorizeRequests() //授权配置
//登录路径放行
.antMatchers("/login").permitAll()
.anyRequest().authenticated() //其他路径都要认证之后才能访问
.and().formLogin() //允许表单登录
// 设置登陆成功页
.successForwardUrl("/loginSuccess")
.and().logout().permitAll() //登出路径放行
.and().csrf().disable(); //关闭跨域伪造检查
}