首页 > 其他分享 >SpringBoot跨域访问

SpringBoot跨域访问

时间:2023-09-11 11:47:05浏览次数:46  
标签:SpringBoot springframework 访问 new configuration public 跨域

没有引入Spring Secuity的情况

Christopher 2021.10.23


  • CORS 后端 跨域
  • CORS 是一种访问机制,Cross-Origin Resource Sharing,跨域资源共享,通过在服务器端设置相应头,把发起跨域的原始域名添加到 Access-Control-Allow-Origin 中即可。

何为跨域

  • 域,即域名,跨域,即从域名 A 申请访问域名 B 的资源。其需求常发生在前后端分离项目的调试中。

具体实现

  • 添加如下覆写类
package com....; /* 自行添加 */

import org.springframework.context.annotation.Bean;
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 GlobalCorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            //重写父类提供的跨域请求处理的接口
            public void addCorsMappings(CorsRegistry registry) {
                /* 添加映射路径 */
                registry.addMapping("/**")
                        /* 放行哪些原始域 */
                        .allowedOriginPatterns("*")
                        /* 是否发送 Cookie 信息 */
                        .allowCredentials(true)
                        /* 放行哪些原始域(请求方式) */
                        .allowedMethods("GET","POST", "PUT", "DELETE")
                        /* 放行哪些原始域(头部信息) */
                        .allowedHeaders("*")
                        /* 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) */
                        .exposedHeaders("Header1", "Header2");
            }
        };
    }
}

引入Spring Security

参考一个开源的spring-jwt-demo

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                // 测试用资源,需要验证了的用户才能访问
                .antMatchers("/**").authenticated()
                // 其他都放行了
                .anyRequest().permitAll()
                .and()
                .csrf().disable()
                .cors()
                .and()
                //暴露头部信息
                .headers().addHeaderWriter(new StaticHeadersWriter(Arrays.asList(
                        new Header("Access-control-Allow-Origin","*"),
                        new Header("Access-Control-Expose-Headers","token"))))
                .and()
                .addFilter(new JWTAuthenticationFilter(authenticationManager()))
                .addFilter(new JWTAuthorizationFilter(authenticationManager()))
                // 不需要session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .exceptionHandling().authenticationEntryPoint(new JWTAuthenticationEntryPoint())
                .accessDeniedHandler(new JWTAccessDeniedHandler());
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(List.of("*"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        //暴露头部信息
        configuration.addExposedHeader("token");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

参考资料:

标签:SpringBoot,springframework,访问,new,configuration,public,跨域
From: https://www.cnblogs.com/amorfati/p/17693119.html

相关文章

  • 关于spring的注解作用(springboot相较于spring 的不同)
      springboot的@Bean注解作用在方法上,它会将这个方法返回的类型实例注入spring容器。  <bean>标签代表一个实例(或对象),而不是一个类型。在Spring中,<bean>标签用于声明和配置一个bean实例。当我们在XML配置文件中使用<bean>标签时,我们定义的是一个具体的b......
  • 分享一个 SpringBoot + Redis 实现「查找附近的人」的小技巧
    前言SpringDataRedis提供了十分简单的地理位置定位的功能,今天我就用一小段代码告诉大家如何实现。正文1、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、更......
  • SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)
    背景一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志。比如:XX人创建了一条订单,订单号:XXXXXXXXX因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日志和业务代码融在一起。我们当然要杜绝这种现象,一定会有更好的解决方案。当前项目除了......
  • SpringBoot创建Thymeleaf
    1.pom.xml导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 2.thymelef的默认配置文件springboot工程默认有一个templates文件夹,所有的html页面都放这个文件夹里。......
  • Django管理后台访问和登录页面访问数据不一致的问题
    Django管理后台访问和登录页面访问数据不一致的问题问题现象我再创建商品购物车功能后,发现这个功能页面需要放在管理后台。在测试功能时是直接配置路由访问http://localhost:8088/view_cart/是可以正常加载购物车的相关功能的,然后将购物车功能加到管理后台,添加之后发现没有查到......
  • 纯前端也可以访问文件系统!
    前言周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它居然真的可以打开我本地的项目代码!难道又出了新的API让......
  • SpringBoot 如何实现文件上传和下载
    当今Web应用程序通常需要支持文件上传和下载功能,SpringBoot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍SpringBoot如何实现文件上传和下载,同时提供相应的代码示例。 文件上传SpringBoot提供了Multipart文件上传的支持。Multipart是HTTP协议中的一种......
  • 实现读写分离SpringBoot+MyBatis+Druid
    实现读写分离SpringBoot+MyBatis+Druid1.读写分离概念理解读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程......
  • 在springboot项目种引入element组件
    1、保证vue的版本在3以上2、Win+R--打开命令行窗口(cmd)输入下面的命令,打开图形化界面:vueui3、打开我们创建的vue项目选择路径即可自主导入项目;4、安装element-ui的插件依赖5、查看项目中是否存在ok!......
  • 基于SpringBoot的高校党员信息管理系统的设计与实现-计算机毕业设计源码+LW文档
    摘要:中国的高校线上党建在国内有着非常好的使用前景,所以决定开发基于SpringBoot的高校党员信息管理系统。本系统能够满足党员的日常学习的需要,以及适应现代化党员管理的需求。本系统开发设计思想是实现在线管理的数字化。达到帮助高校进行网上管理,使党员管理工作更加高效的目的。......