Springboot整合springSecurity过后的跨域问题解决方案

2022-07-01 08:17:39

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();                        //关闭跨域伪造检查
    }
  • 作者:想成为大佬的小卒!
  • 原文链接:https://blog.csdn.net/m0_58046039/article/details/122669348
    更新时间:2022-07-01 08:17:39