cas AssertionThreadLocalFilter
AssertionThreadLocalFilter
AssertionThreadLocalFilter作用很简单,就是将Assertion绑定到ThreadLocal。
ThreadLocal
无论如何,编写一个多线程安全(Thread-local)的程序是困难的,为了让线程共享资源,必须小心的对共享资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同步的时候,又要注意对象的锁定和释放,避免产生死结,种种因素使得编写多线程程序变得困难。
尝试从另一个角度来思考多线程共享资源的问题,既然共享资源这么困难,那么就干脆不要共享,何不为每个线程创造一个资源的复本。将每一个线程存取数据的行为进行隔离,实现的方法就是给予每个线程一个特定空间来保管该线程锁独享的资源。
ThreadLocal顾名思义它就是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程提供一个变量值得副本,是每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。
使用场景:
1) To keep state with a thread
2) to cache objects which you need frequestly
ThreadLocal类
它主要由四个方法组成,initValue()/get()/set(T)/remove() 其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get() 或者set(object)时才执行,并且仅仅执行一次。ThreadLocal中确确实实直接返回一个null.
ThreadLocal的原理
ThreadLocal是如何作到为每一个线程维护变量的副本的?
其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
public class ThreadLocal
{
private Map values = Collections.synchronizedMap(new HashMap());
public Object get()
{
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread))
{
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue)
{
values.put(Thread.currentThread(), newValue);
}
public Object initialValue()
{
return null;
}
}
***我们看下AssertionThreadLocalFilter做了哪些事情 ***
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
//转换参数
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpSession session = request.getSession(false);
//取得Assertion对象,如果session为null则从request中取得,否则从session中取得。
final Assertion assertion = (Assertion) (session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION));
try {
//绑定到ThreadLocal
AssertionHolder.setAssertion(assertion);
// 处理后面的过滤器,这样后面的Fileter和Servlet可以在线程中取得Assertion对象。
filterChain.doFilter(servletRequest, servletResponse);
} finally {
//处理完毕后清理线程
AssertionHolder.clear();
}
}
我们后面的代码就可以直接使用了
AssertionHolder.getAssertion();
cas AssertionThreadLocalFilter的更多相关文章
- CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录
一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...
- cas单点登录搭建
Cas Server下载:http://developer.jasig.org/cas/ Cas Client下载:http://developer.jasig.org/cas-clients/ 测试 ...
- CAS代理配置
CAS Server:www.sinosoft.com 代理服务:palace.sinosoft.com 被代理服务:gguser.sinosoft.com 1. 建立key,命令如下: keytoo ...
- SSO之CAS单点登录实例演示
本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...
- 测试CAS
参考博客 http://www.cnblogs.com/adolfmc/archive/2012/07/16/2593291.html 准备工作: 1.cas服务器:http://cas:8443/l ...
- cas的http配置和rmi远程调用
1.cas配置http请求(服务端) 1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.w ...
- sso demo ( cas )
1. generate keystore command : keytool -genkey -alias testtomcat -keyalg RSA -keystore "C:\User ...
- CAS实现单点登入(sso)经典教程
本教程我已按照步骤实现,不过要深入了解单点登入还需要进一步的学习,掌握其中的精髓. 一.简介 1.cas是有耶鲁大学研发的单点登录服务器 2.本教材所用环境 Tomcat7.2 JDK6 CAS Se ...
- CAS做单点登陆(SSO)——集成BIEE 11g
BIEE 11G和CAS集成零代码编写,只需配置. 更改BIEE analytics应用的web.xml 将analytics.war解包(使用7-zip或者Win-rar就可以),然后修改WEB-I ...
随机推荐
- UVa 714 Copying Books - 二分答案
求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...
- SQL数据插入字符串时转义函数
函数一: std::string CheckString(std::string& strSource) { std::string strOldValue = "'"; ...
- bzero, memset ,setmem 区别【转】
本文转载自:http://chang6520.blog.163.com/blog/static/112665875201302843359715/ bzero 原型: extern void bzer ...
- luogu P1880石子归并
石子归并 luogu1880 传送门 noi1995 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得 ...
- Dubbo学习参考
参考博客: 小宝鸽:https://blog.csdn.net/u013142781/article/details/50387583 https://blog.csdn.net/u013142781 ...
- Mac升级到EI Captain之后pip install 无法使用问题
错误log: creating /System/Library/Frameworks/Python.framework/Versions/2.7/share error: could not crea ...
- MVC ---- Lambda表达式
Lambda表达式是比匿名函数还简洁的一种匿名方法语法 Lambda表达式缩写推演 new Func<string,int>(delegate(string str){return str ...
- python 字节与字符串转化
name = 'laogaoyang' # 采用系统默认编码格式 nameBytes = name.encode('utf-8') # 先将 name 解码(采用系统默认格式),然后用 'utf-8' ...
- jekins 插件离线安装
官网插件地址:http://updates.jenkins-ci.org/download/plugins/ 系统管理->插件管理->高级 选择一个下载好的插件,然后点击上传即可 然后就会 ...
- Qt5.3.2openglVS2010_QSqlField_字段类型
1.本来想通过 QSqlField::typeID() 来找字段类型,但是没找到... 然而看到了 SQL_INTEGER.SQL_SMALLINT等的使用(在“static QVariant::Ty ...