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

外贸app英文seo外链

外贸app,英文seo外链,免备案免费虚拟主机,Wordpress防止图片盗链前言 本文属于源码分析,只想了解Shiro使用的读者请略过。 Subject接口是Shiro中非常重要的接口,客户端通常会使用Subject的方法进行登录、登出、鉴权、角色判断等功能。在《Shiro学习(一)——Shiro配置与快速开始》中&#xff0…

前言

本文属于源码分析,只想了解Shiro使用的读者请略过。

Subject接口是Shiro中非常重要的接口,客户端通常会使用Subject的方法进行登录、登出、鉴权、角色判断等功能。在《Shiro学习(一)——Shiro配置与快速开始》中,我们就使用了其login接口。Subject的功能似乎非常强大,那么它到底是什么,为什么能做这么多事呢,值得我们分析一下它的来龙去脉。

 

Subject创建

在《Shiro学习(一)——Shiro配置与快速开始》为例,Subject通过SecurityUtils.getSubject()方法获取,如下:

Subject subject = SecurityUtils.getSubject();

深入到SecurityUtils的源码中看看:

public abstract class SecurityUtils {//......public static Subject getSubject() {Subject subject = ThreadContext.getSubject();if (subject == null) {subject = (new Subject.Builder()).buildSubject();ThreadContext.bind(subject);}return subject;}//......
}

ThreadContext是shiro封装的一个操作线程局部变量的抽象类。第6行通过getSubject()方法获取Subject。在测试的例子中,因为还没创建Subject,所以第7行判断为null,因此第8行创建subject。看看Subject.Builder()干了什么:

public interface Subject {//......public static class Builder {private final SubjectContext subjectContext;private final SecurityManager securityManager;//......public Builder() {this(SecurityUtils.getSecurityManager());}public Builder(SecurityManager securityManager) {if (securityManager == null) {throw new NullPointerException("SecurityManager method argument cannot be null.");}this.securityManager = securityManager;this.subjectContext = newSubjectContextInstance();if (this.subjectContext == null) {throw new IllegalStateException("Subject instance returned from 'newSubjectContextInstance' " +"cannot be null.");}this.subjectContext.setSecurityManager(securityManager);}protected SubjectContext newSubjectContextInstance() {return new DefaultSubjectContext();}
//......public Subject buildSubject() {return this.securityManager.createSubject(this.subjectContext);}}
}

初始化Builder主要做两件事,一是设置SecurityManager,二是创建DefaultSubjectContext作为SubjectContext。接着看看(new Subject.Builder()).buildSubject()怎么创建Subject。它调用了33-35行,34行返回一个由securityManager创建的subejct。因此我们要跟踪securityManager的createSubject方法,前面都是创建subject的外围,接下来才是创建subject对象的核心:

public class DefaultSecurityManager extends SessionsSecurityManager {//......protected SubjectContext copy(SubjectContext subjectContext) {return new DefaultSubjectContext(subjectContext);}public Subject createSubject(SubjectContext subjectContext) {SubjectContext context = copy(subjectContext);context = ensureSecurityManager(context);context = resolveSession(context);context = resolvePrincipals(context);Subject subject = doCreateSubject(context);save(subject);return subject;}protected Subject doCreateSubject(SubjectContext context) {return getSubjectFactory().createSubject(context);}protected SubjectContext ensureSecurityManager(SubjectContext context) {if (context.resolveSecurityManager() != null) {log.trace("Context already contains a SecurityManager instance.  Returning.");return context;}log.trace("No SecurityManager found in context.  Adding self reference.");context.setSecurityManager(this);return context;}protected SubjectContext resolveSession(SubjectContext context) {if (context.resolveSession() != null) {log.debug("Context already contains a session.  Returning.");return context;}try {Session session = resolveContextSession(context);if (session != null) {context.setSession(session);}} catch (InvalidSessionException e) {log.debug("Resolved SubjectContext context session is invalid.  Ignoring and creating an anonymous " +"(session-less) Subject instance.", e);}return context;}protected Session resolveContextSession(SubjectContext context) throws InvalidSessionException {SessionKey key = getSessionKey(context);if (key != null) {return getSession(key);}return null;}protected Session resolveContextSession(SubjectContext context) throws InvalidSessionException {SessionKey key = getSessionKey(context);if (key != null) {return getSession(key);}return null;}protected SessionKey getSessionKey(SubjectContext context) {Serializable sessionId = context.getSessionId();if (sessionId != null) {return new DefaultSessionKey(sessionId);}return null;}protected SubjectContext resolvePrincipals(SubjectContext context) {PrincipalCollection principals = context.resolvePrincipals();if (isEmpty(principals)) {log.trace("No identity (PrincipalCollection) found in the context.  Looking for a remembered identity.");principals = getRememberedIdentity(context);if (!isEmpty(principals)) {log.debug("Found remembered PrincipalCollection.  Adding to the context to be used " +"for subject construction by the SubjectFactory.");context.setPrincipals(principals);} else {log.trace("No remembered identity found.  Returning original context.");}}return context;}//......
}

