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

县总工会网站建设情况介绍网站关键词在哪里看

县总工会网站建设情况介绍,网站关键词在哪里看,wordpress https ssl,茂名网站建设技术托管文章目录 概要功能结构图5.Session会话6.持久层扩展7.全局侦听器8.全局过滤器9.多账号体系认证10.单点登录 概要 Sa-Token核心功能解剖(二),主要有: Session会话 —— 全端共享Session,单端独享Session,自定义Session,方便的存取…

文章目录

    • 概要
    • 功能结构图
      • 5.Session会话
      • 6.持久层扩展
      • 7.全局侦听器
      • 8.全局过滤器
      • 9.多账号体系认证
      • 10.单点登录

概要

Sa-Token核心功能解剖(二),主要有:

  • Session会话 —— 全端共享Session,单端独享Session,自定义Session,方便的存取值。
  • 持久层扩展 —— 可集成 Redis,重启数据不丢失。
  • 全局侦听器 —— 在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作。
  • 全局过滤器 —— 方便的处理跨域,全局设置安全响应头等操作。
  • 多账号体系认证 —— 一个系统多套账号分开鉴权(比如商城的 User 表和 Admin 表)
  • 单点登录 —— 内置三种单点登录模式:同域、跨域、同Redis、跨Redis、前后端分离等架构都可以搞定。

功能结构图

5.Session会话

  • 全端共享Session(Account-Session): PC 和 APP 登录的账号id一致,它们对应的都是同一个Session,两端可以非常轻松的同步数据。
  • 单端独享Session(Token-Session):同一账号在不同设备登录,产生单端独享的token和Token-Session,实现不同端会话Session的分隔、独享。
  • 自定义Session( Custom-Session),方便的存取值。

Session 是会话中专业的数据缓存组件,通过 Session 我们可以很方便的缓存一些高频读写数据(如用户信息登录关联的User信息),提高程序性能。
Sa-Token 中,Session 分为三种,分别是:

  • Account-Session: 每个 账号id 分配的 Session,调用StpUtil.login(id)登录会话时才会产生。
  • Token-Session: 每个 token 分配的 Session
  • Custom-Session: 以一个特定的值作为SessionId,来分配的Session。

Session会话模型详解

Sa-Token 常量类SaTokenConsts:

public class SaTokenConsts {//SaSession 的类型: Account-Sessionpublic static final String SESSION_TYPE__ACCOUNT = "Account-Session";//SaSession 的类型: Token-Sessionpublic static final String SESSION_TYPE__TOKEN = "Token-Session";//SaSession 的类型: Custom-Sessionpublic static final String SESSION_TYPE__CUSTOM = "Custom-Session";
......
}

1)全端共享Session(Account-Session)

	//会话登录//id 账号id,建议的类型:(long | int | String)public void login(Object id) {login(id, createSaLoginParameter());}--->/*** 创建指定账号 id 的登录会话数据* @param id 账号id,建议的类型:(long | int | String)* @param loginParameter 此次登录的参数Model * @return 返回会话令牌 */public String createLoginSession(Object id, SaLoginParameter loginParameter) {.....// 3、获取此账号的 Account-Session , 续期SaSession session = getSessionByLoginId(id, true, loginParameter.getTimeout());.....return session;}--->//获取指定账号 id 的 Account-Session, 如果该 SaSession //尚未创建,isCreate=是否新建并返回public SaSession getSessionByLoginId(Object loginId, boolean isCreate, Long timeout) {if(SaFoxUtil.isEmpty(loginId)) {throw new SaTokenException("Account-Session 获取失败:loginId 不能为空");}return getSessionBySessionId(splicingKeySession(loginId), isCreate, timeout, session -> {//Account-Session 首次创建时才会被执行的方法:session.setType(SaTokenConsts.SESSION_TYPE__ACCOUNT);session.setLoginType(getLoginType());session.setLoginId(loginId);});}    --->//拼接: 在保存 Account-Session 时,应该使用的 key//key = Token:login:session:582729269957048452(uuid值)public String splicingKeySession(Object loginId) {return getConfigOrGlobal().getTokenName() + ":" + loginType + ":session:" + loginId;}

