??xml version="1.0" encoding="utf-8" standalone="yes"?>
?U发布方式,一U是实例发布Q一U是描述W发?br />
实例发布很简?br />
把我们的java源文件拷贝到axis目录下,Ҏ展名为jws
然后可以直接访问了Q例如:
java samples.userguide.example2.CalcClient -p8080 add 2 5
他将调用addҎQ传递的2个变量分别ؓ2??br />
很显ӞW一U方法有很多弊端Q比如需要源文gQ不能有包\径等{?br />
描述W发?br />
一个最单的例子如下Q?br />
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="MyService" provider="java:RPC">
<parameter name="className" value="samples.userguide.example3.MyService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
一个服务是一个targeted chain ,可能包含下面的一些或者全部:hHandlerQpivot Handler 支点HandlerQ响应Handler。支点hander在服务中叫做provider,在例子中我们的provider是java:RPCQ他被axis内嵌Q代表了Java RPC serviceQ具体的cLorg.apache.axis.providers.java.RPCProvider.
我们告诉RPCProvider 我们要调用的服务MyServiceQƈ以参数的形式告诉他具体的目标以及可以被调用的Ҏ?br />
我们也可以给我们要调用的对象讄作用范围scope,和servlet的scope一P有request,session,application.
我们需要把q个描述W定义的内容告诉应用服务器才能真正提供我们需要的服务?br />
如果已经部vaxis到tomcat,我们可以q样发布
org.apache.axis.client.AdminClient deploy.wsdd
q样我们的服务就可以通过soap来访问了
试一?br />
java samples.userguide.example3.Client
-lhttp://localhost:8080/axis/services/MyService "test me!"
可以通过下面来查看所有已l部|的服务
java org.apache.axis.client.AdminClient list
来看看更q一步的应用Q用一下request handler
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- define the logging handler configuration -->
<handler name="track" type="java:samples.userguide.example4.LogHandler">
<parameter name="filename" value="MyService.log"/>
</handler>
<!-- define the service, using the log handler we just defined -->
<service name="LogTestService" provider="java:RPC">
<requestFlow>
<handler type="track"/>
</requestFlow>
<parameter name="className" value="samples.userguide.example4.Service"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
q个例子会在客户端掉用LogTestService的时候,先调用samples.userguide.example4.LogHandler作记录操?br />
q程理
默认状态下Qaxis只允许在axis部v的机器上使用理hQ如果希望在其他的机器上q行理操作可以参照下面的例?/p>
<service name="AdminService" provider="java:MSG">
<parameter name="className" value="org.apache.axis.util.Admin"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="enableRemoteAdmin" value="true"/>
</service>
注意Q这样配|需要作必要的安全配|?/p>
<%
String sPageIndex=request.getParameter("pageIndex");
int iPageIndex=1;
if(sPageIndex!=null){
iPageIndex=Integer.parseInt(sPageIndex);
}
pageContext.setAttribute("pageIndex", iPageIndex+"");
%>
<cms:contentload collector="allInFolderDateReleasedDesc" param="/myfirstsite/sports/%(number)_news.html|news" pageIndex="%(pageContext.pageIndex)" pageSize="2">
<cms:contentinfo var="contentInfo" scope="request" />
<a href="<cms:link><cms:contentshow element="%(opencms.filename)"/></cms:link>" target=_blank><cms:contentshow element="Title"/> </a>
<%out.println("---");%>
</cms:contentload>
<%
CmsContentInfoBean info = (CmsContentInfoBean)request.getAttribute("contentInfo");
int totalNum=info.getResultSize();
%>
?lt;%=totalNum%>条数?当前W?lt;%=info.getPageIndex()%>/<%=info.getPageCount()%>
<a href="list_taglib?pageIndex=<%=info.getPageNavStartIndex()%>">W一?lt;/a>
<a href="list_taglib?pageIndex=<%=(info.getPageNavStartIndex()-1)>0?(info.getPageNavStartIndex()-1):1%>">上一?lt;/a>
<a href="list_taglib?pageIndex=<%=(info.getPageNavStartIndex()+1)>info.getPageCount()?info.getPageCount():(info.getPageNavStartIndex()+1)%>">下一?lt;/a>
<a href="list_taglib?pageIndex=<%=info.getPageNavEndIndex()%>">最后页</a>
上面的例子力求尽可能的使用标签。主要用了CmsContentInfoBean QCmsJspXmlContentBean QI_CmsXmlContentContainerQCmsJspTagContentLoad Q等多个对象。分늚关键在CmsContentInfoBean ?CmsJspTagContentLoad的关pM?nbsp;
参考资?
http://www.javaedu.com/bbs/viewthread?thread=128
http://wangyi878750.blog.sohu.com/41725191.html
http://l--w.blog.sohu.com/47996664.html
http://wangyi878750.blog.sohu.com/41378072.html
DAVLockDB /usr/local/apache/var/DAVLock"
然后你需要配|一个webdav的工作目?׃讉Kapache服务的用户会默认是nobody用户,所以你臛_得让工作目录对nobody可读?在目录的定义中加入DAV onq样的属性就 ok?br>eg:
"Alias /pages /home/www/davhome
<Location /pages>
DAV On
</Location>
"
试webdav
安装完webdav后,你可以做单的试Q?br> IE览?〉文?〉打开Q然后输入配|的urlQ?a .可以看到效果?br>客户端API.
如果?java可以 采用slide的客L.(php用户咋办?).
q个最新的客户端用的是最新的jdom,注意?.
参考资料:
http://www.uplinux.com/www/net/02/131.shtml
权限部分的UML囑֦?
数据程:
1Q系l从OnlineUserManagerq个入口q入.q个部g有个Map用来存储当前的非q期用户。OnlineUserManager会先Ҏ当前旉和最后一个用Lh旉做对比,查是否有hq期用户的必要,如果过所讄的时_那么先更新Map。然后OnlineUserManagerҎ提供的用L sessionid和username在这个Map中查找。如果找刎ͼ则刷新该用户的最后一ơ访问时_否则QOnlineUserManager调用OnlineUserFactory部g创徏该OnlineUserQƈ把这个OnlineUser存入Map之中?br />判对用户是否q期的原理是:从OnlineUser的OnlineUserAction中取出最后一ơ的讉K旉和当前时间做Ҏ.
2QOnlineUserFactory负责创徏OnlineUserqؓ该OnlineUser提供完整的权限信?OnlineUser包括3大部分信?一部分是用L基本信息,一部分是用L权限信息,一部分是用L在线信息.在线信息由OnlineUserManager负责理,其他2部分信息由OnlineUserFactory从持久层获得.
获得权限信息q把它设|到OnlineUser部g?提供lOnlineUserManager理.
3.CNMPermissionFactorycM我们常说的service.主要负责和持久层通信,最l返回一个CNMPermission部g供OnlineUserFactory合成OnlineUser部g.在下面的章节?W者会对他l化讨论.
权限l构:
用来实现用户权限的主要的是CNMPermission接口和他?个子cAbstractPermission和CNMPermissionImpl.CNMPermission接口负责定义权限有关的常量和对外API.AbstractPermission讄了保存权限信息的变量q实CCNMPermission接口中定义的抽象Ҏ,因此,W者把q个抽象cd做鉴权类.CNMPermissionImpl 则负责对AbstractPermission使用的变量进行设?因此,W者称之ؓ赋权c?
先看看AbstractPermission的结构。这里涉及到q么几个概念Q全局权限Q特定权限,单个权限Q组合权限?br />全局权限用true/false来设|?br />特定权限是指某一个动作所作用的不同的对象。比如:某用户只能将写操作作用于1Q?Q?q?个论坛板块之上。表CZؓq个特定权限内部的ArrayList容器中只?Q?Q?三个~号?br />单个权限是指单个动作。比如读操作?br />l合权限是ؓ了方便设|提供的对单个权限的l合。比如对某用户一ơ设|某板块的“读”和“发布?U权限?br />?U权限是一个纬度的划分Q后2个是另一个纬度的划分?br />如何鉴权Q?br />鉴权的接口都会在CNMPermission中定义。对全局权限Q直接返回对应的标志位的|对于特定权限Q则先判断是否特定权限全开Q否Q则然后判断其ArrayList中是否包含对应的对象~号?br />如何赋权Q?br />q里要承接到上述数据程的第三步。由CNMPermissionFactoryҎ一定先后@序(其实无关序Q因为采用的为真覆盖原则Q即持久层返回的权限都是真|后面的真值对前面的真值可覆盖Q从持久层获得所有的全局权限和特定权限。mvnforum只有用户和角?U概念(当然也可以扩展)Q因此它的顺序是Q用户全局全县-〉用L定权?〉角色全局全县-〉角色特定权限。当然无论哪一部都是对同一个CNMPermissionq行操作?br />无论在设|全局权限q是特定权限的时候都可能会遇到所定义的组合权限。具体的l合权限拆分是由CNMPermissionImpl来做?
相关的表l构Q?br /> member表,存贮用户基本信息?br /> membergroup ,存储用户和组Q角Ԍ的对应关pR?br /> groups表,存储l?角色的基本信?br /> grouppermissionQ存储组/角色的全局权限,字段为groupid permissionid
groupforumQ存储组/角色 的论坛权? 字段为groupid ,forum,permissionid
memberpermission 存贮用户的全局权限,字段?memberid permissionid
memberforum 存贮用户的论坛权?字段为memberid ,forum,permissionid
修改?006/12/16 ??br />
Ben 的项目里面要用到 OpenLDAP, 我的目里面也要用到 LDAP, 所以这 2 天集中看了一?/span> LDAP 相关的内宏V做了个W记Q也是Zhcȝ识的U篏做点或有或无的A献?/span>
OpenLDAP 的官方站Ҏ http://www.openldap.org ?/span>
上面有个 QuickStart, 我将大致按照q个来讲解?/span>
一?/span>
安装
在官方站点上发布的是
linux/unix
下的
OpenLDAP
源文Ӟ当然也很Ҏ扑ֈ
windows
pȝ下的版本。笔者学习安装的是
windows
版本的?/span>
二?/span> 配置
OpenLDAP ?/span> 2 个用hx的配|文件?/span>
一个是
slapd.conf
Q?/span>
在他里面定义了最基本?/span>
DN
以及理员的账号和密码?/span>
另一个是
LDIF
的文件。在它里面可以配|所有的用户和组l?/span>
1?span style="FONT: 7pt 'Times New Roman'">
我们先来了解 LDAP 的相xc?/span>
Ldap
是怎样的一个结构呢
Q用官方的话_?/span>
In LDAP, directory entries are arranged in a hierarchical tree-like structure. Traditionally, this structure reflected the geographic and/or organizational boundaries. Entries representing countries appear at the top of the tree. Below them are entries representing states and national organizations. Below them might be entries representing organizational units, people, printers, documents, or just about anything else you can think of..
”他是一个树状的l构。每一个节点被UCؓ一?/span>
Entry
。这?/span>
Entry
有着有趣的含义?/span>
下面是他?/span>
2
个实例。一个反映了
geographic
Q一个反映了
organizational
?br />
传统命名
|络命名
我们来看看个个节点的定义方式?/span>
每个 Entry 都有一个自己得一个标C?/span> Q我们把他叫 DN(Distinguished Name) Q这?/span> dn 包含了一?/span> RDN Q?/span> Relative Distinguished Name Q。在上面的第二个图例 中,Barbara Jensen的RDN?/span> uid=babsQ他的dn?/span> uid=babs,ou=People,dc=example, dc=com?o:p>
每个节点都需要一个类?/span>
Q?/span>
q个cd信息?span lang="EN-US">objectClass来表C。ObjectClass是该节点的schema,他定义了该节点该有和不该有的属性。默认的objectClass都在schema/core.schema中有定义。如果在你的配置q程中出C关于找不到objectClass的问题,您不妨参看一下这里面有没有你用到的objectClass
. 在schema文g夹下q有其他一些schema文g,你也可以定义自己的schema.惌加蝲其他的schema,你可以在slapd.conf文g中用include加入.?include ./schema/core.schema.
Z方便识别Q其实我们在DN里面用的都是objectClass的简写Ş式。如Qou代表organizationUnitQc代表country,st代表state,dc代表Q?{?/span>
2?span style="FONT: 7pt 'Times New Roman'">
来看?/span>
slapd.conf
q个文g
q个文g的主要信息是如下几行Q?/span>
database bdb
suffix "dc=<MY-DOMAIN>,dc=<COM>"
rootdn "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>"
rootpw secret
directory /usr/local/var/openldap-data
定义了数据库Q最基本的后~Q管理员?/span>
dn
和密码,以及数据存放路径?/span>
~辑好这个文Ӟ我们可以启动了?/span>
如果你把
ldap
安装?/span>
windows
服务Q你可以像我一样启动:
net start OpenLDAP-slapd
3?span style="FONT: 7pt 'Times New Roman'">
我们主要操作的就是这?/span>
LDIF
文g
我们需要在q个文g里面加入所需要的
dn.
注意Q因为我们在
slapd.conf
中定义了一?/span>
base dn
和一个管理员
dn
Q所以我们需要首先把q?/span>
2
?/span>
dn
加进来?/span>
dn: dc=<MY-DOMAIN>,dc=<COM>
objectclass: dcObject
objectclass: organization
o: <MY ORGANIZATION>
dc: <MY-DOMAIN>
dn: cn=Manager,dc=<MY-DOMAIN>,dc=<COM>
objectclass: organizationalRole
cn: Manager
保存?/span>
ldif
后缀的文件。然后我们用命o把这些信息加?/span>
ldap
中去Q?/span>
ldapadd -x -D "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>" -W -f example.ldif
让我们来查看以下我们的设|是否出现问题:
ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'
上面的是
linux/unix
下的命oQ?/span>
windows
下我们需要做Ҏ改:
ldapsearch -x -b dc=example,dc=com (objectclass=*)
对,是L引号?/span>
Z察看方便Q笔者徏议?/span>
GUI
工具来查看,比如W者用的
Softerra LDAP Browser 2.6
?/span>
三?/span>
?/span>
java
集成
我们?/span>
ldap Server
已经搭徏h了,我们需要在我们?/span>
java
E序中访问这个服务?/span>
Openldap.org 上有没有Ԍ有讲Q下面介l的 JLDAP 是q这个的?/span>
我们需要看一下?/span> Java LDAP Overview ”里面的内容。内容不是很多,但很实用?/span>
要在 java 中访?/span> ldap Q我们需要一?/span> api, 你可以在下面的网站上获得Q?/span>
http://developer.novell.com/wiki/index.php/LDAP_Classes_for_Java
在下在的文g里面有许多的例子Q在 novell 的网站上也有很多的例子。我׃讲了?/span> Try yourself ?/span>
如果一个logger 的名字后面跟着一个点PdotQ,它就是点PdotQ后面的那个logger的前辈( ancestorQ,是这个晚辈(descendantQ?的前~。如果在它自己和q个晚辈之间没有其它的前辈,它和q个晚辈之间是?/em>?/em>关系?/font>
2.U别l承 对于一个给定的logger CQ它l承的?/em>{于logger阶层里,从C开始往root
logger上去的第一个non-nullU别?/font>
在一个别ؓqQ被指定的或l承的)的logger里,一个别ؓp的日志请求,只有?em>p >= q 时才能够被执行?/font>
Logger C的log输出信息被输出到C的所有appenders和它的前辈的 appenders。这是"appender additivity"的意思?/font>但是Q如果logger C的前辈,比如说PQP的additivity flag被设|ؓ false
Q那么,C的输Z息将被输出到C的所有appenders中去Q以及它的前辈的——截止在P那里Q包括P在内的,appenders中去Q但是不会输出到P的前辈的 appenders中去?默认情况下,Loggers的additivity flag讄?code>true?/font>
在配|文件中Qlog4j可以讉K到系l环境变量。具体的变量参考相兌料?br />
一我很早以前在csdn写的文章:
http://blog.csdn.net/huabingl/archive/2005/02/19/293933.aspx