??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Apache的安装见前文
PHP
DokuWiki
DokuWiki 安全配置
?DokuWiki_HOME目录下创建prepend.phpQ和apache的配|文件对应,在执行会预先加蝲 $conf['savedir'] = '/local/xsun/wiki/data';
@include(DOKU_CONF.'local.protected.php');
users.auth.php:
test:61e7250f72098cf2602541ffbaf66e59:LALALA:pepsixp@gmail.com:admin,user
acl.auth.php:
* @ALL 1
* @user 8
Hibernate Annotation 配置的注意点Q?/p>
取出Qsvn co file:///etc/svn/report1
另外需要修改两个地方,不然无法提交修改的文Ӟ
Apache
Subversion
参数Q在macro指o中可以在宏变量之后定义参?BR>例二Q?BR><#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
使用Q?lt;@greet person="Fred"/> and <@greet person="Batman"/>
l果Q?<font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font>
macro可以有多个参敎ͼ参数的次序是无关的,在macro指o中只能用定义的参数Qƈ且必d所有参数赋|可以在定义参数时指定~省|
在自定义指o嵌套内容Q模板片断中使用<#nested>指o
使用Q?lt;@border>The bordered text</@border>
l果Q?/P>
<#nested>指o可以被多ơ调用:
使用Q?BR><@do_thrice>Anything.</@do_thrice>
l果Q?BR>Anything.
Anything.
Anything.
注意Q嵌套内Ҏ无法讉K到macro中的局部变量的?BR>例如Q?/P>
l果Q?BR>test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
下面是一个嵌套用自定义指o的例子:
l果Q?/P>
在macro?STRONG>使用循环变量Q作为nested指o的参C递@环变量的实际|而在调用用户定义指oӞ?lt;@?gt;开始标记的参数后面指定循环变量的名字:
l果Q?BR>1. 0.5
2. 1
3. 1.5
4. 2 Last!
注意Q@环变量和用户定义指o开始标记指定的数目可以不同Q调用时指定@环变量,则多指定的g可见Q调用时多指定@环变量,多余的@环变量不会被创徏?BR> 用assign指o创徏和替换的例子Q?/P>
l果Q?BR>1 局部变量隐?而不是覆?同名的plain变量Q@环变量隐藏同名的局部变量和plain变量Q下面是一个例子: l果Q?BR>1. plain 内部循环变量隐藏同名的外部@环变量,例如Q?/P>
l果Q?BR>loop 1 模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用Ҏ变量globalQ下面的例子假设数据模型中的user的值是Big JoeQ?/P>
命名(namespaces)I间Q通常情况Q只使用一个命名空_UCؓd名空?main namespace)Q但你是不会意识到这些的Qؓ了创建可重用的macro、transforms或其它变量的集合(通常U库)Q必M用多命名I间Qؓ了防止同名冲H?/P>
首先创徏一个库(假设保存在lib/my_test.ftl?Q?/P>
使用import指o导入库到模板中,Freemarker会ؓ导入的库创徏新的命名I间Qƈ可以通过import指o中指定的hash(散列)变量讉K库中的变量: l果Q?/P>
上面的例子中使用的两个同名变量ƈ没有冲突Q因为它们位于不同的命名I间 可以使用assign指o在导入的命名I间中创建或替代变量Q?/P>
l果Q?BR>jsmith@acme.com 数据模型中的变量M地方都可见,也包括不同的命名I间Q下面修改了刚才创徏的库Q?/P>
假设数据模型中的user变量的值是FredQ?/P>
l果Q?BR> <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>
模板中的变量Q有三种cdQ?BR>1.) plain(全局)变量Q可以在模板的Q何地方访问,包括使用include指o插入的模板,使用assign指o创徏和替?BR>2.) 局部变?/STRONG>Q在macro中有效,使用local指o创徏和替?BR>3.) 循环变量Q只能存在于指o的嵌套内容,由指?如list)自动创徏Q宏的参数是局部变量,而不是@环变?/P>
<#assign x = 1> <#-- create variable x -->
${x}
<#assign x = x + 3> <#-- replace variable x -->
${x}
4<#assign x = "plain">
1. ${x} <#-- we see the plain var. here -->
<@test/>
6. ${x} <#-- the value of plain var. was not changed -->
<#list ["loop"] as x>
7. ${x} <#-- now the loop var. hides the plain var. -->
<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->
8. ${x} <#-- it still hides the plain var. -->
</#list>
9. ${x} <#-- the new value of plain var. -->
<#macro test>
2. ${x} <#-- we still see the plain var. here -->
<#local x = "local">
3. ${x} <#-- now the local var. hides it -->
<#list ["loop"] as x>
4. ${x} <#-- now the loop var. hides the local var. -->
</#list>
5. ${x} <#-- now we see the local var. again -->
</#macro>
2. plain
3. local
4. loop
5. local
6. plain
7. loop
8. loop
9. plain2<#list ["loop 1"] as x>
${x}
<#list ["loop 2"] as x>
${x}
<#list ["loop 3"] as x>
${x}
</#list>
${x}
</#list>
${x}
</#list>
loop 2
loop 3
loop 2
loop 1 <#assign user = "Joe Hider">
${user} <#-- prints: Joe Hider -->
${.globals.user} <#-- prints: Big Joe -->
<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.
<br>Email: ${mail}</p>
</#macro>
<#assign mail = "jsmith@acme.com">
<#import "/lib/my_test.ftl" as my>
<#assign mail="fred@acme.com">
<@my.copyright date="1999-2002"/>
${my.mail}
${mail}
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
<br>Email: jsmith@acme.com</p>
jsmith@acme.com
fred@acme.com
<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="jsmith@other.com" in my>
${my.mail}
jsmith@other.com <#macro copyright date>
<p>Copyright (C) ${date} ${user}. All rights reserved.</p>
</#macro>
<#assign mail = "${user}@acme.com">
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="1999-2002"/>
${my.mail}
Fred@acme.com
参考:
FreeMarker in sourceforge.net
]]>
上面的例子中Q在单的HTML中加入了一些由${…}包围的特定FreeMarker的指令,q个文gq为模板了。而user、latestProduct.url和latestProduct.name来自于数据模型,由JavaE序提供Q模板设计者就不用兛_数据从哪来的?/P>
FreeMarker模板中可以包括下面四U特定部分:
一.) 文本Q直接输?BR>?) FTL标记(FreeMarker模板语言标记)Q类gHTML标记Q名字前?(有些以@开始,用户自定义标?予以区分Q不会输出?BR>字符?/STRONG>Q?使用单引h双引号限定;如果包含Ҏ字符需要{义符Q?{"It's \"quoted\" andthis is a backslash: \\"}
有一cȝD的字符?${r"C:\foo\bar"}Q输出结构ؓQC:\foo\barQ在引号前面加r被认为是U文本?
数字Q直接输入,不需要引受?{08}, ${+8}, ${8.00} and ${8} 都是相同?
布尔?/STRONG>Qtrue和falseQ不使用引号
Sequences(序列)Q由逗号分隔的变量列表,由方括号限定Q类似java中的一l数l:
输出l果Q?BR>winter
spring
summer
autumn
例二Q[2 + 2, [1, 2, 3, 4], "whatnot"]
例三Q?..5Q等同于[2, 3, 4, 5]Q?..2Q等同于[5,4,3,2]。注意方括号是不需要的?BR>
Hashes(散列)Q由逗号分隔的键-值列表,由大括号限定Q键和g间用冒号分隔Q{"name":"green mouse", "price":150}Q键和值都是表辑ּQ但是键必须是字W串?/P>
获取变量Q?{variable}Q变量名只能是字母、数字、下划线?、@?的组合,且不能以数字开头。下列表辑ּ是等LQ?BR>book.author.name
book["author"].name
book.author.["name"]
book["author"]["name"]
获取Sequence(序列)片断Q用[startindex..endindex]Q例如:seq中存储了"a", "b", "c", "d","e"Q那么seq[1..2]包含了b和c两个倹{?BR>
可以使用.variablename语法讉KFreeMarker内置变量?/P>
字符串操?/STRONG>
{"Hello ${user}!"} <==> ${"Hello " + user + "!"}
${"${user}${user}${user}${user}"} <==> ${user + user + user + user}
${…}只能在文本中使用Q下面是错误的代码:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if> //此处的代码也是错误的Q因为if指o需要的是booleanQ实际的却是个字W串
子字W串的操作,假设user的gؓ"Big Joe"Q?BR>${user[0]}${user[4]} <==> BJ
${user[1..4]} <==> ig J
Sequences(序列)操作
l果Q?BR>- Joe
- Fred
- Julia
- Kate
Hashes(散列)操作
l果Q?BR>- Joe is 30
- Fred is 25
- Julia is 18
术q算
l果Q?BR>-75
2.5
2
注意Q?操作W两边必L数字Q?+"Ӟ如果一Ҏ数字Q一Ҏ字符Ԍ׃自动数字{换ؓ字符丌Ӏ?BR>
使用内徏的指令int获得整数部分Q?/P>
l果Q?BR>2
1
1
-1
-1
比较操作W?/STRONG>Q?lt;#if expression>...</#if>
1.)使用=Q或==Q完全相{)试两个值是否相{,使用!= 试两个值是否不相等
2.)=?=两边必须是相同类型的|否则会生错误,例如<#if 1 = "1">会引起错?BR>3.)Freemarker是精比较,所?x"?x "?X"是不相等?BR>4.)Ҏ字和日期可以使用<?lt;=?gt;?gt;=Q但不能用于字符?BR>5.)׃Freemarker会将>解释成FTL标记的结束字W,所以对?gt;?gt;=可以使用括号来避免这U情况,例如<#if (x > y)>Q另一U替代的Ҏ是,使用lt、lte、gt和gte来替?lt;?lt;=?gt;?gt;=
逻辑操作W?/STRONG>Q?amp;&(and)、||(or)?(not)Q只能用于布|否则会生错?BR><#if x < 12 && color = "green">
We have less than 12 things, and they are green.
</#if>
<#if !hot> <#-- here hot must be a boolean -->
It's not hot.
</#if>
内置函数Q用法类D问hash(散列)的子变量Q只是??"替代"."Q例如:user?upper_case
下面列出常用的一些函敎ͼ
对于字符?/U>
htmlQ对字符串进行HTML~码
cap_firstQ字符串第一个字母大?BR>lower_caseQ将字符串{换成写
trimQ去掉字W串前后的空白字W?BR>对于Sequences(序列)
sizeQ获得序列中元素的数?BR>对于数字
intQ取得数字的整数部分Q如-1.9?int的结果是-1Q?BR>
例一Q?/P>
<#-- test的gؓTom & Jerry -->
${test?html}
${test?upper_case?html}
l果Q?BR>Tom & Jerry
TOM & JERRY
例二Q?/P>
l果Q?BR>4
Spring
Horse
Ҏ的调?/STRONG>
${repeat("What", 3)}
${repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case}
l果Q?BR>WhatWhatWhat
xxxxxxWHATWHATWHATWHAT
操作W优先顺?/STRONG>
后缀 [subvarName] [subStringRange] . (methodParams)
一?nbsp; +expr?expr?
内徏 ?
乘法 *?/ ?
加法 +?
关系 <?gt;?lt;=?gt;=Qlt、lte、gt、gteQ?BR>相等 =?=
逻辑 &&
逻辑 ||
数字范围 ..
?) InterpolationQ由${...}?{...}两种cdQ输|可以定义输出的格?BR>例一Q?/P>
l果Q?BR>$42.00
$42.00
42
$42.00
4,200%
例二Q?/P>
l果Q?BR>2003-04-08 21:24:44 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 09:24:44 PM (PDT)
例三Q?/P>
l果Q?BR>yes
例四Q?/P>
说明QmXQ小数部分最X位;MXQ小数部分最大X位?/P>
?) 注释Q?lt;#--?->
下面是一个常用的模板例子Q?/P>
注意?/STRONG>Q?BR>1.) FreeMarker是区分大写的;
2.) FTL标记不能位于另一个FTL标记内部Q例如:<#if <#include 'foo'>='bar'>...</if>Q?BR>3.) ${…}只能在文本中使用Q?BR>4.) 多余的空白字W会在模板输出时去除Q?BR>5.) 如果使用的指令不存在Q会产生一个错误消息?/P>
参考:
FreeMarker in sourceforge.net
]]>
下面是一个解决中文ؕ码问题很有用的一个过滤器Q?/P>
发布Servletqo?/STRONG>Q在web.xml在文件中加入<filter>元素?lt;filter-mapping>元素
下面的例子中Servletqo器会qo所有的URLQ?/P>
串连Servletqo?/STRONG> 自定义JSP标签?BR>此技术在JSP 1.1版本中才出现Q用来重用某些复杂的逻辑q算和事务,或定义JSP王爷的输出内容和格式。制作一个完整的自定义标{序,包含3个步骤: 2.创徏TLDQTag Library Descriptor(标签库描q文? 实际中的使用Q?BR><%@ taglib uri="/tags/test" prefix="test" %>
多个Servletqo器可以协同工作,Servlet容器根据它们在web.xml中定义的先后序Q依ơ调用它们的doFilter()Ҏ?BR>工作程如下Q?BR> Code1; // 表示调用chain.doFilter()前面的代?BR> chain.doFilter(); // 表示调用下一个过滤器的doFilter()Ҏ
Code2; // 表示调用chain.doFilter()后面的代?/P>
1. 创徏标签的处理类
此类必须扩展javax.servlet.jsp.TagSupportcL者javax.servlet.jsp.BodyTagSupportcR?BR>以TagSupportcMؓ例,先了解一下这个类的主要方法:
doStartTag()QJSP容器遇到自定义标{起始标志时调用该ҎQ?BR>doEndTag()QJSP容器遇到自定义标{l束标志时调用该ҎQ?BR>setValue(String k,Object o)Q在标签处理cM讄key/value;
getValue(String k)Q在标签处理cMҎkeyq回匚w的value;
removeValue(String k)Q在标签处理cM删除key/value;
setPageContext(PageContext pc)Q设|PageContext对象Q该Ҏ在调用doStartTag()和doStartTag()前调用;
setParent(Tag t)Q设|嵌套当前标{上层标签的处理类Q该Ҏ在调用doStartTag()和doStartTag()前调用;
getParent()Q返回嵌套当前标{上层标签的处理类?BR>
首先调用setPageContext(PageContext pc)和setParent(Tag t)Q设|TagSupportcȝ两个重要属性倹{?BR>
如果遇到起始标志Q调用doStartTag()Q此Ҏq回一个整数|它有两个可选|Tag.SKIP_BODY(标签之间的内容被忽略)和Tag.EVAL_BODY_INCLUDE(标签之间的内Ҏ常执??BR>例如Q?lt;prefix:mytag>test</prefix:mytag>Q如果遇上Tag.SKIP_BODYQtest字符串不会显C在面上;如果遇上Tag.EVAL_BODY_INCLUDEQtest字符串将会显C在面上?BR>
如果遇到l束标志Q调用doEndTag()Q此Ҏ也返回一个整数|它有两个可选|Tag.SKIP_PAGE(表示立刻停止执行JSP面Q网上未处理的静态内容和JSPE序均别忽略QQ何已有的输出内容立刻q回到客LQ?和Tag.EVAL_PAGE(表示按正常流El执行JSP面)?BR>
如果自定义标{含自定义的属性,例如Q?lt;prefix:mytag attribute1="value1">Q那么处理类中应该将q个属性做为成员变量,q提供一lget和setҎQ?BR>private int attribute1;
public void setAttribute1(int value){
this.attriubte1 = value;
}
public int getAttribute1(){
return attribute1;
}
下面是一个用来验证用L陆的标签处理cM子: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:<tablib>?lt;tag>?lt;attribute>
<tablib>Q设定标{ֺ的相关信息,包含的子元素有tlibversion、jspversion、shortname、uri、info、tag?BR><tag>Q用来定义一个标{,包含的子元素有name、tagcalss、bodycontent、info、attribute?BR>bodycontent的说明:有三个可选值empty、JSP、tagdependentQempty表示标签中没有bodyQJSP表示body中可以加入JSPE序代码Qtagdependent表示body的内Ҏ标签q行处理?BR><attribute>Q用来定义标{属性,包含的子元素有name、required、rtexprvalue?BR>rtexprvalue的说明:表示是否可以使用<%=...%>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>
参考:《Tomcat与JavaWeb开发技术详解?/FONT>
]]>
安全?/STRONG>
q是Tomcat服务器用来保护Web应用资源的一U机制。一个用户可以拥有一个或多个角色Q每个角色限定了可访问的Web资源Q这样就用户和Web资源对应h了。在org.apache.catalina.Realm接口中声名了用户名、口令和角色相管理的ҎQTomcat5提供?个实现这一接口的类Q分别ؓ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>
上面的代码表明:只有admin角色才能讉Kadmin应用中的*.jsp?.do?.html资源?BR>另一个例子是jsp-examples应用Q?BR>
上面的代码表明:只要tomcat和role1角色才可以以DELETE、GET、POST和GET方式讉Kjsp-exzmples应用URL?security/protected/下的资源?BR>在web.xml中加?lt;login-config>元素Q系l会以对话框的方式进行登?BR>
<auth-method>有三个可选项QBASIC、DIGEST、FORM?BR>BASICQ基本验证:讉K受保护资源时Q会弹出一对话框。要求输入用户名和密码,如果q箋3ơ失败后Q会昄一个错误页面。这个方法的~点是用户名和密码的数据传输采用的是Base64~码(可读文本)Q是非常不安全的?BR>DIGESTQ摘要验证:数据采用MD5对用户名和密码进行加密,然后再传输,昄q种Ҏ很安全?BR>FORMQ表单验证:可以使用自定义的登陆面Q但用户名对应的文本框名U必Lj_username,密码为j_passwordQ且表单actiongؓj_security_check?BR>在web.xml中加?lt;security-role>元素Q指明这个Web应用应用的所有角色的名字
你可以调用HttpRequeset接口的getRemoteUser()Ҏq回当前用户的名字:<%=request.getRemoteUser()%>
内存?/STRONG>Q由org.apache.catalina.realm.MemoryRelamcd?BR>猫启动Ӟ自动d<%CATALINA_HOME%>/conf/tomcat-users.xml文gQ要在Web应用中用,可以在对应的<Context>元素内加入如下内容:<Realm className="org.apache.catalina.realm.MemoryRelam"/>
JDBC?/STRONG>Q通过JDBC驱动从数据库中直接读取验证信息,通过验证后,信息会存储在session中?BR>在mysql中新Z张表Q?/P>
然后在server.xml中加入:
DataSource?/STRONG>Q和JDBC域很cMQ只不过讉K数据库的方式不同Q这个是使用JNDI DataSource来访问数据库的?BR>先在web.xml中加入安全约束,在和JDBC域一hZ张表Q然后在server.xml文g?lt;GlobalNamingResources>元素下添加如下内容: 注意QTomcat的JNDI资源必须配置?lt;GlobalNamingResources>元素下,服务器才能找刎ͼ否则会出现NameNotFoundExceptionQ低于Tomcat5.0.12的版本,即正确配置了DataSourceRealmQ也会出现找不到JNDI DataSource的异常,q个猫的一个bugQ在web.xml中是不需要配|?lt;resource-ref>元素的,因ؓWeb应用q不会访问这个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属性规定日志的格式和内容:%aQ远EIP地址Q?AQ本地IP地址Q?bQ发送的字节敎ͼ不包括HTTP HeaderQ?hQ远E主机名Q?HQ客戯求所用的协议Q?lQ?-";%mQ请求的ҎQ?pQ接受请求的本地服务器断开Q?qQ查询字W串Q?rQ用戯求的W一行内容;%sQ响应HTTP Request的状态码Q?SQ用户Session IDQ?tQ时_%uQ验证的用户名;%UQ请求URL路径Q?vQ本地服务器名?BR>
q程地址qo?/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?/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"/>