手机版

Springboot解决了ajax自定义头的跨域请求问题

时间:2021-08-23 来源:互联网 编辑:宝哥软件园 浏览:

1.什么是跨域

由于浏览器同源策略(同源策略),是网景公司提出的著名安全策略。现在所有支持JavaScript的浏览器都将使用这种策略。同源是指相同的域名、协议和端口。),如果发送请求url的协议、域名和端口中的任何一个与当前页面地址不同,则它是跨域的。

详情见下表:

2.回弹如何解决跨领域问题

1.常见的跨域请求解决方案:

请求界面添加批注@交叉原点(原点=' http://127.0.0.1:8020 ',maxage=3600)

描述:Origin=' http://127 . 0 . 0 . 1:8020 ' Origin值是当前请求此接口的域

一般配置(所有接口都允许跨域请求)

向应用程序添加配置类或添加CorsFilter和CorsConfiguration方法

@Configuration公共类CORS config { private CORS Configuration build config(){ CORS Configuration CORS Configuration=new CORS Configuration();CORS configuration . addallowedorigin(' * ');//1允许任何域名使用corsconfigurationaddallowedheader(' * ');//2允许任何头CORS configuration . addallowedmethod(' * ');//3允许任何方法(post、get等)。)返回corsConfiguration} @ Bean public CORS filter CORS filter(){ urlbasedcorconfigurationsource=new urlbasedcorconfigurationsource();source . registercorsconfiguration('/* * ',Buildconfig());//4返回新的CorsFilter(源);}} 2.ajax自定义标头的跨域请求

$.ajax({ type:'GET ',URL : ' http://localhost :8766/main/currency/sgin state ',dataType:'JSON ',data: { uid:userId },beforeSend:函数(XMLHttpRequest){ XMLHttpRequest . setrequestheader(' Authorization ',access _ token);},Success3360功能(RES){控制台。日志(RES. code)}})此时,请求http://localhost :8766/main/Currency/sgininstall接口发现选项http://localhost 33608766/main/Currency/sgininstall 500错误。常见的跨域解决方案已经不能解决这个问题。为什么会出现OPTIONS请求?

理由

在发送真正的请求之前,浏览器会发送一个预览请求,用OPTIONS方法预燃请求。此请求用于验证此请求是否安全,但并非所有请求都将被发送,这需要满足以下条件:

请求方法不是get/head/post。发布请求的内容类型不是应用程序/x-www-form-urlencoded、多部分/表单数据或文本/纯文本

该请求设置了自定义标题字段

至于管理端的接口,我是检查接口的权限,每个请求都需要在头部携带一个用户定义的字段(token),所以浏览器会额外发送一个OPTIONS请求来验证这个请求的安全性。

为什么OPTIONS请求是500?

OPTIONS请求仅携带用户定义的字段,但不引入相应的值。在后台验证令牌字段时,令牌为NULL,因此验证失败并引发异常。

现在让我们来解决这个问题:

在springboot项目应用程序. yml中添加

spring :mv c : dispatch-options-request : true

注意:在某些情况下,此解决方案可能无法解决OPTIONS问题,这可能是由于环境问题或自定义过滤器的复杂配置问题。

添加过滤器配置

步骤1:手写请求过滤器请求过滤器配置类。这个类需要实现HandlerInterceptor类,它位于org . spring framework . web . servlet . handler Interceptor下。

具体的代码实现:

@Componentpublic类RequestFilter实现HandlerInterceptor { public boolean preHandler(httpersvletrequest请求,HttpServletResponse响应,对象处理程序){响应。setheader('访问控制-允许-源',' * ');response.setHeader('访问控制-允许-凭据,' true ');response.setHeader('访问控制-允许-方法、“获取、头、后、放、补丁、删除、选项”);response.setHeader('访问控制-最大年龄',' 86400 ');response.setHeader('访问控制-允许-头','授权');//如果是选择请求则结束if (HttpMethod .OPTIONS.toString().等于(请求。getmethod()){ response。setstatus(Https status).NO _内容。value());返回false}返回真实}}第二步:手写我的网络配置此类需要继承WebMvcConfigurationSupport。

注意:WebMvcConfigurationSupport是2.x版本以上的,1.x版本为WebMvcConfigurerAdapter。

具体代码实现:

@Componentpublic类我的网络配置扩展了WebMvcConfigurationSupport { @资源私有request filter request filter @ Override public void addInterceptors(截取注册注册表){ //跨域拦截器注册表。addinterceptor(RequestFilter).addpath模式('/* * ');} }

总结

以上所述是小编给大家介绍的跳羚解决创建交互式、快速动态网页应用的网页开发技术自定义头球的跨域请求问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:Springboot解决了ajax自定义头的跨域请求问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。