??xml version="1.0" encoding="utf-8" standalone="yes"?>
?U发布方式,一U是实例发布Q一U是描述W发?br />
实例发布很简?br />
把我们的java源文件拷贝到axis目录下,Ҏ(gu)展名为jws
然后可以直接访问了(jin)Q例如:(x)
java samples.userguide.example2.CalcClient -p8080 add 2 5
他将调用addҎ(gu)Q传递的2个变量分别ؓ(f)2??br />
很显?dng)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 ,可能包含下面的一些或者全部:(x)hHandlerQpivot Handler 支点HandlerQ响应Handler。支点hander在服务中叫做provider,在例子中我们的provider是java:RPCQ他被axis内嵌Q代表了(jin)Java RPC serviceQ具体的cLorg.apache.axis.providers.java.RPCProvider.
我们告诉RPCProvider 我们要调用的服务MyServiceQƈ以参数的形式告诉他具体的目标以及(qing)可以被调用的Ҏ(gu)?br />
我们也可以给我们要调用的对象讄作用范围scope,和servlet的scope一P有request,session,application.
我们需要把q个描述W定义的内容告诉应用服务器才能真正提供我们需要的服务?br />
如果已经部vaxis到tomcat,我们可以q样发布
org.apache.axis.client.AdminClient deploy.wsdd
q样我们的服务就可以通过soap来访问了(jin)
试一?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个例子?x)在客户端掉用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>
上面的例子力求尽可能的使用标签。主要用了(jin)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的工作目?׃讉Ka(chn)pache服务的用户会(x)默认是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(fng).(php用户咋办?).
q个最新的客户端用的是最新的jdom,注意?.
参考资料:(x)
http://www.uplinux.com/www/net/02/131.shtml
权限部分的UML囑֦?
(tng) (tng)
数据?hu)?
1Q系l从OnlineUserManagerq个入口q入.q个部g有个Map用来存储当前的非q期用户。OnlineUserManager?x)先?gu)当前旉和最后一个用L(fng)h旉做对比,(g)查是否有hq期用户的必要,如果过所讄的时_(d)那么先更新Map。然后OnlineUserManagerҎ(gu)提供的用L(fng) sessionid和username在这个Map中查找。如果找刎ͼ则刷新该用户的最后一ơ访问时_(d)否则QOnlineUserManager调用OnlineUserFactory部g创徏该OnlineUserQƈ把这个OnlineUser存入Map之中?br />判对用户是否q期的原理是:从OnlineUser的OnlineUserAction中取出最后一ơ的讉K旉和当前时间做Ҏ(gu).
2QOnlineUserFactory负责创徏OnlineUserqؓ(f)该OnlineUser提供完整的权限信?OnlineUser包括3大部分信?一部分是用L(fng)基本信息,一部分是用L(fng)权限信息,一部分是用L(fng)在线信息.在线信息由O(jin)nlineUserManager负责理,其他2部分信息由O(jin)nlineUserFactory从持久层获得.
获得权限信息q把它设|到OnlineUser部g?提供lOnlineUserManager理.
3.CNMPermissionFactorycM我们常说的service.主要负责和持久层通信,最l返回一个CNMPermission部g供OnlineUserFactory合成OnlineUser部g.在下面的章节?W者会(x)对他l化讨论.
权限l构:
用来实现用户权限的主要的是CNMPermission接口和他?个子cAbstractPermission和CNMPermissionImpl.CNMPermission接口负责定义权限有关的常量和对外API.AbstractPermission讄?jin)保存权限信息的变量q实C(jin)CNMPermission接口中定义的抽象Ҏ(gu),因此,W者把q个抽象cd做鉴权类.CNMPermissionImpl 则负责对AbstractPermission使用的变量进行设?因此,W者称之ؓ(f)赋权c?
先看看AbstractPermission的结构。这里涉?qing)到q么几个概念Q全局权限Q特定权限,单个权限Q组合权限?br />全局权限用true/false来设|?br />特定权限是指某一个动作所作用的不同的对象。比如:(x)某用户只能将写操作作用于1Q?Q?q?个论坛板块之上。表CZؓ(f)q个特定权限内部的ArrayList容器中只?Q?Q?三个~号?br />单个权限是指单个动作。比如读操作?br />l合权限是ؓ(f)?jin)方便设|提供的对单个权限的l合。比如对某用户一ơ设|某板块的“读”和“发布?U权限?br />?U权限是一个纬度的划分Q后2个是另一个纬度的划分?br />如何鉴权Q?br />鉴权的接口都?x)在CNMPermission中定义。对全局权限Q直接返回对应的标志位的|对于特定权限Q则先判断是否特定权限全开Q否Q则然后判断其ArrayList中是否包含对应的对象~号?br />如何赋权Q?br />q里要承接到上述数据?hu)程的第三步。由CNMPermissionFactoryҎ(gu)一定先后@序(其实无关序Q因为采用的为真覆盖原则Q即持久层返回的权限都是真|后面的真值对前面的真值可覆盖Q从持久层获得所有的全局权限和特定权限。mvnforum只有用户和角?U概念(当然也可以扩展)(j)Q因此它的顺序是Q用户全局全县-〉用L(fng)定权?〉角色全局全县-〉角色特定权限。当然无论哪一部都是对同一个CNMPermissionq行操作?br />无论在设|全局权限q是特定权限的时候都可能?x)遇到所定义的组合权限。具体的l合权限拆分是由CNMPermissionImpl来做?
相关的表l构Q?br /> (tng) (tng) member表,存贮用户基本信息?br /> (tng) (tng) membergroup ,存储用户和组Q角Ԍ(j)的对应关pR?br /> (tng) (tng) groups表,存储l?角色的基本信?br /> (tng) (tng) grouppermissionQ存储组/角色的全局权限,字段为groupid permissionid
(tng) (tng) groupforumQ存储组/角色 的论坛权? 字段为groupid ,forum,permissionid
(tng) (tng) memberpermission 存贮用户的全局权限,字段?memberid permissionid
(tng) (tng) memberforum 存贮用户的论坛权?字段为memberid ,forum,permissionid
(tng) 修改?006/12/16 (tng) ??br />
(tng) (tng) Ben 的项目里面要用到 OpenLDAP, 我的目里面也要用到 LDAP, 所以这 2 天集中看?jin)一?/span> LDAP 相关的内宏V做?jin)个W记Q也是Zhcȝ识的U篏做点或有或无的A(ch)献?/span>
(tng) (tng) OpenLDAP 的官方站Ҏ(gu) http://www.openldap.org ?/span>
(tng) (tng) (tng) (tng) (tng) (tng) 上面有个 QuickStart, 我将大致按照q个来讲解?/span>
一?/span>
安装
在官方站点上发布的是
linux/unix
下的
OpenLDAP
源文Ӟ当然也很Ҏ(gu)扑ֈ
windows
pȝ下的版本。笔者学?fn)安装的?/span>
windows
版本的?/span>
二?/span> 配置
OpenLDAP ?/span> 2 个用hx(chng)的配|文件?/span>
一个是
slapd.conf
Q?/span>
在他里面定义?jin)最基本?/span>
DN
以及(qing)理员的账号和密码?/span>
另一个是
LDIF
的文件。在它里面可以配|所有的用户和组l?/span>
1?span style="FONT: 7pt 'Times New Roman'"> (tng)
我们先来?jin)?/span> LDAP 的相x(chng)c(din)?/span>
Ldap
是怎样的一个结构呢
Q用官方的话_(d)(x)?/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..
”他是一个树(wi)状的l构。每一个节点被UCؓ(f)一?/span>
Entry
。这?/span>
Entry
有着有趣的含义?/span>
下面是他?/span>
2
个实例。一个反映了(jin)
geographic
Q一个反映了(jin)
organizational
?br />
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 传统命名
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) |络命名
我们来看看个个节点的定义方式?/span>
每个 Entry 都有一个自己得一个标C?/span> Q我们把他叫 DN(Distinguished Name) Q这?/span> dn 包含?jin)一?/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,他定义了(jin)该节点该有和不该有的属性。默认的objectClass都在schema/core.schema中有定义。如果在你的配置q程中出C(jin)关于找不到objectClass的问题,(zhn)不妨参看一下这里面有没有你用到的objectClass
. 在schema文g夹下q有其他一些schema文g,你也可以定义自己的schema.惌加蝲其他的schema,你可以在slapd.conf文g中用include加入.?Z(jin)方便识别Q其实我们在DN里面用的都是objectClass的简写Ş式。如Qou代表organizationUnitQc代表country,st代表state,dc代表Q?{?/span>
2?span style="FONT: 7pt 'Times New Roman'"> (tng)
来看?/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
定义?jin)数据库Q最基本的后~Q管理员?/span>
dn
和密码,以及(qing)数据存放路径?/span>
~辑好这个文Ӟ我们可以启动了(jin)?/span>
如果你把
ldap
安装?/span>
windows
服务Q你可以像我一样启动:(x)
net start OpenLDAP-slapd
(tng)
3?span style="FONT: 7pt 'Times New Roman'"> (tng)
我们主要操作的就是这?/span>
LDIF
文g
我们需要在q个文g里面加入所需要的
dn.
注意Q因为我们在
slapd.conf
中定义了(jin)一?/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>
(tng)
dn: cn=Manager,dc=<MY-DOMAIN>,dc=<COM>
objectclass: organizationalRole
cn: Manager
保存?sh)?/span>
ldif
后缀的文件。然后我们用命o(h)把这些信息加?/span>
ldap
中去Q?/span>
ldapadd -x -D "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>" -W -f example.ldif
让我们来查看以下我们的设|是否出现问题:(x)
ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'
上面的是
linux/unix
下的命o(h)Q?/span>
windows
下我们需要做Ҏ(gu)改:(x)
ldapsearch -x -b dc=example,dc=com (objectclass=*)
对,是L引号?/span>
Z(jin)察看方便Q笔者徏议?/span>
GUI
工具来查看,比如W者用的
Softerra LDAP Browser 2.6
?/span>
(tng)
三?/span>
?/span>
java
集成
我们?/span>
ldap Server
已经搭徏h?jin),我们需要在我们?/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 的网站上也有很多的例子。我׃讲了(jin)?/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>
在一个别ؓ(f)qQ被指定的或l承的)(j)的logger里,一个别ؓ(f)p的日志请求,只有?em>p >= q 时才能够被执行?/font>
Logger C的log输出信息被输出到C的所有appenders和它的前辈的 appenders。这是"appender additivity"的意思?/font>但是Q如果logger C的前辈,比如说PQP的additivity flag被设|ؓ(f) false
Q那么,C的输Z息将被输出到C的所有appenders中去Q以?qing)它的前辈的——截止在P那里Q包括P在内的,appenders中去Q但是不?x)输出到P的前辈的 appenders中去?默认情况下,Loggers的additivity flag讄?code>true?/font>
在配|文件中Qlog4j可以讉K到系l环境变量。具体的变量参考相兌料?br />
一我很早以前在csdn写的文章:
http://blog.csdn.net/huabingl/archive/2005/02/19/293933.aspx