返回顶部
首页 > 资讯 > 精选 >Spring Security使用中Preflight请求和跨域的示例分析
  • 593
分享到

Spring Security使用中Preflight请求和跨域的示例分析

springsecurity 2023-05-30 20:05:38 593人浏览 薄情痞子
摘要

这篇文章主要介绍了spring Security使用中Preflight请求和跨域的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring SecuritySpr

这篇文章主要介绍了spring Security使用中Preflight请求和跨域的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Spring Security

Spring Security是能够为J2EE项目提供综合性的安全访问控制解决方案的安全框架。它依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。

Spring Security对用户请求的拦截过程如下:

Spring Security使用中Preflight请求和跨域的示例分析

背景

在一个前后端分离开发的项目中,使用SpringSecurity做安全框架,用Jwt来实现权限管理提升RESTful api的安全性。首先遇到的就是跨域问题,但是在携带jwt请求过程中出现了服务端获取不到jwt情况。

跨域问题

在开发过程中遇到CORS (跨域资源共享) 的问题,简单的在服务器端设置了允许跨域访问,但是在携带jwt请求过程中出现

Spring Security使用中Preflight请求和跨域的示例分析

因为jwt是放在request header中,忽略了在跨域处理是加上允许自己定于的header字段

@Componentpublic class CorsFilter implements Filter { Logger logger= LoggerFactory.getLogger(CorsFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  httpservletRequest request= (HttpServletRequest) servletRequest;  HttpServletResponse response= (HttpServletResponse) servletResponse;  response.setHeader("Access-Control-Allow-Origin",request.getHeader("origin"));  response.setHeader("Access-Control-Allow-Origin","*"); //允许跨域访问的域  response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE,PUT"); //允许使用的请求方法  response.setHeader("Access-Control-Expose-Headers","*");  response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Cache-Control,Pragma,Content-Type,Authorization"); //允许使用的请求方法  response.setHeader("Access-Control-Allow-Credentials","true");//是否允许请求带有验证信息  filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { }}

在网上搜索提到要对OPTIONS请求进行处理返回200,但是测试并没有起到效果

这里的OPTIONS请求实际上就是preflight请求

Preflight请求

但是问题依然没有解决,出现如下

Spring Security使用中Preflight请求和跨域的示例分析

Google了之后才知道preflight 请求的相关信息

在我们调用后台接口的时候,经常会发现请求了两次,其实第一次发送的就是preflight request(预检请求)。

为什么需要preflight request

我们都知道浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求,像XMLHttpRequest和Fetch都遵循同源策略。

浏览器限制跨域请求一般有两种方式:

浏览器限制发起跨域请求 跨域请求可以正常发起,但是返回的结果被浏览器拦截了

一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。

为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。

浏览器将CORS请求分成两类:简单请求和非简单请求。

简单请求

请求方法是以下三种方法之一

  • HEAD

  • GET

  • POST

HTTP的头信息不超出以下几种字段

  • Accept

  • Accept-Language

  • Content-Language

  • Last-Event-ID

  • Content-Type:只限于三个值application/x-www-fORM-urlencoded、multipart/form-data、text/plain

凡是不同时满足上面两个条件,就属于非简单请求。

而浏览器对这两种请求的处理是不一样的。

非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/JSON

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)

与cors相关更详细的看参考底部链接

解决方法

在我们后台用了Spring Security作为安全框架,并且没有对Preflight这个请求做出相应的处理,那么这个请求会导致权限管控失败。

处理起来也很简单,只需要在spring security配置类configure方法中增加放行preflight请求

