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

郑州专业做网站公黄冈网站推广优化找哪家

郑州专业做网站公,黄冈网站推广优化找哪家,北京建设公司的网站,wordpress wow.js0x02 非Web上下文无法获取Request 问题定位 在我们使用sa-token安全框架的时候,有时候会提示:**SaTokenException:非Web上下文无法获取Request**** 错误截图: 在官方网站中,查看常见问题排查: 非Web上下文无法获取…

0x02 非Web上下文无法获取Request

问题定位

在我们使用sa-token安全框架的时候,有时候会提示:**SaTokenException:非Web上下文无法获取Request****

错误截图:

img

在官方网站中,查看常见问题排查:

非Web上下文无法获取Request

img

**错误追踪:****

**跟着源码可以看到如下代码:****

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 的上下文管理,从而走到刚才报错的位置。

img

从源码中,我们可以看到,由于非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();
CompletableFuture<Void> testFuture = CompletableFuture.runAsync(() -> {// 把旧RequestAttributes放到新线程的RequestContextHolder中RequestContextHolder.setRequestAttributes(attributes);// 处理业务逻辑......// 使用完成后记得清理 request 信息RequestContextHolder.resetRequestAttributes();
}

参考资料

https://zhuanlan.zhihu.com/p/672622496

http://www.mmbaike.com/news/51847.html

相关文章:

  • 松江网站建设推广百度关键词推广多少钱
  • 怎么在濮阳网站做宣传视频推广一条多少钱
  • 做淘宝客网站制作教程百度推广怎么做最好
  • 成都网站seo推广互联网推广是什么工作内容
  • 宿州网站网站建设seo网站设计
  • wordpress rss地址重庆seo推广运营
  • 长春网站建设手机版谷歌 chrome 浏览器
  • 做网站得多钱优化视频
  • dedecms建设慕课网站西点培训
  • 网页编辑排版工具有哪些汕头seo网络推广服务
  • 网站建设开发ppt模板中国互联网数据平台
  • 加盟的网站建设郑州粒米seo顾问
  • web页面就是网站吗百度指数app官方下载
  • 网站策划知识搜索引擎优化是什么意思啊
  • 萧山网站建设网站页面
  • 哪些网站用织梦默认模板跨境电商平台注册开店流程
  • 深圳网站建设大公司排名seo去哪里学
  • 网站被做站公司贩卖seo云优化软件破解版
  • b2c网站建设需要多少钱明年2024年有疫情吗
  • 嘉定区建设局网站山东济南最新消息
  • 少儿编程课有没有必要学seo友情链接
  • 网站建设核心正规的网店培训机构有哪些
  • 怎么做网站文字优化宁德市是哪个省
  • 做网站用什么前端框架手机百度电脑版入口
  • 网站制作服务热线优化营商环境条例全文
  • 网站有哪些风格湖南seo优化服务
  • 微网站建设找哪家公司b站不收费网站
  • 网站敏感词汇百度售后电话人工服务
  • 音视频娱乐网站开发商南昌百度推广联系方式
  • 嵌入式系统开发西安seo诊断