创建subejct第一件工作是创建SubjectContext,就是subject上下文。第10行复制一份刚才Builder创建的SubjectContext。当然这种复制对subjectContext内部的Map中的对象是浅拷贝,这样使每一个复制出来的SubjectContext都包含了设置好的SecurityManager。12行确保SecurityManager已被设置到SubjectContext中。13行设置Session到SubjectContext中,37行判断SubjectContext是否已有Session,因为SubjectContext从Builder复制出来只包含了SecurityManager,所以是null,因此走43行。由于之前SubjectContext没有设置过Session,因此43行也是返回null。14行是处理Principal,因为之前创建的SubjectContext没有涉及Principal,因此14行是指也没有做任何操作。16行创建Subject,跳转到23行调用DefaultSubjectFactory的createSubject方法。跟踪DefaultSubjectFactory的createSubject方法:

public class DefaultSubjectFactory implements SubjectFactory {//......public Subject createSubject(SubjectContext context) {SecurityManager securityManager = context.resolveSecurityManager();Session session = context.resolveSession();boolean sessionCreationEnabled = context.isSessionCreationEnabled();PrincipalCollection principals = context.resolvePrincipals();boolean authenticated = context.resolveAuthenticated();String host = context.resolveHost();return new DelegatingSubject(principals, authenticated, host, session, sessionCreationEnabled, securityManager);}//......
}

这里会把session、principals、authenticated、host、sessionCreationEnabled查出,并设置到DelegatingSubject对象中。因此Subject subject = SecurityUtils.getSubject();这个语句最终返回一个DelegatingSubject对象。对于本文的例子而言,session、principals、host均为null,sessionCreationEnabled为true,authenticated为false。

http://www.lbrq.cn/news/2610973.html

相关文章:

  • 设计网页的基本流程武汉百度推广优化
  • 智能建站平台z做seo用哪种建站程序最好
  • 西安高校定制网站建设公司推荐it培训机构靠谱吗
  • 做网站程序的都不关注seo网站页面布局和样式设计
  • 营销类网站建设北京seo培训机构
  • 卡片式设计网站制作直播发布会
  • 游戏建模师工资一般多少提升神马seo关键词自然排名
  • 建 网站 是软件开发个人网页制作成品欣赏
  • 福建网站建设公灰色词快速排名方法
  • php mysql网站开发全程实例 pdf中国万网官网登录
  • 学做美食视频网站技术培训机构
  • 外贸做独立网站怎么样大数据查询个人信息
  • 网页制作模板保存seo引擎优化是什
  • 什么网站有题目做专注网站建设服务机构
  • c2c网站网址2345网址导航 中国最
  • dreamweaver做购物网站泉州关键词搜索排名
  • 企业网站中文域名有必要续费吗百度官网
  • 家谱网站的首页怎么做关键词排名提高
  • 要怎么做网站针对百度关键词策划和seo的优化
  • 环保网站建设项目备案系统百度网络营销app下载
  • 国外网站域名 中国手机打开国外网站app
  • 做网站的人网络推广哪家做得比较好
  • 为什么要建设种苗供求网站雅思培训机构哪家好机构排名
  • 晚上网站推荐靠谱的2021简单网页制作模板
  • 找个人制作网页的网站电商营销策略
  • 网站建设的安全威胁广州seo推广
  • 防水堵漏公司做网站效果怎样外链查询工具
  • 网站建设设计原则成都网站建设方案托管
  • 网站改版seo方案免费建站
  • 在与客户谈网页广告时如何让客户相信网站流量网络seo首页
  • 93、【OS】【Nuttx】【构建】cmake menuconfig 目标
  • 阿里云 Flink
  • selenium操作指南
  • 大前端游戏应用中 AI 角色行为智能控制
  • GPU 优化-用 tensor core实现5G Massive MIMO 64x64
  • Linux和mysql练习题2