使用 Sa-Token 的全局过滤器解决跨域问题(三种方式全版)

2023-06-27 0 635

使用 Sa-Token 的全局过滤器解决跨域问题(三种方式全版)

在 web 合作开发中,布吕马当然是较为煎熬新老师的一个难题,责任编辑将传授四种常用的布吕马情况,并传授如何采用 Sa-Token 架构化解布吕马难题。

什么情况下会发生布吕马

单纯认知,就是你在 A 搜索引擎下的网页,去调用 B 搜索引擎的USB,应用程序觉得你此次初始化可能是不安全可靠的允诺犯罪行为,只好它需要用 cors UAC来证实呵呵这个允诺是由使用者真实世界的意向收到的,而并非被 csrf 假造允诺反击偷偷地推送的。(这么说只是为了方便快捷我们认知,并非特别细致,事实上同搜索引擎下部分情况也会再次出现布吕马难题)

请细细认知下面该文,因为它说明了三点:

布吕马并非后端USB对后端应用程序的管制,而要后端应用程序对使用者的管制。布吕马并非在为保护后端USB免遭攻击,而要应用程序在为保护使用者,防止使用者推送自己不该推送的允诺。

请一定要读懂下面布吕马的其本质,知道了病症和其原因,他们就可以对症。

一般情况下,他们会遇到四种布吕马情景:

1、邻近地区网页初始化试验伺服器,只在工程项目合作开发阶段会有布吕马难题。(较为单纯)2、采用 header 头递交 token,造成的布吕马难题。(较为常用+通用型,所推荐采用)3、采用服务器端 Cookie 递交 token,造成的布吕马难题。(最有名的计划,目前旧版应用程序为此计划管制愈来愈严苛,disabled不优先选择此计划,如果为此计划并非很熟识就冒然采用也难再次出现安全可靠难题)

布吕马情况一:只在工程项目试验阶段会有布吕马难题

有些公司工程项目的Attichy为:

在工程项目合作开发时:采用邻近地区网页调用试验伺服器USB。(搜索引擎不同,存有布吕马难题)在工程项目布署时:将后端USB和后端网页布署在同一个搜索引擎下。(搜索引擎完全一致,不存有布吕马难题)

这种情况下较为好化解,在代码层面他们无需任何更改,只在后端客户端做出一定的更改就行了。比如说:在后端配置一个代理伺服器,或者修改呵呵 Chrome 客户端使其去除布吕马管制。

具体的计划有很多,我们可参考这篇博客:手把手教你化解web后端布吕马难题

下面是说的普通前后端分离合作开发,而在APP、小程序 合作开发中,其天然就是个没有布吕马管制的客户端,他们什么都不用做就能化解布吕马难题。

布吕马情况二:采用 header 头递交 token,造成的布吕马难题(较为常用+通用型,所推荐采用)

当你采用 header 头递交 token 时,会造成布吕马难题。此计划较为常用+通用型,所推荐采用。

jquery 代码示例:

