??xml version="1.0" encoding="utf-8" standalone="yes"?>
如果一切顺利,q行如下命o(h)?x)看到点什么的 ^_^Q?br />ldapsearch -x -s base (objectclass=*) namingContexts
一些可以做参考的OpenLDAP资料Q?/b>官网Q?a >http://www.openldap.org/
For Win32Q?a >http://lucas.bergmans.us/hacks/openldap/
快速指南:(x)http://www.wzsky.net/html/System/Linux/71587.html
详细介绍Q?a >http://blog.csdn.net/porcupinefinal/archive/2006/04/03/649598.aspx
学习(fn)W记Q?a >http://man.lupaworld.com/content/manage/ringkee/openldap.htm
Hibernate Annotation 配置的注意点Q?/p>
下面是一个解决中文ؕ码问题很有用的一个过滤器Q?/P>
发布Servletqo(h)?/STRONG>Q在web.xml在文件中加入<filter>元素?lt;filter-mapping>元素
下面的例子中Servletqo(h)器会(x)qo(h)所有的URLQ?/P>
串连Servletqo(h)?/STRONG> 自定义JSP标签?BR>此技术在JSP 1.1版本中才出现Q用来重用某些复杂的逻辑q算和事务,或定义JSP王爷的输出内容和格式。制作一个完整的自定义标{序,包含3个步骤:(x) 2.创徏TLDQTag Library Descriptor(标签库描q文? 实际中的使用Q?BR><%@ taglib uri="/tags/test" prefix="test" %>
多个Servletqo(h)器可以协同工作,Servlet容器根据它们在web.xml中定义的先后序Q依ơ调用它们的doFilter()Ҏ(gu)?BR>工作程如下Q?BR> Code1; // 表示调用chain.doFilter()前面的代?BR> chain.doFilter(); // 表示调用下一个过滤器的doFilter()Ҏ(gu)
Code2; // 表示调用chain.doFilter()后面的代?/P>
1. 创徏标签的处理类
此类必须扩展javax.servlet.jsp.TagSupportcL者javax.servlet.jsp.BodyTagSupportcR?BR>以TagSupportcMؓ(f)例,先了解一下这个类的主要方法:(x)
doStartTag()QJSP容器遇到自定义标{起始标志时调用该Ҏ(gu)Q?BR>doEndTag()QJSP容器遇到自定义标{l束标志时调用该Ҏ(gu)Q?BR>setValue(String k,Object o)Q在标签处理cM讄key/value;
getValue(String k)Q在标签处理cMҎ(gu)keyq回匚w的value;
removeValue(String k)Q在标签处理cM删除key/value;
setPageContext(PageContext pc)Q设|PageContext对象Q该Ҏ(gu)在调用doStartTag()和doStartTag()前调用;
setParent(Tag t)Q设|嵌套当前标{上层标签的处理类Q该Ҏ(gu)在调用doStartTag()和doStartTag()前调用;
getParent()Q返回嵌套当前标{上层标签的处理类?BR>
首先调用setPageContext(PageContext pc)和setParent(Tag t)Q设|TagSupportcȝ两个重要属性倹{?BR>
如果遇到起始标志Q调用doStartTag()Q此Ҏ(gu)q回一个整数|它有两个可选|(x)Tag.SKIP_BODY(标签之间的内容被忽略)和Tag.EVAL_BODY_INCLUDE(标签之间的内Ҏ(gu)常执??BR>例如Q?lt;prefix:mytag>test</prefix:mytag>Q如果遇上Tag.SKIP_BODYQtest字符串不?x)显C在面上;如果遇上Tag.EVAL_BODY_INCLUDEQtest字符串将?x)显C在面上?BR>
如果遇到l束标志Q调用doEndTag()Q此Ҏ(gu)也返回一个整数|它有两个可选|(x)Tag.SKIP_PAGE(表示立刻停止执行JSP面Q网上未处理的静态内容和JSPE序均别忽略QQ何已有的输出内容立刻q回到客L(fng)Q?和Tag.EVAL_PAGE(表示按正常流El执行JSP面)?BR>
如果自定义标{含自定义的属性,例如Q?lt;prefix:mytag attribute1="value1">Q那么处理类中应该将q个属性做为成员变量,q提供一lget和setҎ(gu)Q?BR>private int attribute1;
public void setAttribute1(int value){
this.attriubte1 = value;
}
public int getAttribute1(){
return attribute1;
}
下面是一个用来验证用L(fng)陆的标签处理cM子:(x)public class ValidateLoginTag extends TagSupport
{
private String name;
private String password;
private Log log = LogFactory.getLog(ValidateLoginTag.class);
public int doEndTag() throws JspException
{
if(name.equals("pepsixp") && password.equals("888888"))
{
return(EVAL_PAGE);
}
return (SKIP_PAGE);
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
TLD文g中元素可以分Zc:(x)<tablib>?lt;tag>?lt;attribute>
<tablib>Q设定标{ֺ的相关信息,包含的子元素有tlibversion、jspversion、shortname、uri、info、tag?BR><tag>Q用来定义一个标{,包含的子元素有name、tagcalss、bodycontent、info、attribute?BR>bodycontent的说明:(x)有三个可选值empty、JSP、tagdependentQempty表示标签中没有bodyQJSP表示body中可以加入JSPE序代码Qtagdependent表示body的内Ҏ(gu)标签q行处理?BR><attribute>Q用来定义标{属性,包含的子元素有name、required、rtexprvalue?BR>rtexprvalue的说明:(x)表示是否可以使用<%=...%>cd的表辑ּQ?BR>例如Q?lt;prefix:mytaglib attribute1="<%=name%>">
下面是一个简单的TLD文gQ?/P>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.2</tlibversion>
<jspversion>1.1</jspversion>
<shortname>MY Tag Library</shortname>
<uri>http://www.aygfsteel.com/pepsixp/</uri>
<info>
</info>
<tag>
<name>ifLogin</name>
<tagclass>com.akazam.struts.taglib.ValidateLoginTag</tagclass>
<bodycontent>empty</bodycontent>
<info>
</info>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>password</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
<test:ifLogin name="pepsixp" password="888888"/>
3.在web应用中用标{?/STRONG>
先要在web.xml文g加入声明引用标签所在的标签Q?BR><taglib>
<taglib-uri>/tags/test</taglib-uri>
<taglib-location>/WEB-INF/test.tld</taglib-location>
</taglib>
参考:(x)《Tomcat与JavaWeb开发技术详解?/FONT>
]]>
安全?/STRONG>
q是Tomcat服务器用来保护Web应用资源的一U机制。一个用户可以拥有一个或多个角色Q每个角色限定了可访问的Web资源Q这样就用户和W(xu)eb资源对应h了。在org.apache.catalina.Realm接口中声名了用户名、口令和角色相管理的Ҏ(gu)QTomcat5提供?个实现这一接口的类Q分别ؓ(f)QMemoryRealm(XML文gd)、JDBCRealm(JDBC驱动E序d)、DataSourceRealm(JNDI数据源读?、JNDIRealm(JNDI providerdLDAP的目录服务器信息)?/FONT>
Web资源的设|?BR>需要在web.xml文g中加?lt;security-constraint>?lt;login-config>?lt;security-role>元素?BR>例如在Tomcat的admin应用中的配置Q?/FONT>
上面的代码表明:(x)只有admin角色才能讉Ka(chn)dmin应用中的*.jsp?.do?.html资源?BR>另一个例子是jsp-examples应用Q?BR>
上面的代码表明:(x)只要tomcat和role1角色才可以以DELETE、GET、POST和GET方式讉Kjsp-exzmples应用URL?security/protected/下的资源?BR>在web.xml中加?lt;login-config>元素Q系l会(x)以对话框的方式进行登?BR>
<auth-method>有三个可选项QBASIC、DIGEST、FORM?BR>BASICQ基本验证:(x)讉K受保护资源时Q会(x)弹出一对话框。要求输入用户名和密码,如果q箋3ơ失败后Q会(x)昄一个错误页面。这个方法的~点是用户名和密码的数据传输采用的是Base64~码(可读文本)Q是非常不安全的?BR>DIGESTQ摘要验证:(x)数据采用MD5对用户名和密码进行加密,然后再传输,昄q种Ҏ(gu)很安全?BR>FORMQ表单验证:(x)可以使用自定义的登陆面Q但用户名对应的文本框名U必Lj_username,密码为j_passwordQ且表单actiongؓ(f)j_security_check?BR>在web.xml中加?lt;security-role>元素Q指明这个Web应用应用的所有角色的名字
你可以调用HttpRequeset接口的getRemoteUser()Ҏ(gu)q回当前用户的名字:(x)<%=request.getRemoteUser()%>
内存?/STRONG>Q由org.apache.catalina.realm.MemoryRelamcd?BR>猫启动Ӟ自动d<%CATALINA_HOME%>/conf/tomcat-users.xml文gQ要在Web应用中用,可以在对应的<Context>元素内加入如下内容:(x)<Realm className="org.apache.catalina.realm.MemoryRelam"/>
JDBC?/STRONG>Q通过JDBC驱动从数据库中直接读取验证信息,通过验证后,信息?x)存储在session中?BR>在mysql中新Z张表Q?/P>
然后在server.xml中加入:(x)
DataSource?/STRONG>Q和JDBC域很cMQ只不过讉K数据库的方式不同Q这个是使用JNDI DataSource来访问数据库的?BR>先在web.xml中加入安全约束,在和JDBC域一hZ张表Q然后在server.xml文g?lt;GlobalNamingResources>元素下添加如下内容:(x) 注意QTomcat的JNDI资源必须配置?lt;GlobalNamingResources>元素下,服务器才能找刎ͼ否则?x)出现NameNotFoundExceptionQ低于Tomcat5.0.12的版本,即正确配置了DataSourceRealmQ也?x)出现找不到JNDI DataSource的异常,q个猫的一个bugQ在web.xml中是不需要配|?lt;resource-ref>元素的,因ؓ(f)Web应用q不?x)访问这个DataSource?BR>当然server.xmlq需要添加和JDBC域几乎相同的代码Q?/P>
Tomcat阀 然后再添?lt;Value>元素Q?/P>
create table usr_roles{usr_name varchar(15) not null,role_name varchar(15) not null,
primary key(user_name,role_name)};<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver"
debug="0" connectionURL="jdbc:mysql://localhost/tomcatusers" connectionName="roor"
connectonPassword="" userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name">
<ResourceParams name="jdbc/tomcatusers">
<parameter> <name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActiove</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/tomcatusers?autoReconnect=true</value>
</parameter>
</ResourceParams>
driverName="com.mysql.jdbc.Driver" debug="0"
connectionURL="jdbc:mysql://localhost/tomcatusers" connectionName="roor"
connectonPassword="" userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name">
由org.apache.Catalina.Value接口定义Q能够对Catalina容器接收的HTTP Requestq行预处理,是小猫特有的功能Q可以加入到3U容器中(Engine、Host、Context)?BR>
客户讉K日志阀(Access Log Value)Q?能够可以的Request信息写入到日志中。可以记录页面访问的ơ数、用户Sessionzd和用户验证信息等?BR>例如Q?lt;Value className="org.apache.catalina.AccessLogValue" directory="logs" prifix="localhost_access_log" suffix=".txt" pattern="%h%l%u%t%s%r%s%b" resolveHost="true">
上面的pattern值可以用commonQ一个默认的倹{?BR>pattern属性规定日志的格式和内容:(x)%aQ远EIP地址Q?AQ本地IP地址Q?bQ发送的字节敎ͼ不包括HTTP HeaderQ?hQ远E主机名Q?HQ客戯求所用的协议Q?lQ?-";%mQ请求的Ҏ(gu)Q?pQ接受请求的本地服务器断开Q?qQ查询字W串Q?rQ用戯求的W一行内容;%sQ响应HTTP Request的状态码Q?SQ用户Session IDQ?tQ时_(d)%uQ验证的用户名;%UQ请求URL路径Q?vQ本地服务器名?BR>
q程地址qo(h)?/STRONG>(Remote Address Filter)Q根据IP地址军_是否接受客户的请求?BR>例如Q?lt;Value className="org.apache.catalina.RemoteAddrValue" allow="127.0.0.1" deny="127.111.*"/>
q程Lqo(h)?/STRONG>(Remot Host Filter)Q根据主机名军_是否接受h?BR><Value className="org.apache.catalina.RemoteHostValue" allow="localhost" deny="monster*"/>
客户h记录?/STRONG>(Request Dumper)Q把客户h的详l信息记录在日志文g中,q里的日志文件是?lt;Logger>元素?BR>假定在server.xml中localhost?lt;Host>元素下已l配|了<Logger>元素Q?BR>
suffix=".txt" timestamp="true"/>
宠物?BR>Jakarta Tomcat服务器是一UServlet/JSP容器Q经历了3.x?.0.x?.1.x的变q,现在最新的版本?.0.xQ支持Servlet2.4和JSP2.0规范Q从apache|站上下载Tomcat 5Q在环境变量中配|一下JAVA_HOMEQ小猫就能生灉|现的跑v来了。若猫启动p|QDOSH口?x)自动关闭,若运行catalina run命o(h)DOSH口是不?x)自动关闭的?/P>
tomcat中有三个攄java库的地方Q分别是/server/lib?shared/lib?common/lib?BR>区别Q?server/lib Q?其中的jar文g只能被tomcat服务器访问?BR>/shared/lib Q?其中的jar文g可以被所有的Web应用讉KQ但不能被tomcat服务器访问到?BR>/common/lib Q?Web服务和tomcat服务器都可以讉K的到?/P>
server.xml文g解析 Q?文g位置?lt;%CATALINA_HOME%>/conf/server.xml
配置虚拟L
Host元素代表虚拟LQ在同一个Engine元素下可以配|多个虚拟主机。打开server.xml文g可以发现Engine元素下已l有一个名为localhost的Host元素了,可以在它后面加入下列代码Q?/P>
Session的?/STRONG> Session的管?BR>当一个sesson开始时QServlet容器?x)创Z个HttpSession对象Q在某些情况下把q些Httpsession对象从内存中转移到文件系l中或数据库中,需要访问的时候在把它们蝲入到内存中来。这样做的好处有两点Q节U了内存的消耗,当web服务器生故障时Q还可以从文件系l或数据库中恢复Session的数据?BR>对于Session的管理,猫提供了两个实现类Qorg.apache.catalina.session.StandardManager和org.apache.catalina.session.PersistentManager?BR>StandardManager Q是默认的方法,当Tomcat服务器重启或重蝲的时候,?x)把Session对象保存?BR><%CATALINA_HOME%>/work/Catalina/honstname/applicatonname/SESSIONS.ser(默认?文g中,每个对象对应一个文Ӟ以Session ID为文件名Q例如:(x) 参数说明QcheckIntervalQ检查session是否q期的时间间隔,以秒为单位,~省值是60U; 参数说明QsaveOnRestartQ服务器关闭Ӟ是否所有的session保存到文件中Q?BR>maxActiveSessionsQ可处于zd状态的session敎ͼ Session失效旉的设?BR>在web.xml文g?位于<servlet-mapping>?lt;welcome-file-list>元素之间加入如下代码Q单位ؓ(f)分钟Q?/P>
Tomcat的adminq_和managerq_
Session是一U用来跟t用L(fng)态的机制Q那它是怎么实现的呢QServlet容器通过在客L(fng)览器中保存一个Session ID来跟tSessionQ调用session.getID()可以看到你的Session ID是多。如果客L(fng)支持CookieQ就把Session ID作ؓ(f)Cookie保持在浏览器中,现在l大多数览器都?x)把Cookie功能打开Q但如果用户止了Cookie呢?Java Servlet API中提Z另外一U机ӞServlet容器可以重写客户requst的URLQ把Session IDd到URL信息中,HttpServletResponse接口提供了这L(fng)Ҏ(gu)Qpublic String encodeURL(String url)Q先判断如果没有启用SessionQ例如jsp?lt;%@ page session="false"%>或执行了session.invalideate()Q那么直接返回urlQ在判断客户端师父支持CookieQ如果不支持Q就在url中加入Session ID的信息,然后q回修改后的url?/P>
<Manager className="org.apache.catalina.session.StandardManager" debug="0"
maxActiveSessions="-1" checkInterval="60" />
</Context>
maxActiveSessionsQ可处于zd状态的session数?BR>
PersistentManager Q提供了更加灉|的管理方式,h定w能力Q可以及(qing)时把Session备䆾到Session Store中,可以控制内存中Session的数量?BR>猫q提供了实现持久化Session Store的接口,org.apache.catalina.StoreQ目前提供了两个具体实现c:(x)org.apache.catalina.FileStore和org.apache.catalina.JDBCStore?BR>server.xml中的配置File Store Q?/P>
<Manager className="org.apache.catalina.session.PersistentManager" debug="0" saveOnRestart="true"
maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" >
<Store className="org.apache.catalina.session.FileStore" directory="mydir"/>
</Manager>
</Context>
minIdleSwap/maxIdleSwapQsession处于不活动状态最?长时?s)Qsesson对象转移到File Store中;
maxIdleBackupQ超q这一旉Q将session备䆾?Q?表示没有限制)
JDBCStore配置的区别:(x)
connectionURL="jdbc:mysql://localhost/tomsessionDB?user=root&password="
sessionTable="tomcat_session" sessionIdCol="session_id" sessionDataCol="session_data"
sessionValidCol="session_valid" sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access" sessionAppCol="app_name" checkInterval="60" debug="99" />
<session-timeout>60</session-timeout>
</session-config>
q是Tomcat中自带的两个Web应用Q位?lt;%CATALINA_HOME%>/server/webapps/admin(manager)Q访问地址是http://localhsot:8080/admin(manager)。要讉Kq两个Web应用Q需要在
<%CATALINA_HOME%>/conf/tomcat-users.xml中添加如下内容:(x)
<user username="admin" password="1234" role="admin"/> //对应admin Web应用
<user username="manager" password="1234" role="manager"/> //对应manager Web应用
adminq_把所有可配置的信息分Zc:(x)Tomcat Server、Resources、User Definition?BR>Tomcat ServerQ相当于server.xml中的<Server>元素?qing)其子元素?lt;Service>?lt;Host>?lt;Context>?lt;Resources>?lt;Date Source>?BR>ResourcesQ相当于server.xml中的<GlobalNamingResources>Q共有四U资源:(x)Date Source(JNDI数据?、Mail Sessioin(JNDI Mail Session资源)、Environment Entry(环境变量)、User Database(安全域中的用h据库)?BR>User DefinitionQ与tomcat-users.xml相对应?BR>
managerq_Q列出来所有Web应用和状态,q提供了Start、Stop、Reload?Undeploy命o(h)Q还可以发布
<%CATALINA_HOME%>/webapps目录下的Web应用或系l文件Q意位|的WAR文g?/P>
参考:(x)《Tomcat与JavaWeb开发技术详解?/FONT>
]]>