当前位置: 首页 > news >正文

洛阳恒凯做的网站有哪些东莞规划局官方网站

洛阳恒凯做的网站有哪些,东莞规划局官方网站,如何对网站做进一步优化,南通网站建设外包0x02 非Web上下文无法获取Request 问题定位 在我们使用sa-token安全框架的时候#xff0c;有时候会提示#xff1a;**SaTokenException:非Web上下文无法获取Request**** 错误截图#xff1a; 在官方网站中#xff0c;查看常见问题排查#xff1a; 非Web上下文无法获取…0x02 非Web上下文无法获取Request 问题定位 在我们使用sa-token安全框架的时候有时候会提示**SaTokenException:非Web上下文无法获取Request**** 错误截图 在官方网站中查看常见问题排查 非Web上下文无法获取Request **错误追踪**** **跟着源码可以看到如下代码**** public class SaTokenContextForSpring implements SaTokenContext {/*** 获取当前请求的 Request 包装对象*/Overridepublic SaRequest getRequest() {return new SaRequestForServlet(SpringMVCUtil.getRequest());}// 省略......}// SpringMVCUtil.getRequest() /*** 获取当前会话的 request 对象* return request*/ public static HttpServletRequest getRequest() {ServletRequestAttributes servletRequestAttributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if(servletRequestAttributes null) {throw new NotWebContextException(非 web 上下文无法获取 HttpServletRequest).setCode(SaSpringBootErrorCode.CODE_20101);}return servletRequestAttributes.getRequest(); }代码梳理 梳理一下为什么会走到这里以 StpUtil.getLoginId()为例 public Object getLoginId() {// 1、先判断一下当前会话是否正在 [ 临时身份切换 ], 如果是则返回临时身份if(isSwitch()) {return getSwitchLoginId();}// 2、如果前端没有提交 token则抛出异常: 未能读取到有效 tokenString tokenValue getTokenValue(true);// 省略... }public String getTokenValue(boolean noPrefixThrowException){// 1、获取前端提交的 token 包含前缀值String tokenValue getTokenValueNotCut();// 省略... }// StpLogic.getTokenValueNotCut() public String getTokenValueNotCut(){// 获取相应对象SaStorage storage SaHolder.getStorage();SaRequest request SaHolder.getRequest();// 省略... }最终都会 调用到 SaHolder.getStorage() public static SaStorage getStorage() {return SaManager.getSaTokenContextOrSecond().getStorage(); }// SaManager.getSaTokenContextOrSecond() public static SaTokenContext getSaTokenContextOrSecond() {// s1. 一级Context可用时返回一级Contextif(saTokenContext ! null) {if(saTokenSecondContext null || saTokenContext.isValid()) {// 因为 isValid 是一个耗时操作所以此处假定二级Context为null的情况下无需验证一级Context有效性 // 这样可以提升6倍左右的上下文获取速度 return saTokenContext;}}// s2. 一级Context不可用时判断二级Context是否可用 if(saTokenSecondContext ! null saTokenSecondContext.isValid()) {return saTokenSecondContext;}// s3. 都不行就返回默认的 Context return SaTokenContextDefaultImpl.defaultContext; }查看 SaTokenContext的实现类如果通过 sa-token-spring-boot-starter使用会自动注入 SaTokenContextForSpring类作为 SaToken 的上下文管理从而走到刚才报错的位置。 从源码中我们可以看到由于非Web上下文中无法直接获取HttpServletRequest对象因此无法直接在子线程中使用SA-Token认证框架中的Web相关功能。 知道了问题原因所在接下来我们就来解决 解决方案一 提取SA-Token信息从请求中提取SA-Token信息并将其传递给子线程。您可以在主线程中解析请求参数或读取请求头获取SA-Token并将其传递给子线程。 使用线程局部变量将SA-Token存储在线程局部变量中以便子线程可以访问它。在主线程中您可以将SA-Token存储在线程局部变量中并在子线程中使用该变量来获取SA-Token。 自定义认证逻辑在子线程中编写自定义的认证逻辑以处理SA-Token的验证和其他相关操作。您可以使用现有的安全框架或库提供的功能如加密算法、签名验证等来进行认证。 以下是一个简单的示例代码演示了如何在子线程中使用自定义认证逻辑来处理SA-Token import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SaTokenAuthentication {private static final ExecutorService executor Executors.newSingleThreadExecutor(); public static void main(String[] args) { // 模拟从请求中提取的SA-Token信息 String saToken your_sa_token; // 提交给子线程执行的任务 executor.submit(() - { // 在子线程中进行自定义认证逻辑 boolean isAuthenticated authenticate(saToken); // 根据认证结果执行相应的操作 if (isAuthenticated) { // 认证成功执行其他操作... } else { // 认证失败处理错误... } }); } private static boolean authenticate(String saToken) { // 在这里编写自定义的认证逻辑以验证SA-Token的有效性和完整性等。 // 您可以使用现有的安全框架或库提供的功能来进行认证。 // 这里只是简单地模拟认证过程并返回结果。 return saToken.equals(valid_sa_token; // 替换为您的验证逻辑 } }解决方案二 解决方法比较简单 1、参数透传 修改接口把需要在ThreadLocal中获取的参数透传到其它方法中。 解决方案:先获取你想要的值,再把这个值当做一个参数传递到这些方法中,而不是直接从方法内调用Sa-Token的APl。 2、重置上下文对象 在子线程中重置RequestContextHolder对象。 // 从主线程获取用户数据 放到局部变量中 RequestAttributes attributes RequestContextHolder.getRequestAttributes(); CompletableFutureVoid testFuture CompletableFuture.runAsync(() - {// 把旧RequestAttributes放到新线程的RequestContextHolder中RequestContextHolder.setRequestAttributes(attributes);// 处理业务逻辑......// 使用完成后记得清理 request 信息RequestContextHolder.resetRequestAttributes(); }参考资料 https://zhuanlan.zhihu.com/p/672622496
http://www.w-s-a.com/news/164476/

