【Spring security 解决跨域】

这篇具有很好参考价值的文章主要介绍了【Spring security 解决跨域】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Spring security 解决跨域】,# Spring,spring,java,后端

主页传送门:📀 传送

概述


  Spring Security是一个功能强大且高度可定制的,主要负责为Java程序提供声明式的身份验证和访问控制的安全框架。其前身是Acegi Security,后来被收纳为Spring的一个子项目,并更名为了Spring Security。Spring Security的底层主要是基于Spring AOP和Servlet过滤器来实现安全控制,它提供了全面的安全解决方案,同时授权粒度可以在Web请求级和方法调用级来处理身份确认和授权。

  跨域问题是由于浏览器的同源策略所引起的。当一个网页从一个域名(协议、域名和端口号相同)的页面向另一个域名的页面发送请求时,由于浏览器的同源策略限制,浏览器会阻止这种请求。
  Spring Security是一个安全框架,它可以防止跨站请求伪造(CSRF)攻击和其他安全漏洞。但是,它也会影响跨域请求。

方案


方案一


在Spring Security配置文件中添加CORS过滤器
1.创建一个CORSFilter类,继承WebMvcConfigurerAdapter类,并重写addCorsMappings方法

@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许跨域访问的路径
                .allowedOrigins("*") // 允许跨域访问的源
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求的方法
                .maxAge(168000) // 预检间隔时间
                .allowedHeaders("*") // 允许头部设置
                .allowCredentials(true); // 是否发送cookie
    }
}
  1. 在application.properties或application.yml文件中添加相关配置。

application.properties:

# application.properties
spring.mvc.cors.allowed-origins=*
spring.mvc.cors.allowed-methods=POST,GET,PUT,OPTIONS,DELETE
spring.mvc.cors.allow-credentials=true
spring.mvc.cors.max-age=168000

application.yml:

# application.yml
spring:
  mvc:
    cors:
      allowed-origins: *
      allowed-methods: POST,GET,PUT,OPTIONS,DELETE
      allow-credentials: true
      max-age: 168000

方案二


使用@CrossOrigin注解
在Controller类或方法上添加@CrossOrigin注解

@RestController
@RequestMapping("/api")
public class ApiController {
    
    @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600) // 允许跨域访问的源和预检间隔时间
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

  @CrossOrigin注解用于指定允许跨域访问的源和预检间隔时间。其中,origins属性表示允许跨域访问的源,maxAge属性表示预检间隔时间。

如果需要对特定的请求头进行跨域配置,则需要使用@CrossOrigin注解的headers属性

@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600, headers = "Authorization") // 允许跨域访问的源、预检间隔时间和请求头
@GetMapping("/login")
public String login() {
    return "Login Page";
}

  @CrossOrigin注解的headers属性指定了只允许携带Authorization请求头的跨域请求。

方案三


使用RestTemplate
  在Java中,使用RestTemplate解决security跨域问题,可以通过配置CORS策略来实现

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Arrays;

@Configuration
public class RestTemplateConfig implements WebMvcConfigurer {
    
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许跨域访问的路径
                .allowedOrigins("*") // 允许跨域访问的源
                .allowedMethods(Arrays.asList(HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE)) // 允许请求的方法
                .allowedHeaders("*") // 允许头部设置
                .allowCredentials(true) // 是否发送cookie
                .maxAge(3600); // 预检间隔时间
    }
    
    public static void main(String[] args) throws Exception {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.example.com/users/1"; // 请求URL
        
        RequestCallback requestCallback = restTemplate::getForEntity; // 创建请求回调对象
        ResponseExtractor<ResponseEntity<String>> responseExtractor = restTemplate::getForEntity; // 创建响应提取器对象
        
        ResponseEntity<String> response = restTemplate.execute(url, HttpMethod.GET, requestCallback, responseExtractor); // 发送请求并获取响应实体
        
        if (response.getStatusCode().is2xxSuccessful()) { // 判断响应状态码是否为2xx系列
            String result = response.getBody(); // 获取响应体内容
            System.out.println(result); // 输出响应结果
        } else {
            System.out.println("Request failed with status code: " + response.getStatusCodeValue()); // 输出请求失败的状态码
        }
    }
}

  上述代码通过实现WebMvcConfigurer接口并重写addCorsMappings方法,可以配置CORS策略。在addCorsMappings方法中,使用RestTemplate的execute方法发送请求时,会自动应用CORS策略。需要注意的是,在使用RestTemplate时,需要引入相关的依赖包

