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 ...
随机推荐
- String & dp Problem Round 3 2017.4.22
对每一个特征求前缀和,如果它减去前面的某一个地方的和,得到的每个特征是相等的,那么然后就可以更新答案. 需要解决这个两个问题 1.如何使答案尽量大? 这个很简单,直接找尽量靠前的地方就好了. 2,如何 ...
- win7 64位debug解决方法
1.下载win 64位的DOSBox,如DOSBox0.74: 2.下载win 32 debug.exe,并复制到调用的目录,如d盘根目录d:\ 3.安装DOSBox,并运行:如下图: 4.键入命令: ...
- POJ 3468 A Simple Problem with Integers(线段树&区间更新)题解
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- UVa 242 邮票和信封(完全背包)
https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...
- 非[无]root权限 服务器 下安装perl以及perl模块
转载自http://www.zilhua.com 在本博客中,所有的软件安装都在服务器上,且无root权限.理论上适合所有的用户. 我的安装目录 cd /home/zilhua/software 1. ...
- neu 1694 Primorial vs LCM 数论
1694: Primorial vs LCM 时间限制: 4 Sec 内存限制: 128 MB[提交][状态][讨论版] 题目描述 Given N (2<=N<=10^14), what ...
- hdu 2586 How far away ? 带权lca
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P ...
- 数组类型的退化Decay
Decay即数组在某些情况下将退化为指针. 测试代码: #include <iostream> #include <typeinfo> template <typenam ...
- ubuntu下xx-net可用IP为0, ping6显示 Network is unreachable
不知和xx-net有没有关系. 全新安装系统 sudo apt-get install miredo 这时, ping6 ipv6.google.com 是能ping通的 按github上依次安装py ...
- Codeforces 820B - Mister B and Angle in Polygon
820B - Mister B and Angle in Polygon 思路: 由于正多边形以某个顶点分成的三角形后以这个点为顶点的角都相等,所以可以确定两个点为相邻点,只要再找一个点就够了. 证明 ...