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

做网站甲方乙方公司的区别成都有几个区

做网站甲方乙方公司的区别,成都有几个区,网站开发软件解决方案,h5制作步骤图目录 思路 一、TokenFilterConfiguration 二、FilterConfig 三、TokenContextHolder 四、TokenUtil 五、UserUtil 思路 配置Token过滤器(TokenFilterConfiguration)#xff1a;实现一个Token过滤器配置#xff0c;用于拦截HTTP请求#xff0c;从请求头中提取Token实现一个Token过滤器配置用于拦截HTTP请求从请求头中提取Token并通过调用TokenUtil验证Token的有效性 无效response响应401 有效将Token值存储在ThreadLocal中 配置过滤器(FilterConfig)用于注册和统一管理所有自定义过滤器 配置Holder类(TokenContextHolder)利用ThreadLocal机制管理每个线程绑定的Token确保在一个线程内的请求间Token的一致性和隔离性。 创建TokenUtil工具类token为key获取redis中数据调用TokenUtil中的方法调feign获取用户信息验证token是否有效 创建UserUtil工具类从TokenContextHolder中获取当前的token用TokenUtil解析token获取用户信息 一、TokenFilterConfiguration Token隔离过滤器配置类,实现基于Bearer Token的权限验证 /*** Token隔离过滤器配置类用于实现基于Bearer Token的权限验证。* 该类作为一个过滤器拦截进入系统的HTTP请求验证请求中携带的Token是否有效* 从而决定是否允许请求继续传递到系统内部。*/ Slf4j Configuration public class TokenFilterConfiguration implements Filter {/*** 处理HTTP请求。* 验证请求中是否包含有效的Bearer Token并在验证通过后将Token值存储在ThreadLocal中* 以便后续的业务逻辑可以获取到当前请求的用户信息。** param servletRequest HTTP请求对象* param servletResponse HTTP响应对象* param filterChain 过滤器链用于继续处理或终止请求的传递* throws IOException 如果在处理请求或响应时发生I/O错误* throws ServletException 如果在处理请求或响应时发生Servlet相关错误*/Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request (HttpServletRequest) servletRequest;HttpServletResponse response (HttpServletResponse) servletResponse;try {// 从请求头中提取Bearer Token// 检查是否已经登录String tokenValue BearerTokenExtractorUtil.extract(request);log.info(过滤器获取到token:{}, tokenValue);// 如果Token存在则验证Token的有效性if (StrUtil.isNotEmpty(tokenValue)) {// 验证是否有效SysUserDto tokenUser getUserInfoFromSys(tokenValue);// 如果Token无效则返回401未授权错误if (ObjectUtil.isEmpty(tokenUser)) {// 如果token无效直接响应401给客户端并结束执行response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write(Unauthorized: token失效未获取到用户登录信息请重新登录);return;}// Token有效将Token值存储在ThreadLocal中以便后续使用// 有效登录的情况,把请求头中的token设置进上下文TokenContextHolder.setToken(tokenValue);log.info(将请求头中的token设置进上下文context);}} catch (Exception e) {// 记录Token验证过程中的异常// 统一异常处理log.error(获取用户信息异常, e);// 抛出未授权异常提示客户端重新登录throw new UnauthorizedException(登录状态异常请重新登录);}// 所有前置检查通过后继续执行过滤器链filterChain.doFilter(servletRequest, servletResponse);// 请求处理完成后清除ThreadLocal中的Token值TokenContextHolder.clear();} }二、FilterConfig 注册和管理过滤器 /*** 配置类用于注册和管理过滤器。*/ Configuration public class FilterConfig {/*** 注册认证过滤器。* 创建一个FilterRegistrationBean实例用于配置和注册自定义的TokenFilter。* 通过设置过滤器适用的URL模式确保只有指定的API请求才会经过该过滤器进行认证检查。** return FilterRegistrationBean 对象用于注册过滤器并配置其属性。*/Beanpublic FilterRegistrationBean authenticationFilterRegistration() {FilterRegistrationBean registration new FilterRegistrationBean();registration.setFilter(new TokenFilterConfiguration());registration.addUrlPatterns(/api/*,/flow/*);return registration;} }三、TokenContextHolder 管理线程绑定的token提供线程安全的访问方式 /*** TokenContextHolder 类用于管理线程绑定的token提供线程安全的访问方式。* 利用ThreadLocal实现线程之间的隔离确保每个线程操作的token互不干扰。*/ public class TokenContextHolder {/*** 使用TransmittableThreadLocal来存储线程绑定的token。* TransmittableThreadLocal相比于普通的ThreadLocal还支持在子线程中传递值* 适用于需要跨线程传递上下文信息的场景。*//*** 支持父子线程之间的数据传递*/private static final ThreadLocalString CONTEXT new TransmittableThreadLocal();/*** 设置当前线程的token。* * param token 要设置的token值。*/public static void setToken(String token) {CONTEXT.set(token);}/*** 获取当前线程的token。* * return 当前线程绑定的token值。*/public static String getToken() {return CONTEXT.get();}/*** 清除当前线程的token。* 该方法用于在不再需要token时或者在处理完特定业务逻辑后清除线程绑定的token以避免潜在的安全问题。*/public static void clear() {CONTEXT.remove();} }四、TokenUtil token工具类 Slf4j Component public class TokenUtil implements BeanFactoryAware {Setterprivate static RedisTemplateString, Object redisTemplate;Setterprivate static SysFlowableFeign sysFlowableFeign;private static final String FLOWABLE_TOKEN_KEY token_user:;/*** 设置BeanFactory用于获取RedisTemplate和SysFlowableFeign实例。*/OverrideSuppressWarnings(unchecked)public void setBeanFactory(NonNull BeanFactory beanFactory) throws BeansException {RedisTemplateString, Object redisBean beanFactory.getBean(redisTemplate, RedisTemplate.class);setRedisTemplate(redisBean);SysFlowableFeign sysFlowableFeignBean beanFactory.getBean(SysFlowableFeign.class);setSysFlowableFeign(sysFlowableFeignBean);}/*** 构建Token的键值。* * param token 用户的Token字符串。* return 构建后的Token键值。*/private static String getTokenKey(String token) {return TOKEN_KEY token;}/*** 根据Token获取用户信息。* * param token 用户的Token字符串。* return 用户信息的SysUserDto对象。* throws UnauthorizedException 如果Token无效或过期则抛出此异常。*/public static SysUserDto getTokenUser(String token) {try {String tokenKey getTokenKey(token);// 缓存中获取SysUserDto redisUser (SysUserDto) redisTemplate.opsForValue().get(tokenKey);if (ObjectUtil.isNotNull(redisUser)) {log.info(根据token获取缓存中的用户信息:{}, JSONUtil.toJsonStr(redisUser));return redisUser;}log.info(缓存中的用户信息已过期);// 缓存中未找到用户信息从SYS验证token是否已过期SysUserDto userInfoFromSys getUserInfoFromSys(token);if (ObjectUtil.isNull(userInfoFromSys)) {log.info(缓存中未找到用户信息从SYS验证token已过期);// 未获取到用户信息throw new UnauthorizedException(Unauthorized: token失效未获取到用户登录信息请重新登录);}log.info(缓存中未找到用户信息根据token获取SYS用户信息:{}, JSONUtil.toJsonStr(userInfoFromSys));// 存储到本地缓存redisTemplate.opsForValue().set(tokenKey, userInfoFromSys);// 设置缓存时间1天有效redisTemplate.expire(tokenKey, 1, TimeUnit.DAYS);return userInfoFromSys;} catch (Exception e) {// 统一异常处理log.error(获取用户信息异常, e);throw new UnauthorizedException(登录状态异常请重新登录);}}/*** feign获取用户信息* param token 用户的Token字符串。* return 用户信息的SysUserDto对象如果获取失败则返回null。*/public static SysUserDto getUserInfoFromSys(String token) {ApiResultSysUserDto tokenUserResult sysFlowableFeign.getTokenUser(token);if (BooleanUtil.isTrue(tokenUserResult.getSuccess())) {return tokenUserResult.getData();}return null;}}五、UserUtil 用户工具类 /*** 用户工具类提供获取当前登录用户的业务逻辑。*/ public class UserUtil {/*** 日志记录器用于记录类的操作日志。*/private static final Logger log LoggerFactory.getLogger(UserUtil.class);// 私有构造方法防止外部实例化private UserUtil() {}/*** 获取当前登录的用户信息。** return 当前登录用户的SysUserDto对象。* throws UnauthorizedException 如果token失效或未获取到用户登录信息抛出此异常。* throws IllegalArgumentException 如果未从上下文中获取到token抛出此异常。*/public static SysUserDto getCurrentUser() {// 从TokenContextHolder中获取当前的tokenString token TokenContextHolder.getToken();log.info(获取上下文context中的token:{}, token);if (CharSequenceUtil.isNotEmpty(token)) {// 使用TokenUtil解析token获取用户信息SysUserDto tokenUser TokenUtil.getTokenUser(token);if (ObjectUtil.isEmpty(tokenUser)) {throw new UnauthorizedException(Unauthorized: token失效未获取到用户登录信息请重新登录);}// 返回解析得到的用户信息return tokenUser;}throw new IllegalArgumentException(未获取到用户信息);} }
http://www.dnsts.com.cn/news/96465.html