方案四


Java中,使用WebMvcConfigurer接口可以方便地解决Spring Security中的跨域问题

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 WebMvcConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许跨域访问的路径
                .allowedOrigins("*") // 允许跨域访问的源
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许请求的方法
                .allowedHeaders("*") // 允许头部设置
                .allowCredentials(true) // 是否发送cookie
                .maxAge(3600); // 预检间隔时间
    }
}

  上述代码中,通过实现WebMvcConfigurer接口并重写addCorsMappings方法,可以配置CORS策略。在addCorsMappings方法中,使用CorsRegistry对象的addMapping方法指定允许跨域访问的路径、源、请求方法、头部设置、是否发送cookie和预检间隔时间等参数。这样,在使用Spring Security进行安全认证时,就可以自动应用CORS策略,从而解决跨域问题。需要注意的是,在使用WebMvcConfigurer时,需要引入相关的依赖包

【Spring security 解决跨域】,# Spring,spring,java,后端文章来源地址https://www.toymoban.com/news/detail-644185.html

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

到了这里,关于【Spring security 解决跨域】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端进阶之路——综述Spring Security认证,授权(一)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(43)
  • 后端进阶之路——深入理解Spring Security配置(二)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(50)
  • 后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 chatgpt体验地址 继上篇后端进阶之路——深入理解Spring Security配置(二) 在内存中定义用户是一种简单的方法,适用于开发和测试环境。我们可以在Spring Security的配置类中使用 InMemoryUserDetailsManager 来定义用户。

    2024年02月14日
    浏览(33)
  • 后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ 前端炫酷代码分享 ★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★ 架构咱们从0说 ★ ★ 数据流通的精妙之道★ ★后端进

    2024年02月14日
    浏览(50)
  • 什么是跨域问题 ?Spring MVC 如何解决跨域问题 ?Spring Boot 如何解决跨域问题 ?

    目录 1. 什么是跨域问题 ? 2. Spring MVC 如何解决跨域问题 ? 3. Spring Boot 如何解决跨域问题 ?  跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。 跨域问题的 3 种情况: 1. 协议不同,例如 http 和 https; http://127.0.0.1:8080 https://127.0.0.1:8080 2. 域名不同; 一级域名、

    2024年02月10日
    浏览(71)
  • Java实现后端跨域的常见解决方式

    1.1、maven依赖 pom.xml 1.2、接口 1.3、配置 application.properties   至此我们就提供了一个接口: http://localhost:8080/crossServer/cross/request 2.1、maven依赖 pom.xml 2.2、接口 2.3、页面 2.4、配置 application.properties   至此我们就提供了一个接口: http://localhost:8081/crossWeb/test/request ,访问此页

    2024年02月09日
    浏览(43)
  • Java跨域问题的几种后端解决方式

    跨域指的是:浏览器不能执行其他网站的脚本,从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。跨域是由浏览器的同源策略造成的,是浏览器施加的安全限制。a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所

    2024年02月08日
    浏览(40)
  • Spring Cloud Gateway 解决跨域问题

       注:文中的解决方案在 Spring Cloud 2021.0.4、Spring Boot 2.7.4 版本中得到验证,完美解决,其他版本可参考   请求流程如下图:通过nginx反向代理到网关,在通过网关转发到具体的服务上   关于跨域的理论百度上已经有很多,网关到其他服务主要是通过注册中心去找的服

    2024年02月11日
    浏览(48)
  • Java开发 - 单点登录初体验(Spring Security + JWT)

    目录 ​​​​​​​ 前言 为什么要登录 登录的种类 Cookie-Session Cookie-Session-local storage JWT令牌 几种登陆总结  用户身份认证与授权 创建工程 添加依赖 启动项目 Bcrypt算法的工具 创建VO模型类 创建接口文件 创建XML文件 补充配置 添加依赖 添加配置 创建配置类 测试上面的配置

    2024年02月02日
    浏览(44)
  • Spring Boot中解决跨域问题(CORS)

    首先解释什么是跨域,跨域就是前端和后端的端口号不同;会产生跨域问题,这里浏览器的保护机制(同源策略)。 同源策略:前端和后端的协议、域名、端口号三者都相同叫做同源。 我们看一下不同源: VUE:http://localhost:8080 Spring: http://localhost:8081/list 当我们出现跨域问题

    2024年02月06日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包