如何cas 配置 数据库使用CAS的PHP客户端

相关文章推荐:
cas php如何与java 客户端
兄弟近日尝试将一个php程序以单点登录方式和原有的系统整合在一起。
验证服务器选用的是CAS,其提供有相应的php客户端。
整个过程如下:
1、搭建CAS服务器
2、搭建php应用环境
3、下载相应的php库
4、修改php应用环境配置
5、测试cas的php客户端
6、修改原有的程序,使用CAS来完成登录。
具体细节如下:
这个比较简单,网上文章也比较多,我就不罗嗦了。基本步骤为:1、制作签名 2、打开SSL 3、部署CAS服务 4、利用cas的java客户端拦截应用。
现在流行...
回复 (4) 浏览 (2989)
其他文章推荐
ITPUB官方微博:
数据库是11G,CPU16个,内存50G,Win2003系统。用于数据仓库,经常需要由源表生成一些统计表,聚合表,源表数据量有几百亿,现在的问题插入数据超慢,我看CPU的使用率才百分之10几,内存最多用到40G,应该是磁盘IO的问题,V$SESSION_WAIT里有好多dbfileparallelread,dbfi ......
回复 (77) 浏览 (1145)
本人刚做市场这一块,如何获取银行这些项目信息?貌似官网上也没有项目招标的信息...有人了解的哇!...
回复 (11) 浏览 (425)
在某工厂创建BOM时,输入物料号、工厂和用途后,回车,提示“数据不一致(通知你们的系统管理员)消息号29002诊断系统中存在分配给特殊BOM的对象(如物料、设备项目)的数据记录。因为该BOM没有任何数据,且该BOM不受时间限制,所以分配中特定的BOM并不存在。”但是在另一 ......
回复 (8) 浏览 (159)
本帖最后由overloving于4:11编辑1、什么是ERP?ERP(EnterpriseResourcesPlanning,“企业资源计划”系统)是由不同功能模块组成的软件包,它采用计算机和网络通讯技术的最新成就,是旨在对企业的多种资源进行计划和实现物流、资金流、信息流(“三流”)统一 ......
回复 (4) 浏览 (229)
需要从一个11g(11.2.0.3)中把数据导到一个9i(9.2.0.8)中,考虑到高版本的dmp不能导入低版本中,所以想使用9i的客户端连接11g的服务端把数据导出来。但是,exp命令执行后,只到“已完成ZHS16GBK字符集和AL16UTF16NCHAR字符集中的导出”,之后便退出了,也没有任何数据 ......
回复 (10) 浏览 (219)
操作系统:SUSELinuxEnterpriseServer11(i586)数据库版本:oracle10.2.0.1数据库客户端版本:oracle10.2.0.1引言:公司近期二期项目建设,新买的PCserver需要在上面部署oracle客户端方便访问数据库,我们自然习惯使用图形化界面来安装了,好处省事又直观,我们在远程维护 ......
回复 (3) 浏览 (111)
不用安装oracle客户端,PL/SQL也能远程访问数据库发表人:fangliangkx|发表时间:2012年八月01日,16:13最近在网上看到有人说,不安装客户端也可以PL.SQL.Developer直接远程连接服务器,但搜了下没有完整的操作说明,大多都是支言片语,所以自己尝试着测试了一下,结果真的 ......
回复 (6) 浏览 (781)
&&&&&&&这个场景比较特殊,是一个客户遇到的问题触发我写的这篇文章。数据库服务器通常安装的都是64位的操作系统和64位的数据库软件。客户端使用的操作系统和客户端程序复杂度远比服务器要多很多,安装的客户端操作系 ......
回复 (17) 浏览 (4561)
遇到一个非常奇怪的问题,mysql命令行下无法输入中文,但是在操作系统层是没有问题的,进入mysql命令行看就无法正常输入,无论如何设置setnames,或者是启动前附加--default-character-set均不行,复制粘贴字节的方式也不行,不过浏览包含中文字符的表或字段倒能够正常显 ......
回复 (6) 浏览 (1199)
&最近帮同事解决了几个TNS连接故障,觉得很有代表性。所以打算把一帮常用的处理思路记录下来,权当记录。&每个Oracle的学习者在安装完数据库、客户端之后,对服务器、实例、监听器、本地服务名和服务名ServiceName这些概念不容易弄清楚。在Windows下,经常 ......
回复 (4) 浏览 (175)
文章推荐:
盛拓传媒:
友情链接:
特别鸣谢:
北京皓辰网域网络信息技术有限公司. 版权所有
北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证:编号(京)字第1149号
ITPUB推荐文章解答你所有技术难题2012年浙大九月月赛总结 (ZOJ Monthly, September 2012)_cas 3.4登录顺利返回用户更多信息_XStream XML-Object变换__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
2012年浙大九月月赛总结 (ZOJ Monthly, September 2012)
cas 3.4登录顺利返回用户更多信息
XStream XML-Object变换
2012年浙大九月月赛总结 (ZOJ Monthly, September 2012)
2012年浙大9月月赛总结 (ZOJ Monthly, September 2012)
本次比赛由我、DTen和ssslpk完成,一台机子进行。
因为迟到了两个小时,最终只出四题,最终排名81。其中我出了2题,Dten出了一题二分匹配,sssplk出了一道组合数学。Dten的那道二分匹配是我和他一起做的,卡了好久,正是因为这题卡太久没时间敲A题,不然A题是绝对可以AC的,赛时想的思路赛后十几分钟就AC了。
正是这场比赛,让我明白:自己最熟悉的题应该放在第一位,大家都过的题应该在第二位。
到现在我们共A了6道题,余下的题比较神奇,慢慢补。现在说下这场比赛的题目(前面数字是题目在Zoj上的题号):
Zoj 3644 Kitty's Game
DP。第一步先把k的因子找出来,用map进行映射。第二步设Dp[i][j]为到达i节点第j个因子的方案数。 本题给的有向图,不一定无环,这就有可能陷入死循环,这个要怎么处理呢?出题者很厚道,规定如果当前分数和下一个点的分数的最小公倍数为当前分数那就不往下走,一个数进入一个环,然后又回到进入环的那个点,这时候的公倍数相当于整个环内的公倍数和进入环时的公倍数的最小公倍数,然后再在环里走最小公倍数将不会改变,这样就保证不会再环里一直死循环下去。
然后用拓扑排序或者记忆化搜素都很好写。
Zoj 3645 BiliBili
题目给出的方程组是x^2 - 2 * x * x0 + x0 * x0 + .... = dit ^2,我们很难处理又有x^2又有-2*x*x0的,所以用前一行减去后一行,得到新的不带x^2的方程组。得到这样的方程组后套个double型的高斯消元模版,最后再处理下-0.00的情况就可以了。
Zoj 3646 Matrix Transformer
二分匹配。这题很难往图论这边想,一开始我们是yy,然后往高斯消元方面想,然后又开始yy。最后开窍用二分匹配过掉了。
Zoj 3647 Gao the Grid
ssslpk AC的题。在一个n*m个方格中(顶点有(n+1)*(m+1)个),求所有三角形数,即三点不共线的所有情况。令所有点的个数为t,用c[t,3]来枚举所有情况,用总数扣去所有三点共线数就是所求的三角形数。那么在求三点共线的情况时,水平和垂直的情况读者自己考虑。对于倾斜的情况,先枚举两端的端点,如图,在一个6*10的方格中选4*4的两个端点,其中可构成三点花线的另一点的个数为最大公约数gcd(4,4)
-1.如图中的三个点,然后用乘于剩下的倍数(6-4+1)*(10-4+1),再乘于2(倾斜时有右上,右下两种情况).然后依次枚举所有的矩形,求出所有三点共线的情况。于是所有情况减三点共线情况就是答案了。
Zoj 3649 Social Net 学校的胖神牛用Q-tree过掉了此题。赛后becauseofyou说dp也可以做。那就是多解吧。
Zoj 3652 Maze 学校的一队就叫Maze,然后出了一题也叫Maze,当时是被他们AC了。赛后我也AC了。带状态压缩的搜索,得用优先队列来优化,不然会超时。然后有几个trick,1、起点终点有可能不可达 2、起点可能是终点,这时候输出0 3、第k只野兽可能不出现在矩阵中数字为k的地方,处理状态的时候要和其他分开。
Zoj 3653 Letty's Math Class 简单模拟题。第一个可能是负号也可能不是符号,为了不特判我在0这个位置插入一个+号,然后从前往后遍历处理一遍。中间的计算可能爆64位,用double来做,稳妥点。
解题报告写得很粗糙题目也很少,大牛神牛勿喷..
因为这场月赛ac的题目,zoj上的ac数目终于破百了,yuo xi。
本文ZeroClock原创,但可以转载,因为我们是兄弟。
附D题代码:#include &cstdlib&
#include&math.h&
#include&stdio.h&
#define int64 long long int
#define N 1002
int64 f[N][N];
int gcd(int a,int b){return b? gcd(b,a%b):}
void init()
for(int i=1;i&=1000;i++)
for(int j=i;j&=1000;j++)
int d=gcd(i,j);
f[i][j]=f[j][i]=(int64)(d-1);
int main() {
int64 n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
int64 sum=0;
for(int64 i=1;i&=n;i++)
for(int64 j=1;j&=m;j++)
sum+=f[j][i]*2*(n-i+1)*(m-j+1);
if(n&=2)sum+=(n+1)*(n)*(n-1)/6*(m+1);
if(m&=2)sum+=(m+1)*(m)*(m-1)/6*(n+1);
int64 t=(n+1)*(m+1);
if(t%3==0)
if((t-1)%2==0)num=t/3*(t-1)/2*(t-2);
else num=t/3*(t-2)/2*(t-1);
else if((t-1)%3==0)
if(t%2==0)
num=t/2*(t-1)/3*(t-2);
else num=(t-1)/6*(t-2)*t;
if((t-1)%2==0)
num=(t-1)/2*(t-2)/3*t;
num=(t)/2*(t-2)/3*(t-1);
printf("sum: %lld\n",sum);
printf("%lld\n",num-sum);
cas 3.4登录顺利返回用户更多信息
cas 3.4登录成功返回用户更多信息
我的上一篇博客介绍了cas服务端,java和php客户端的配置。今天介绍下cas 3.4登录成
功返回用户更多信息。cas登录成功默认返回的只有用户名,
java客户端获取:
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
String username = principal.getName();
php客户端获取
$username=phpCAS::getUser();
我们的程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况。cas
各种版本配置方式也不尽相同,这里讲的是目前最新版本3.4.4。配置方式如下,
一、首先需要配置属性attributeRepository,首先,你需要到WEB-INF目录找到
deployerConfigContext.xml文件,同时配置attributeRepository如下:
class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository"&
&constructor-arg index="0" ref="casDataSource"/&
&constructor-arg index="1" value="select * from userinfo where {0}"/&
&property name="queryAttributeMapping"&
//这里的key需写username,value对应数据库用户名字段
&entry key="username" value="loginname"/&
&/property&
&property name="resultAttributeMapping"&
&entry key="id" value="id"/&
&entry key="mobile" value="mobile"/&
&entry key="email" value="email"/&
&/property&
其中queryAttributeMapping是组装sql用的查询条件属性,如下表中
结合 封装成查询sql就是select * from userinfo where loginname=#username#,resultAttributeMapping是sql执行完毕后返回的结构属性, key对应数据库字段,value对应客户端获取参数。
二、配置用户认证凭据转化的解析器,也是在deployerConfigContext.xml中,找到
credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver注入attributeRepository,那么attributeRepository就会被触发并通过此类进行解析,红色为新添部分。
&property name="credentialsToPrincipalResolvers"&
class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver"&
&property name="attributeRepository" ref="attributeRepository"/&
class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/&
&/property&
三、修改WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分
&cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'& &cas:authenticationSuccess&
&cas:user&${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}&/cas:user&
&c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) & 0}"&
&cas:attributes&
&c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"&
&cas:${fn:escapeXml(attr.key)}&${fn:escapeXml(attr.value)}&/cas:${fn:escapeXml(attr.key)}&
&/c:forEach&
&/cas:attributes&
&c:if test="${not empty pgtIou}"&
&cas:proxyGrantingTicket&${pgtIou}&/cas:proxyGrantingTicket&&/c:if&&c:if test="${fn:length(assertion.chainedAuthentications) & 1}"&
&cas:proxies&&c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1"&
&cas:proxy&${fn:escapeXml(proxy.principal.id)}&/cas:proxy&&/c:forEach&
&/cas:proxies&&/c:if& &/cas:authenticationSuccess&&/cas:serviceResponse&
通过完成上面三个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?下面进行说明:
java客户端获取:
AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
Map attributes = principal.getAttributes();
String email=attributes .get("email");
php客户端;
$email=phpCAS::getAttribute('email');
这里补充一下,实现返回功能的attributeRepository在person-directory-impl-1.5.0-RC6.jar这个jar包中,其中执行查询的在类org.jasig.services.persondir.support.jdbc.AbstractJdbcPersonAttributeDao.java中,如果对返回值有其他要求,比如我的就是需要调用webservice获取返回值可以在这个文件封装自己的返回值,或者修改查询条件。
List results = this.simpleJdbcTemplate.query(querySQL, rowMapper, params);
//List中results 中保存的对象为Map&String,Object&类型的所以自定义
Map&String, Object& map=new HashMap&String, Object&();//
map.put("ID", 3);//
map.put("LOGINNAME", "allen");//
map.put("PASSWORD","123456");//
map.put("ADDTIME", " 00:00:00.0");//
map.put("STATE", 0);//
map.put("MOBILE", "");//
map.put("EMAIL", );
results.add(map);
return parseAttributeMapFromResults(results, queryUserName);
写在最后,若按照以上配置还是不能获得返回值的话,我通过调试源码发现把源码中
org.jasig.cas.CentralAuthenticationServiceImpl.java 编译后再cas-server-core-3.4.4.jar中的第360-368行代码给注释掉就ok了,
for (final String attribute : registeredService361//
.getAllowedAttributes()) {362//
final Object value = principal.getAttributes().get(363//
attribute);364//
if (value != null) {366//
attributes.put(attribute, value);367//
至于原因嘛目前还没搞明白,有知道的可以交流下。
写在最后,若按照以上配置还是不能获得返回值的话,我通过调试源码发现把源码中org.jasig.cas.CentralAuthenticationServiceImpl.java 编译后再cas-server-core-3.4.4.jar中的第360-368行代码给注释掉就ok了,360//
for (final String attribute : registeredService361//
.getAllowedAttributes()) {362//
final Object value = principal.getAttributes().get(363//
attribute);364//
if (value != null) {366//
attributes.put(attribute, value);367//
}至于原因嘛目前还没搞明白,有知道的可以交流下。
也遇见了楼主说的这个问题.deployerConfigContext.xml文件中 &bean
id="serviceRegistryDao"
class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"&这个bean的registeredServices配置了不同协议对应的一些参数.默认是
&property name="registeredServices"&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="0" /&
&property name="name" value="HTTP" /&
&property name="description" value="Only Allows HTTP Urls" /&
&property name="serviceId" value="http://**" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="1" /&
&property name="name" value="HTTPS" /&
&property name="description" value="Only Allows HTTPS Urls" /&
&property name="serviceId" value="https://**" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="2" /&
&property name="name" value="IMAPS" /&
&property name="description" value="Only Allows HTTPS Urls" /&
&property name="serviceId" value="imaps://**" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="3" /&
&property name="name" value="IMAP" /&
&property name="description" value="Only Allows IMAP Urls" /&
&property name="serviceId" value="imap://**" /&
RegisteredServiceImpl有一个allowedAttributes的属性很关键,这个属性配置的list就是允许哪些属性可以传送到客户端,因为我用的是http,所以在http对应RegisteredServiceImpl中加入配置
&property name="allowedAttributes"&
&value&&!-- your attribute key --&&/value&
&/property&
一步步配置过来,allowedAttributes可以配置了;可是map就是没有东西,求解!
service中断点调试已经将值放进去了,但是客户端也是取不到值,你解决没。?
只要设置一下ignoreAttributes=true就可以了
&bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"&
&property name="registeredServices"&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="0" /&
&property name="name" value="HTTP" /&
&property name="description" value="Only Allows HTTP Urls" /&
&property name="serviceId" value="http://**" /&
&property name="evaluationOrder" value="" /&
&!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--&
&property name="ignoreAttributes" value="true" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="1" /&
&property name="name" value="HTTPS" /&
&property name="description" value="Only Allows HTTPS Urls" /&
&property name="serviceId" value="https://**" /&
&property name="evaluationOrder" value="" /&
&!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--&
&property name="ignoreAttributes" value="true" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="2" /&
&property name="name" value="IMAPS" /&
&property name="description" value="Only Allows HTTPS Urls" /&
&property name="serviceId" value="imaps://**" /&
&property name="evaluationOrder" value="" /&
&!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--&
&property name="ignoreAttributes" value="true" /&
&bean class="org.jasig.cas.services.RegisteredServiceImpl"&
&property name="id" value="3" /&
&property name="name" value="IMAP" /&
&property name="description" value="Only Allows IMAP Urls" /&
&property name="serviceId" value="imap://**" /&
&property name="evaluationOrder" value="" /&
&!-- ignoreAttributes为true表示 配置的 resultAttributeMapping 会返回--&
&property name="ignoreAttributes" value="true" /&
&/property&
private RegisteredService constructDefaultRegisteredService(final List&String& attributes) {
final RegisteredServiceImpl r = new RegisteredServiceImpl();
r.setAllowedToProxy(true);
r.setAnonymousAccess(false);
r.setEnabled(true);
r.setSsoEnabled(true);
r.setAllowedAttributes(attributes);
if (attributes == null || attributes.isEmpty()) {
r.setIgnoreAttributes(true);
里面已经自己设置了?
XStream XML-Object变换
XStream XML-Object转换
XStream XML-Object转换
博客分类:
http://xstream.codehaus.org XStream是一个序列化对象为XML或XML转换为对象的库. 特点: 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有字段,不需要setter/getter方法,final字段;非公有类,内部类;类不需要默认构造器,完全对象图支持.维护对象引用计数,循环引用. i 提供序列化接口; 自定义转换类型策略; 详细的错误诊断; 快速输出格式;当前支持 JSON 和 morphing. 使用场景 Transport
转换 Persistence
持久化对象 Configuration
配置 Unit Tests
单元测试 限制 enhanced 模式: JDK版本 不能&1.5. 虽然预处理注解是安全的,但自动侦查注解可能发生竞争条件. 两分钟简单教程 http://xstream.codehaus.org/tutorial.html XML解析器 1. XPP3 (需要 xpp3-[version].jar) XStream xstream = new XStream(new XppDriver()); 2. JAXP DOM XStream xstream = new XStream(new DomDriver()); 类型别名Alias XStream 默认使用完全限制类名作为XML的元素名称.通过使用别名可修改元素名称为指定名称. xstream.alias("person", Person.class); xstream.alias("phonenumber", PhoneNumber.class); 字段别名 Stream 默认使用字段名, 优先级高于类型. 集合字段中的对象默认使用类型别名. xstream.aliasField("phonenumber", Person.class, "phone"); 注意: Person.class
是包含此字段的类,而不是字段的类型.字段是phone, 别名是phonenumber. 下面也是如此. 序列化与反序列化 对象不需要实现序列化接口. 反序列的对象与原对象不是同一对象. String xml = xstream.toXML(obj); T obj = (T)xstream.fromXML(xml); 隐式集合 当我们使用集合类时不想显示集合,只显示里面的元素即可. 使用隐式集合前: &list&
&element /&
&element /& &list& 使用隐式集合: xstream.addImplicitCollection(Person.class, "list"); 使用隐式集合后:
&element /&
&element /& XML属性 将类的字段转换成类映射元素的一个属性,而不是元素. xstream.useAttributeFor(Blog.class, "author"); xstream.registerConverter(new AuthorConverter()); //
注册将对象转换成字符串的转换类. class AuthorConverter implements SingleValueConverter {
public String toString(Object obj) {
return ((Author) obj).getName();
public Object fromString(String name) {
return new Author(name);
public boolean canConvert(Class type) {
return type.equals(Author.class);
} } SingleValueConverter
转换成简单字符串 Converter
转换成对象 包别名 xstream.aliasPackage("my.company", "org.thoughtworks"); 注解 @XStreamAlias("message") 别名注解 作用目标: 类,字段 @XStreamImplicit 隐式集合 @XStreamImplicit(itemFieldName="part") 作用目标: 集合字段 @XStreamConverter(SingleValueCalendarConverter.class) 注入转换器 作用目标: 对象 @XStreamAsAttribute 转换成属性 作用目标: 字段 @XStreamOmitField 忽略字段 作用目标: 字段 Auto-detect Annotations 自动侦查注解 xstream.autodetectAnnotations(true); 自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型. 对象流 bjectOutputStream out = xstream.createObjectOutputStream(someWriter); ObjectInputStream in = xstream.createObjectInputStream(someReader); 持久化对象 public void persist(String dir, List objects) { PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir)); List&?& list = new XmlArrayList(strategy); list.addAll(objects); } JSON 解析器: Jettison StAX XStreamFacade.java
package cn.bisoft.java.
import java.io.F
import java.util.L
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.io.json.JettisonMappedXmlD
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamD
import com.thoughtworks.xstream.io.xml.DomD
import com.thoughtworks.xstream.io.xml.XppD
import com.thoughtworks.xstream.persistence.FilePersistenceS
import com.thoughtworks.xstream.persistence.PersistenceS
import com.thoughtworks.xstream.persistence.XmlArrayL
public class XStreamFacade
private static XS
public static final String JAXP_DOM_XML = "JAXP DOM";
public static final String XPP3_XML_PARSER = "XPP3";
public static final String STAX_JSON_PARSER = "Jettison StAX";
public static final String WRITER_JSON_PARSER = "Only Writer JSON";
public synchronized static XStream getXStream(String driver)
if (JAXP_DOM_XML.equals(driver))
xstream = new XStream(new DomDriver());
xstream.autodetectAnnotations(true);
else if (XPP3_XML_PARSER.equals(driver))
xstream = new XStream(new XppDriver());
xstream.autodetectAnnotations(true);
else if (STAX_JSON_PARSER.equals(driver))
xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
else if (WRITER_JSON_PARSER.equals(driver))
xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream = new XStream(new DomDriver());
@SuppressWarnings("unchecked")
public void persist(String dir, List objects)
PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
List&?& list = new XmlArrayList(strategy);
list.addAll(objects);
package cn.bisoft.java.
import java.io.F
import java.util.L
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.io.json.JettisonMappedXmlD
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamD
import com.thoughtworks.xstream.io.xml.DomD
import com.thoughtworks.xstream.io.xml.XppD
import com.thoughtworks.xstream.persistence.FilePersistenceS
import com.thoughtworks.xstream.persistence.PersistenceS
import com.thoughtworks.xstream.persistence.XmlArrayL
public class XStreamFacade
private static XS
public static final String JAXP_DOM_XML = "JAXP DOM";
public static final String XPP3_XML_PARSER = "XPP3";
public static final String STAX_JSON_PARSER = "Jettison StAX";
public static final String WRITER_JSON_PARSER = "Only Writer JSON";
public synchronized static XStream getXStream(String driver)
if (JAXP_DOM_XML.equals(driver))
xstream = new XStream(new DomDriver());
xstream.autodetectAnnotations(true);
else if (XPP3_XML_PARSER.equals(driver))
xstream = new XStream(new XppDriver());
xstream.autodetectAnnotations(true);
else if (STAX_JSON_PARSER.equals(driver))
xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
else if (WRITER_JSON_PARSER.equals(driver))
xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream = new XStream(new DomDriver());
@SuppressWarnings("unchecked")
public void persist(String dir, List objects)
PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
List&?& list = new XmlArrayList(strategy);
list.addAll(objects);
------------ 扩展: 1. XBird 2. XStream.XPATH_RELATIVE_REFERENCES (Default) Uses relative XPath references to signify duplicate references. This produces XML with the least clutter. XStream.XPATH_ABSOLUTE_REFERENCES Uses absolute XPath references to signify duplicate references. This might produce for some situations better readable XML. Note, that XStream will read XML with relative paths as well as with absolute paths independent of the XPATH mode. XStream.ID_REFERENCES Uses ID references to signify duplicate references. In some scenarios, such as when using hand-written XML, this is easier to work with. XStream.NO_REFERENCES This disables object graph support and treats the object structure like a tree. Duplicate references are treated as two separate objects and circular references cause an exception. This is slightly faster and uses less memory than the other two modes. 3. 转换器 示例 XStreamFacade.java
package cn.bisoft.java.
import java.io.F
import java.util.L
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.converters.reflection.ReflectionP
import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionP
import com.thoughtworks.xstream.io.json.JettisonMappedXmlD
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamD
import com.thoughtworks.xstream.io.xml.DomD
import com.thoughtworks.xstream.io.xml.XppD
import com.thoughtworks.xstream.persistence.FilePersistenceS
import com.thoughtworks.xstream.persistence.PersistenceS
import com.thoughtworks.xstream.persistence.XmlArrayL
public class XStreamFacade
public static final String JAXP_DOM_XML = "JAXP DOM";
public static final String XPP3_XML_PARSER = "XPP3";
public static final String STAX_JSON_PARSER = "Jettison StAX";
public static final String WRITER_JSON_PARSER = "Only Writer JSON";
public synchronized static XStream getXStream(String driver, boolean isStaticSupported)
ReflectionProvider reflectProvider = null;
if (isStaticSupported)
reflectProvider = new EnhancedModeReflectProvider();
reflectProvider = new Sun14ReflectionProvider();
if (JAXP_DOM_XML.equals(driver))
xstream = new XStream(reflectProvider, new DomDriver());
xstream.autodetectAnnotations(true);
System.err.println(xstream.getReflectionProvider());
else if (XPP3_XML_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new XppDriver());
xstream.autodetectAnnotations(true);
else if (STAX_JSON_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
else if (WRITER_JSON_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream = new XStream(reflectProvider, new DomDriver());
@SuppressWarnings("unchecked")
public void persist(String dir, List objects)
PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
List&?& list = new XmlArrayList(strategy);
list.addAll(objects);
private static XS
package cn.bisoft.java.
import java.io.F
import java.util.L
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.converters.reflection.ReflectionP
import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionP
import com.thoughtworks.xstream.io.json.JettisonMappedXmlD
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamD
import com.thoughtworks.xstream.io.xml.DomD
import com.thoughtworks.xstream.io.xml.XppD
import com.thoughtworks.xstream.persistence.FilePersistenceS
import com.thoughtworks.xstream.persistence.PersistenceS
import com.thoughtworks.xstream.persistence.XmlArrayL
* XStreamFacade
* 提供对XStream的初始化,降低使用XStream API的复杂性.
* @author tl
* @version 1.0,
public class XStreamFacade
public static final String JAXP_DOM_XML = "JAXP DOM";
public static final String XPP3_XML_PARSER = "XPP3";
public static final String STAX_JSON_PARSER = "Jettison StAX";
public static final String WRITER_JSON_PARSER = "Only Writer JSON";
* 获取XStream对象.
* 根据驱动获取XStream对象,若没有提供驱动,则默认使用JAXP-DOM驱动.
* @param driver 驱动名称
* @param isStaticSupported 是否支持静态变量转换
* @return XStream
public synchronized static XStream getXStream(String driver, boolean isStaticSupported)
ReflectionProvider reflectProvider =
if (isStaticSupported)
reflectProvider = new EnhancedModeReflectProvider();
reflectProvider = new Sun14ReflectionProvider();
if (JAXP_DOM_XML.equals(driver))
xstream = new XStream(reflectProvider, new DomDriver());
xstream.autodetectAnnotations(true);
System.err.println(xstream.getReflectionProvider());
else if (XPP3_XML_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new XppDriver());
xstream.autodetectAnnotations(true);
else if (STAX_JSON_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
else if (WRITER_JSON_PARSER.equals(driver))
xstream = new XStream(reflectProvider, new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream = new XStream(reflectProvider, new DomDriver());
* 持久化对象列表.
持久化对象列表,存储到指定用户主目录下的指定目录
* @param dir 目录
* @param objects 对象列表
@SuppressWarnings("unchecked")
public void persist(String dir, List objects)
PersistenceStrategy strategy = new FilePersistenceStrategy(new File(System.getProperty("user.home"), dir));
List&?& list = new XmlArrayList(strategy);
list.addAll(objects);
// prinvate fields.
private static XS
EnhancedModeReflectProvider.java
package cn.bisoft.java.
import java.lang.reflect.F
import java.lang.reflect.M
import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionP
public class EnhancedModeReflectProvider extends Sun14ReflectionProvider
protected boolean fieldModifiersSupported(Field field)
return !(Modifier.isTransient(field.getModifiers()));
EnhancedModeReflectProvider.java
下午02:50:18
* Copyright:
Copyright (c) 2011
* Company:
Shenzhen *****
package cn.bisoft.java.
import java.lang.reflect.F
import java.lang.reflect.M
import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionP
* 支持静态字段转换,但有缺陷,字段不能映射成属性.
* @author tl
* @version 1.0,
public class EnhancedModeReflectProvider extends Sun14ReflectionProvider
protected boolean fieldModifiersSupported(Field field)
return !(Modifier.isTransient(field.getModifiers()));
ExampleMessageBody.java
package cn.bisoft.java.
import java.util.ArrayL
import java.util.D
import java.util.L
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.annotations.XStreamAsA
import com.thoughtworks.xstream.annotations.XStreamI
import com.thoughtworks.xstream.annotations.XStreamOmitF
@SuppressWarnings("unused")
@XStreamAlias("body")
public class ExampleMessageBody
@XStreamAsAttribute
private static final String type = "example";
private String id = "message id";
@XStreamAlias("users")
private List&User& userList = new ArrayList&User&();
@XStreamAlias("user")
public static class User
@XStreamAsAttribute
@XStreamAsAttribute
@XStreamOmitField
public String getId()
public void setId(String id)
public Date getBirth()
public void setBirth(Date birth)
this.birth =
public String getPassword()
public void setPassword(String password)
this.password =
public String getId()
public void setId(String id)
public Date getTimestamp()
public void setTimestamp(Date timestamp)
this.timestamp =
public List&User& getUserList()
return userL
public void setUserList(List&User& userList)
this.userList = userL
package cn.bisoft.java.
import java.util.ArrayL
import java.util.D
import java.util.L
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.annotations.XStreamAsA
import com.thoughtworks.xstream.annotations.XStreamI
import com.thoughtworks.xstream.annotations.XStreamOmitF
@SuppressWarnings("unused")
@XStreamAlias("body")
public class ExampleMessageBody
@XStreamAsAttribute
private static final String type = "example";
private String id = "message id";
/** 当userList节点必须存在是, 需要初始化. 值为空的字段是不会输出到XML的. */
@XStreamAlias("users")
private List&User& userList = new ArrayList&User&();
@XStreamAlias("user")
public static class User
@XStreamAsAttribute
@XStreamAsAttribute
@XStreamOmitField
public String getId()
public void setId(String id)
public Date getBirth()
public void setBirth(Date birth)
this.birth =
public String getPassword()
public void setPassword(String password)
this.password =
public String getId()
public void setId(String id)
public Date getTimestamp()
public void setTimestamp(Date timestamp)
this.timestamp =
public List&User& getUserList()
return userL
public void setUserList(List&User& userList)
this.userList = userL
TestXStream.java
package cn.bisoft.java.
import java.util.ArrayL
import java.util.D
import java.util.L
import com.thoughtworks.xstream.XS
public class TestXStream
public static void main(String[] args)
XStream xstream = XStreamFacade.getXStream(XStreamFacade.JAXP_DOM_XML, true);
ExampleMessageBody body = new ExampleMessageBody();
body.setId("0");
body.setTimestamp(new Date());
List&ExampleMessageBody.User& userList = new ArrayList&ExampleMessageBody.User&();
ExampleMessageBody.User user = new ExampleMessageBody.User();
user.setBirth(new Date());
user.setId("tl");
user.setPassword("123456");
userList.add(user);
body.setUserList(userList);
xstream.useAttributeFor("type", ExampleMessageBody.class);
String xml = xstream.toXML(body);
System.out.println(xml);
package cn.bisoft.java.
import java.util.ArrayL
import java.util.D
import java.util.L
import com.thoughtworks.xstream.XS
public class TestXStream
public static void main(String[] args)
XStream xstream = XStreamFacade.getXStream(XStreamFacade.JAXP_DOM_XML, true);
ExampleMessageBody body = new ExampleMessageBody();
body.setId("0");
body.setTimestamp(new Date());
List&ExampleMessageBody.User& userList = new ArrayList&ExampleMessageBody.User&();
ExampleMessageBody.User user = new ExampleMessageBody.User();
user.setBirth(new Date());
user.setId("tl");
user.setPassword("123456");
userList.add(user);
body.setUserList(userList);
xstream.useAttributeFor("type", ExampleMessageBody.class);
String xml = xstream.toXML(body);
System.out.println(xml);
说明: 1. 静态字段其实没有必要序列化. 2. 集合类型通常需要进行初始化.
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:}

我要回帖

更多关于 php cas 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信