 @Override protected void configure(HttpSecurity http) throws Exception {  http    // 由于使用的是JWT,我们这里不需要csrf    .csrf().disable()    // 基于token,所以不需要session    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()    .authorizeRequests()    // 所有 / 的所有请求 都放行    .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() //对preflight放行    .antMatchers("/*").permitAll()    .antMatchers("/u").denyAll()    .antMatchers("/article/**").permitAll()    .antMatchers("/video/**").permitAll()    .antMatchers("/api/**").permitAll()    .antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**","/swagger-ui.html", "/WEBjars/**")    .permitAll()    .antMatchers("/manage/**").hasRole("ADMIN") // 需要相应的角色才能访问    // 除上面外的所有请求全部需要鉴权认证    .anyRequest().authenticated();  // 禁用缓存  http.headers().cacheControl();  // 添加JWT filter  http.addFilterBefore(authenticationTokenFilterBean(), UsernamePassWordAuthenticationFilter.class);  //添加未授权处理  http.exceptionHandling().authenticationEntryPoint(getAuthenticationEntryPoint());  //权限不足处理  http.exceptionHandling().accessDeniedHandler(getAccessDeniedHandler()); }

最终问题得到解决!

感谢你能够认真阅读完这篇文章,希望小编分享的“Spring Security使用中Preflight请求和跨域的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Spring Security使用中Preflight请求和跨域的示例分析

本文链接: https://lsjlt.com/news/221000.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Security使用中Preflight请求和跨域的示例分析
    这篇文章主要介绍了Spring Security使用中Preflight请求和跨域的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring SecuritySpr...
    99+
    2023-05-30
    spring security
  • vue-cli axios请求方式及跨域处理的示例分析
    这篇文章给大家分享的是有关vue-cli axios请求方式及跨域处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue-cli axios请求方式以及跨域处理安装a...
    99+
    2024-04-02
  • Spring Boot异步请求和异步调用的示例分析
    这篇文章主要为大家展示了“Spring Boot异步请求和异步调用的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring Boot异步请求和异步调用的示例分析”这篇文章吧。一、Sp...
    99+
    2023-06-16
  • Security框架中怎么使用CorsFilter解决前端跨域请求问题
    本篇内容主要讲解“Security框架中怎么使用CorsFilter解决前端跨域请求问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Security框架中怎么使用CorsFilter解决前端跨...
    99+
    2023-06-25
  • spring中scope作用域的示例分析
    这篇文章给大家分享的是有关spring中scope作用域的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。研究了一下scope的作用域。默认是单例模式,即scope="singleton"...
    99+
    2023-05-30
    spring scope
  • HTML5中window.postMessage与跨域的示例分析
    这篇文章给大家分享的是有关HTML5中window.postMessage与跨域的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。讲到浏览器同源策略,即阻止不同域的页面间访...
    99+
    2024-04-02
  • H5中window.postMessage与跨域的示例分析
    这篇文章主要为大家展示了“H5中window.postMessage与跨域的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“H5中window.postM...
    99+
    2024-04-02
  • ajax和jsonp跨域原理的示例分析
    这篇文章主要为大家展示了“ajax和jsonp跨域原理的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ajax和jsonp跨域原理的示例分析”这篇文章吧...
    99+
    2024-04-02
  • 使用Flask和Django中解决跨域请求问题
    Flask解决跨域 1、下载flask_cors包 pip install flask-cors 2、使用flask_cors的CORS 代码示例 from flask_c...
    99+
    2024-04-02
  • ajax中多次请求的示例分析
    小编给大家分享一下ajax中多次请求的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们在用ajax请求数据时,可能会遇...
    99+
    2024-04-02
  • php中http请求类的示例分析
    这篇文章将为大家详细讲解有关php中http请求类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码:<php namespace dollar...
    99+
    2024-04-02
  • Ajax请求和Filter配合的示例分析
    这篇文章主要为大家展示了“Ajax请求和Filter配合的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ajax请求和Filter配合的示例分析”这篇文...
    99+
    2024-04-02
  • vue中axios请求拦截的示例分析
    这篇文章主要介绍vue中axios请求拦截的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!axios 简介axios 是一个基于Promise 用于浏览器和 nodejs 的...
    99+
    2024-04-02
  • 基于apicloud中AJAX请求的示例分析
    这篇文章主要介绍了基于apicloud中AJAX请求的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。get请求代码:api.ajax...
    99+
    2024-04-02
  • Tomcat中HTTP请求过程的示例分析
    这篇文章给大家分享的是有关Tomcat中HTTP请求过程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。初探Tomcat的HTTP请求过程前言:1.作为Java开发人员,大多都对Tomcat不陌生,由Ap...
    99+
    2023-06-02
  • vue axios数据请求及vue中使用axios的示例分析
    这篇文章将为大家详细讲解有关vue axios数据请求及vue中使用axios的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。axios 简介axios 是一个基...
    99+
    2024-04-02
  • 前端面试之同源和跨域的示例分析
    这篇文章将为大家详细讲解有关前端面试之同源和跨域的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是同源策略同源策略是用来限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互,是一种用...
    99+
    2023-06-08
  • ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
    TP 内置的跨域配置类 AllowCrossDomain TP 框架提供的内置类: \think\middleware\AllowCrossDomain::class 开启跨域 ...
    99+
    2023-10-26
    小程序 前端 php ThinkPHP 微信小程序
  • Spring中IOC和AOP的示例分析
    小编给大家分享一下Spring中IOC和AOP的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring是一个开源框架,主要实现两件事,IOC(控制反转...
    99+
    2023-05-30
    spring ioc aop
  • spring中IoC和DI的示例分析
    这篇文章主要介绍spring中IoC和DI的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这里先来简单介绍下IoC和DI的区别:IOC:翻译过来是控制反转,将对象的创建权由Spring管理,HelloServ...
    99+
    2023-05-30
    spring ioc di
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作