相关文章:

  • 个人网站免费服务器单页网站的域名
  • 网站设计简单讲解小店怎么做网站
  • 校园网站的意义wordpress去除更新
  • 网站开发用python吗常用的网页开发工具有哪些
  • 北京市住房建设投资建设网站做商城网站要哪些流程
  • seo网站改版杭州建设局官网
  • 物流网站建设策划书泰然建设网站
  • 百度做网站的费用采集发布wordpress
  • 网站运维公司有哪些防录屏网站怎么做
  • 昆明做网站seo的网站制作专业
  • 聊城制作手机网站公司wordpress 头条
  • 商城微网站模板一般电商网站做集群
  • winserver2008上用iis发布网站嵊州网站制作
  • 网站内页权重怎么查辽宁建设工程信息网怎么上传业绩
  • 丰都网站建设价格镇江网站制作费用
  • app手机网站建设黄网站建设定制开发服务
  • 百度网盘app下载徐州优化网站建设
  • 附近网站电脑培训班展台设计方案介绍
  • 河南便宜网站建设价格低上海高端室内设计
  • 保险网站有哪些平台wordpress会员vip购买扩展
  • 网站怎么做图片转换广州车陂网站建设公司
  • 下载flash网站网站设计书的结构
  • 水利建设公共服务平台网站放心网络营销定制
  • 设计网站过程wordpress+分页静态
  • 临海网站制作好了如何上线如果安装wordpress
  • 长沙 学校网站建设网站制作价格上海
  • 九江网站推广徽hyhyk1国家住房部和城乡建设部 网站首页
  • 阿克苏网站建设咨询动漫设计与制作属于什么大类
  • 网站编辑做多久可以升职wordpress版权修改
  • 网站开发维护成本计算国外外贸平台