Redis展示:
在这里插入图片描述
2)单端独享Session(Token-Session)
Sa-Token针对会话登录,不仅为账号id分配了Account-Session,同时还为每个token分配了不同的Token-Session。当同一账号在两个设备登录,但是它们产生两个不同token和对应的Token-Session,
实现不同端会话Session的分隔、独享。

前提:用户登录完成,并将产生的Token存储至请求作用域的读取值对象SaStorage[Storage Model]内

//登录web端 – 成功 --产生token
StpUtil.login(defUser.getId(), “PC”);
追溯用户唯一值token 存储到SaTokenContext 上下文

   public void login(Object id, SaLoginModel loginModel) {......//当前客户端注入 tokenthis.setTokenValue(token, loginModel);}--->public void setTokenValue(String tokenValue, SaLoginModel loginModel) {if (!SaFoxUtil.isEmpty(tokenValue)) {//token 写入到当前请求的 Storage 存储器里this.setTokenValueToStorage(tokenValue);.....}}---->//将 token 写入到当前请求的 Storage 存储器里public void setTokenValueToStorage(String tokenValue){//实例化saTokenContextSaTokenContext saTokenContext = SaManager.getSaTokenContextOrSecond();// 1、获取当前请求的 Storage 存储器SaStorage storage = saTokenContext.getStorage();// 2、保存 tokenString tokenPrefix = getConfigOrGlobal().getTokenPrefix();if( SaFoxUtil.isEmpty(tokenPrefix) ) {storage.set(splicingKeyJustCreatedSave(), tokenValue);} else {storage.set(splicingKeyJustCreatedSave(), tokenPrefix + SaTokenConsts.TOKEN_CONNECTOR_CHAT + tokenValue);}// 3、以无前缀的方式再写入一次storage.set(SaTokenConsts.JUST_CREATED_NOT_PREFIX, tokenValue);  } 

token 写入到当前请求的 Storage 存储器展示图:
在这里插入图片描述

实例化saToken上下文-saTokenContext过程说明:

SaTokenContext saTokenContext = SaManager.getSaTokenContext-
OrSecond() 
  1. starter.jar包自动装配saToken上下文注册类-SaTokenContextRegister
  2. SaTokenContextRegister类@Bean注入SaTokenContextForSpringIn-
    JakartaServlet实例化实现SaTokenContext接口。
    在这里插入图片描述
    SaTokenContextForSpringInJakartaServlet类:
public class SaTokenContextForSpringInJakartaServlet implements SaTokenContext {public SaRequest getRequest() {return new SaRequestForServlet(SpringMVCUtil.getRequest());}public SaResponse getResponse() {return new SaResponseForServlet(SpringMVCUtil.getResponse());}public SaStorage getStorage() {return new SaStorageForServlet(SpringMVCUtil.getRequest());}.........}

获取当前请求的 Storage 存储器:SaStorage storage = saTokenContext.getStorage();

public class SaTokenContextForSpringInJakartaServlet implements SaTokenContext {/*** 获取当前请求的 Storage 包装对象*/@Overridepublic SaStorage getStorage() {return new SaStorageForServlet(SpringMVCUtil.getRequest());}...........
}
-------->
SaStorage[Storage Model],请求作用域的读取值对象
public interface SaStorage extends SaSetValueInterface {/** 取值 */@OverrideObject get(String key);/** 写值 */@OverrideSaStorage set(String key, Object value);
}

用户调用 SaSession tokenSession = StpUtil.getTokenSession();
,从同一请求作用域的读取值对象SaStorage[Storage Model]内获取tokenValue

SaSession tokenSession = StpUtil.getTokenSession();
-------->
//1.获取同一请求作用域的读取值对象SaStorage内tokenValue
//2.SaSession 尚未创建,isCreate代表是否新建并返回
public SaSession getTokenSession(boolean isCreate) {String tokenValue = this.getTokenValue();return this.getTokenSessionByToken(tokenValue, isCreate);
}
-------->//获取同一请求作用域的读取值对象SaStorage内tokenValuepublic String getTokenValueNotCut(){// 获取相应对象SaStorage storage = SaHolder.getStorage();SaRequest request = SaHolder.getRequest();String tokenValue = null;// 1. 尝试Storage存储器里读取Attrube属性为JUST_CREATED_、JUST_CREATED_NOT_PREFIX_//等Key属性的值,即tokenValueif(storage.get(splicingKeyJustCreatedSave()) != null) {tokenValue = String.valueOf(storage.get(splicingKeyJustCreatedSave()));}........return tokenValue;}

获取tokenValue后创建tokenSession并存储到Redis

public SaSession getTokenSession(boolean isCreate) {String tokenValue = getTokenValue();............return getTokenSessionByToken(tokenValue, isCreate);
}
-------->
public SaSession getTokenSessionByToken(String tokenValue, boolean isCreate) {return this.getSessionBySessionId(this.splicingKeyTokenSession(tokenValue), isCreate, (Long)null, (session) -> {// 这里是该 Token-Session 首次创建时才会被执行的方法:session.setType("Token-Session");session.setLoginType(this.getLoginType());session.setToken(tokenValue);});
}
-------->
//拼接:在保存 Token-Session 时,应该使用的 key
public String splicingKeyTokenSession(String tokenValue) {return this.getConfigOrGlobal().getTokenName() + ":" + this.loginType + ":token-session:" + tokenValue;}
-------->
/** * 获取指定 key 的 SaSession, 如果该 SaSession 尚未创建,isCreate = 是否立即新建并返回* @param sessionId SessionId* @param isCreate 是否新建* @return Session对象 */public SaSession getSessionBySessionId(String sessionId, boolean isCreate, Long timeout, Consumer<SaSession> appendOperation) {// 先检查这个 SaSession 是否已经存在,如果不存在且 isCreate=true,则新建并返回SaSession session = getSaTokenDao().getSession(sessionId);if(session == null && isCreate) {// 创建这个 SaSessionsession = SaStrategy.instance.createSession.apply(sessionId);...........// 将这个 SaSession 入库getSaTokenDao().setSession(session, timeout);}return session;//Redis存储返token-session,并返回}

同一账号在不同设备登录后独享的Token和Token-session 的Redis展示:
在这里插入图片描述
3)自定义Session( Custom-Session)
Custom-Session不依赖特定的 账号id 或者 token,而是依赖于你提供的SessionId,
由 SaSessionCustomUtil.getSessionById(“SessionId”);
流程忽略

6.持久层扩展

可集成 Redis,重启数据不丢失。
pom.xml 依赖

        <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) --><dependency><groupId>cn.dev33</groupId><artifactId>sa-token-redis-jackson</artifactId><version>1.39.0</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency>

获取token指定的SaSession

    SaSession tokenSession = StpUtil.getTokenSessionByToken(token);---------->/** * 获取指定 token 的 Token-Session,如果该 SaSession 尚未创建,isCreate代表是否新建并返回* @param tokenValue token值* @param isCreate 是否新建 * @return session对象*/public SaSession getTokenSessionByToken(String tokenValue, boolean isCreate) {return getSessionBySessionId(splicingKeyTokenSession(tokenValue), isCreate, null, session -> {session.setType(SaTokenConsts.SESSION_TYPE__TOKEN);session.setLoginType(getLoginType());session.setToken(tokenValue);});}
---------->SaSession session = getSaTokenDao().getSession(sessionId);---------->	//返回当前 StpLogic 使用的持久化对象public SaTokenDao getSaTokenDao() {return SaManager.getSaTokenDao();}---------->	public interface SaTokenDao {default SaSession getSession(String sessionId) {return (SaSession)getObject(sessionId);}}---------->	@Componentpublic class SaTokenDaoRedisJackson implements SaTokenDao {public Object getObject(String key) {return this.objectRedisTemplate.opsForValue().get(key);}}

Sa-Token 持久层接口SaTokenDao实现类:SaTokenDaoRedisJackson、SaTokenDaoDefaultImpl。

  • SaTokenDaoRedisJackson:持久层接口实现类(基于redis),由sa-token-redis-jackson.1.39.0.jar包自动装配[org.springframework.boot.autoconfigure.EnableAutoConfiguration
  • =cn.dev33.satoken.dao.SaTokenDaoRedisJackson]
  • SaTokenDaoDefaultImpl:持久层接口默认实现类(基于内存 Map,系统重启后数据丢失)

7.全局侦听器

在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作。
Sa-Token 提供一种侦听器机制,通过注册侦听器,你可以订阅框架的一些关键性事件,例如:用户登录、退出、被踢下线等。
在这里插入图片描述
侦听器实现参考

用户退出流程

/*** [work] 会话注销,根据账号id 和 注销参数* @param loginId 账号id* @param logoutParameter 注销参数*/public void _logout(Object loginId, SaLogoutParameter logoutParameter) {// 1、获取此账号的 Account-Session,上面记录了此账号的所有登录客户端数据SaSession session = getSessionByLoginId(loginId, false);session.logoutByTerminalCountToZero();}--------->/** 注销Session (从持久库删除) */public void logout() {SaManager.getSaTokenDao().deleteSession(this.id);// $$ 发布事件 SaTokenEventCenter.doLogoutSession(id);}--------->//Sa-Token 事件中心 事件发布器:提供侦听器注册、事件发布能力public class SaTokenEventCenter {public static void doLogoutSession(String id) {for (SaTokenListener listener : listenerList) {listener.doLogoutSession(id);}}}--------->public class SaTokenListenerForLog implements SaTokenListener {@Overridepublic void doLogoutSession(String id) {log.info("SaSession [{}] 注销成功", id);}}

8.全局过滤器

Sa-Token全局过滤器来实现路由拦截器鉴权。
方便的处理跨域,全局设置安全响应头等操作。
实现参考

9.多账号体系认证

一个系统多套账号分开鉴权(比如商城的 User 表和 Admin 表)
实现参考

10.单点登录

在多个互相信任的系统中,用户只需登录一次,就可以访问所有系统。
参考

http://www.dtcms.com/wzjs/263182.html

相关文章:

  • 移动端网站推广电子商务网站推广策略
  • 网站升级中 模版快速优化网站排名软件
  • 邢台网站建设 冀icp备一站传媒seo优化
  • 最专业微网站首选公司搜索关键词排名查询
  • 网站建设公司 保证完成 网站seo优化报告
  • wordpress 应用店商广州seo服务
  • 网站制作开发策划一周热点新闻
  • 58建筑网官网seo外链平台
  • 小程序公众号网站开发nba最新排名
  • 安徽省建设工程信网站营销型网站的公司
  • 上海公安门户网站百度指数电脑版
  • wordpress小工具点seo文章
  • 宁波市节约型机关建设考试网站软文广告文案案例
  • 个人做的网站交换链接的作用
  • 辽宁建设网站站长工具seo综合查询下载
  • 单机做游戏 迅雷下载网站seo优化团队
  • 网站黑名单网站优化方案怎么写
  • 网站推广文章怎么写日本疫情最新数据
  • wordpress阿里云主机名百度seo哪家公司好
  • 如何快速建立网站企业品牌推广方案
  • 有没有做长图的网站sem广告投放是做什么的
  • 南京模板网站建设yandex搜索引擎
  • wordpress腾讯后台账号北京优化网站建设
  • 网站聚合页面百度推广要多少钱
  • 山东广饶县建设局网站查收录
  • 徐州网页关键词优化seo关键词优化排名推广
  • 论坛网站论坛网站建设建设新闻发稿平台
  • 网站建设-英九网络百度提交网址
  • 学校网站的建设目标搜索引擎优化排名工具
  • 淄博网站建设 华夏国际如何免费做网站推广的