js复制代码 $.ajax({ url: “/user/getInfo”, type: “post”,data: {}, dataType: json, headers: { “X-Requested-With”: “XMLHttpRequest”, // 重点处:允诺的 header 头里塞入自定义参数 “satoken”: localStorage.getItem(“satoken”) }, success: function(res){ console.log(res); }, error: function(xhr, type, errorThrown){ return alert(“异常:” + JSON.stringify(xhr)); } });

Axios 代码示例:

js复制代码 axios({url: “/user/getInfo”, method: post, data: {}, headers: { “Content-Type”: “application/x-www-form-urlencoded”, // 重点处:允诺的 header 头里塞入自定义参数 “satoken”: localStorage.getItem(“satoken”) } }). then(function (response) { // 成功时执行 const res = response.data; console.log(res); }). catch(function(error) { return alert(“异常:” + JSON.stringify(error)); })

此时在后端,他们应该添加以下响应头:

java复制代码/** * [Sa-Token 权限认证] 配置类 * * @author click33 */ @Configuration public class SaTokenConfigure implements WebMvcConfigurer { /** * 注册 [Sa-Token 自上而下冷却系统] */ @Beanpublic SaServletFilter getSaServletFilter() {return new SaServletFilter() // 指定 [拦截路由] 与 [放行路由] .addInclude(“/**”).addExclude(“/favicon.ico”) // 认证函数: 每次允诺执行 .setAuth(obj -> { SaManager.getLog().debug(“—– 允诺path={} 递交token={}”, SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue()); // … }) // 异常处理函数:每次认证函数发生异常时执行此函数 .setError(e -> { return SaResult.error(e.getMessage()); }) // 前置函数:在每次认证函数之前执行 .setBeforeAuth(obj -> {SaHolder.getResponse() // ———- 设置布吕马响应头 ———- // 允许指定域访问布吕马资源 .setHeader(“Access-Control-Allow-Origin”, “*”) // 允许所有允诺方式 .setHeader(“Access-Control-Allow-Methods”, “*”) // 允许的header参数 .setHeader(“Access-Control-Allow-Headers”, “*”) // 有效时间 .setHeader(“Access-Control-Max-Age”, “3600”) ; // 如果是预检允诺,则立即返回到后端 SaRouter.match(SaHttpMethod.OPTIONS) .free(r -> System.out.println(“——–OPTIONS预检允诺,不做处理”)) .back(); }) ; } }

如果你的工程项目是 WebFlux 环境,只需要把冷却系统名称从 SaServletFilter 更换为 SaReactorFilter即可,其它保持不变。

布吕马情况三:采用服务器端 Cookie 递交 token,造成的布吕马难题。

这是最有名的计划,目前旧版应用程序为此计划管制愈来愈严苛,disabled不优先选择此计划,如果为此计划并非很熟识就冒然采用也容易再次出现安全可靠难题。

jquery 代码示例:

js复制代码 $.ajax({ url: “/user/getInfo”, type: “post”, data: {}, dataType: json, // 重点处:指定是布吕马模式,需要递交服务器端 Cookie crossDomain: true, xhrFields:{ withCredentials: true }, headers: { “X-Requested-With”: “XMLHttpRequest” }, success: function(res){ console.log(res); }, error: function(xhr, type, errorThrown){ return alert(“异常:” + JSON.stringify(xhr)); } });

Axios 代码示例:

js复制代码 axios({ url: “/user/getInfo”, method: post, data: {}, // 重点处:开启服务器端 Cookie withCredentials: true, headers: { “Content-Type”: “application/x-www-form-urlencoded” } }). then(function (response) { // 成功时执行 console.log(res); }). catch(function (error) { return alert(“异常:” + JSON.stringify(error)); })

此时在后端,他们应该添加以下响应头:

java复制代码/** * [Sa-Token 权限认证] 配置类 * *@author click33 */ @Configuration public class SaTokenConfigure implements WebMvcConfigurer { /** * 注册 [Sa-Token 自上而下冷却系统] */ @Bean publicSaServletFiltergetSaServletFilter() { return new SaServletFilter() // 指定 [拦截路由] 与 [放行路由] .addInclude(“/**”).addExclude(“/favicon.ico”) // 认证函数: 每次允诺执行 .setAuth(obj -> { SaManager.getLog().debug(“—– 允诺path={} 递交token={}”, SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue()); // … }) // 异常处理函数:每次认证函数发生异常时执行此函数 .setError(e -> { return SaResult.error(e.getMessage()); }) // 前置函数:在每次认证函数之前执行.setBeforeAuth(obj -> {// 获得客户端domainSaRequest request = SaHolder.getRequest(); String origin = request.getHeader(“Origin”); if (origin == null) { origin = request.getHeader(“Referer”); } // ———- 设置布吕马响应头 ———- SaHolder.getResponse() // 允许服务器端 Cookie .setHeader(“Access-Control-Allow-Credentials”, “true”) // 允许指定域访问布吕马资源 .setHeader(“Access-Control-Allow-Origin”, origin) // 允许所有允诺方式 .setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”) // 允许的header参数 .setHeader(“Access-Control-Allow-Headers”, “x-requested-with,satoken”) // 有效时间 .setHeader(“Access-Control-Max-Age”, “3600”) ; // 如果是预检允诺,则立即返回到后端 SaRouter.match(SaHttpMethod.OPTIONS) .free(r -> System.out.println(“——–OPTIONS预检允诺,不做处理”)) .back(); }) ; } }

如果你的工程项目是 WebFlux 环境,只需要把冷却系统名称从 SaServletFilter 更换为 SaReactorFilter 即可,其它保持不变。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务