相关文章:

  • php在线做网站12306网站开发费用
  • 较便宜的网站建设抓取工具把对手网站的长尾词
  • 东至网站制作ppt背景模板免费下载
  • 代理国外网站广州网站整站优化
  • 昆明建设网站网站备案信息更改审核要多久
  • 网站优缺点品牌建设口号
  • 英语网站onlinewordpress初始密码
  • 长沙的网站建设公司vultr搭建wordpress
  • 安定网站建设上海外贸公司是国企吗
  • 邯郸医院网站建设新手网站设计定价
  • dedecms做自适应网站WordPress网站主题升级
  • 揭阳网站免费建站app首页设计模板
  • 陕西网站建设网站别人做的上面有方正字体
  • 怒江州城乡建设局网站黄石网站建设流程
  • 平面设计免费素材网站文章资讯类网站模板
  • 海康域名网站wordpress.org教程
  • 上国外网站速度慢电脑网络
  • 网站没续费会怎样大连工业大学艺术与信息工程学院
  • 潍坊专业做网站天津市工程建设公众信息网官网
  • 网上下载的网站模板怎么用软件开发好么
  • 网站分享功能怎么做线上会议软件有哪些
  • 怎么做企业网站运营百度官方营销推广平台官网
  • 湖州网站建设服务公司wordpress人型图标
  • 厦门企业网站建设方案网站建设规划书txt微盘
  • 做淘宝有哪些推广网站wordpress建设网站
  • 网站后台任务网站内部链接的策略有
  • 做网站大家都找谁分类目录网站大全做seo
  • 做网站 挣广告联盟的佣金可以入侵的网站
  • 织梦免费网站模块下载地址开发网站建设设计公司
  • 源码怎么做网站免费推广网站大全