﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-赢在执行</title><link>http://www.blogjava.net/Jiangzy/</link><description>这个世界上只有两样东西愈分享愈多,那就是智慧与爱。</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:56:29 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:56:29 GMT</pubDate><ttl>60</ttl><item><title>最近在学习分析php源代码的，有一起交流的？</title><link>http://www.blogjava.net/Jiangzy/archive/2016/06/20/430974.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Mon, 20 Jun 2016 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2016/06/20/430974.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/430974.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2016/06/20/430974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/430974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/430974.html</trackback:ping><description><![CDATA[最近在学习分析php源代码的，有一起交流的？<br /><br />公司网站：<a href="http://www.bejate.com">http://www.bejate.com</a><img src ="http://www.blogjava.net/Jiangzy/aggbug/430974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2016-06-20 16:04 <a href="http://www.blogjava.net/Jiangzy/archive/2016/06/20/430974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2的Ajax输入校验     </title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/05/179313.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Mon, 04 Feb 2008 16:13:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/05/179313.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/179313.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/05/179313.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/179313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/179313.html</trackback:ping><description><![CDATA[Struts2的Ajax输入校验&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1865481&amp;Type=Rank"></script><img title="文章指数:0" alt="文章指数:0" src="http://blog.csdn.net/images/star_0.gif" border="0" />&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" />
<div class="postText">
<p>&nbsp;&nbsp;&nbsp; 这段时间在研究Struts2，学习资料是新上市的李刚著的《Struts2权威指南》，很不错的一本书，看了觉得收获很大。刚研究完Struts2中的Ajax输入校验，并做了一些例子，现总结如下：</p>
<p><br />
&nbsp;&nbsp;&nbsp; Ajax的输入校验不是客户端校验，而是服务器端校验，但这种服务器端校验是以异步方式进行的，浏览者无需显示提交请求，当浏览者输入完成后，系统自动完成校验。Struts2的Ajax校验建立在DWR和Dojo两个框架之上，其中DWR负责实现在JavaScript中调用远程Java方法，而Dojo则负责实现页面效果的实现。<br />
一. 配置DWR的核心Servlet<br />
DWR是Java领域的Ajax框架，它允许客户端JavaScript代码直接调用服务器端的Java方法，而这个过程是通过一个核心Servlet的转换来实现的。为了让DWR的核心Servlet起作用，必须在web.xml文件中配置该核心Servlet。配置DWR的核心Servlet的配置片段如下：<br />
&lt;!-- 配置Struts2的核心Servlet --&gt;<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;dwr&lt;/servlet-name&gt;<br />
&lt;!-- 指定Servlet的实现类 --&gt;<br />
&nbsp;&lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;<br />
&nbsp;&lt;!-- 指定处于开发阶段 --&gt;<br />
&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&lt;/init-param&gt;<br />
&lt;/servlet&gt;<br />
&lt;!-- 指定DWR的核心Servlet拦截的URL --&gt;<br />
&lt;servlet-mapping&gt;<br />
&nbsp;&lt;servlet-name&gt;dwr&lt;/servlet-name&gt;<br />
&nbsp;&lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
在上面配置文件中增加了DWR的核心Servlet后，该Servlet负责将服务器端的Java方法暴露出来。到底那些Java方法需要被暴露出来，通过在dwr.xml配置文件中指定即可，因此需要在本应用中增加一个dwr.xml文件。<br />
提示：此处并不许需要开发者自己开发Ajax应用，并不需要开发者利用DWR框架，我们只需利用Struts2对DWR的封装即可。因此，只需在Web应用的WEB-INF路径下增加dwr.xml文件即可，而且dwr.xml文件的代码也是固定的：<br />
&lt;!DOCTYPE dwr PUBLIC <br />
&nbsp;"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" <br />
&nbsp;"<a href="http://www.getahead.ltd.uk/dwr/dwr10.dtd">http://www.getahead.ltd.uk/dwr/dwr10.dtd</a>"&gt;<br />
&lt;dwr&gt;<br />
&nbsp;&lt;!-- 定义所有需要被暴露的Java方法 --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;allow&gt;<br />
&nbsp;&nbsp;&lt;!-- 定义将org.apache.struts2.validators.DWRValidator创建成一个validator对象 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;create creator="new" javascript="validator"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="class" value="org.apache.struts2.validators.DWRValidator"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/create&gt;<br />
&nbsp;&nbsp;&lt;!-- 定义一个转换器 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/allow&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;signatures&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import java.util.Map;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.struts2.validators.DWRValidator;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWRValidator.doPost(String, String, Map&lt;String, String&gt;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/signatures&gt;<br />
&lt;/dwr&gt;<br />
在上面配置文件中，将org.apache.struts2.validators.DWRValidator类创建成一个JavaScript对象，这个对象名为validator。当然，这里所说的创建是假创建，因为Java类是无法创建JavaScript对象，但DWR提供一种方式，允许当我们在客户端调用validator的方法时，转换成调用DWRValidator实例的方法。<br />
提示：关于DWR的运行原理和使用细节，请读者参考笔者所著的《基于J2EE的Ajax宝典》一书。此处由于篇幅管理，无法详述DWR的用法和细节。<br />
实际上，对于一个Struts2的开发者而言，无需理会这些实现细节，因为Struts2已经为我们提供了这些封装，我们只需要在Struts2封装的基础上进行开发即可。<br />
值得指出的是，为了让Web应用增加DWR支持，显然还需要将DWR的二进制包复制到Web应用中。即使对于Struts2.0.6正式版，依然不支持DWR的的最新版本（DWR的最新版本是2.0.1），因此只能使用DWR的前一个正式版1.1.3，将dwr-1.1.3.jar文件复制到Web应用中即可。<br />
提示：由于Struts2发行版中并未包含DWR二进制文件。因此，dwr-1.1.3.jar文件必须到DWR的官方站点（<a href="http://getahead.ltd.uk/dwr/">http://getahead.ltd.uk/dwr/</a>）自行下载。</p>
<p>二. 设置页面的Ajax主题<br />
正如前面已经提到的，实现Ajax交互必须在页面中导入Ajax风格的controlheader.ftl，这个控件负责当每个输入组件失去焦点时，将输入结果发送到服务器端进行校验。<br />
为了实现Ajax校验，还需要将表单设置成Ajax主题，并且设置validate="true"。下面是本示例应用中regist.jsp页面的代码：<br />
&lt;%@ page language="java" contentType="text/html; charset=GBK"%&gt;<br />
&lt;!-- 导入Struts2标签库 --&gt;<br />
&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#64;&#116;&#97;&#103;&#108;&#105;&#98;">%@taglib</a> prefix="s" uri="/struts-tags"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;请输入您的注册信息&lt;/title&gt;<br />
&lt;!-- 导入Ajax主题的controlheader.ftl --&gt;<br />
&lt;s:head theme="ajax"/&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;H1&gt;请输入您的注册信息&lt;/H1&gt;<br />
&lt;!-- 设置表单使用Ajax主题，并且设置validate="true" --&gt;<br />
&lt;s:form action="regist" theme="ajax" validate="true"&gt;<br />
&nbsp;&lt;s:textfield name="name" label="作者名"/&gt;&lt;br&gt;<br />
&nbsp;&lt;s:textfield name="pass" label="密码"/&gt;<br />
&nbsp;&lt;s:textfield name="age" label="年龄"/&gt;<br />
&nbsp;&lt;s:textfield name="birth" label="生日"/&gt;<br />
&nbsp;&lt;s:submit value="注册"/&gt;<br />
&lt;/s:form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
在上面的表单被设置成Ajax主题（这将意味着该表单是一个远程表单），并且设置了validate="true"属性。一旦完成了上面设置后，当某个输入组件失去焦点时，系统会负责将输入内容发送到服务器端进行校验。</p>
<p>三. 设置校验规则<br />
对于使用Ajax校验的Action类，与基本校验的Action类并没有太大的不同之处。但必须指出：尽量不要重写Action类的validate方法，重写该方法来完成Ajax校验可能出现一些未知异常（这可能是Struts2还需要完善的地方）。<br />
注意：不同通过重写validate方法来完成Ajax校验。<br />
为了完成输入校验，我们通过定义自己的校验规则文件来完成输入校验，本输入校验文件使用字段校验器风格来配置校验规则。下面是校验文件的代码：<br />
文件，该文件指定了Action的属性必须满足怎样的规则，下面是该应用中Action的校验文件的代码。<br />
&lt;?xml version="1.0" encoding="GBK"?&gt;<br />
&lt;!-- 指定校验配置文件的DTD信息 --&gt;<br />
&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"<br />
&nbsp;"<a href="http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd</a>"&gt;<br />
&lt;!-- 校验文件的根元素 --&gt;<br />
&lt;validators&gt;<br />
&nbsp;&lt;!-- 校验Action的name属性 --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;field name="name"&gt;<br />
&nbsp;&nbsp;&lt;!-- 指定name属性必须满足必填规则 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="trim"&gt;true&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;message&gt;必须输入名字&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&lt;!-- 指定name属性必须匹配正则表达式 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;field-validator type="regex"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="expression"&gt;&lt;![CDATA[(\w{4,25})]]&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;message&gt;您输入的用户名只能是字母和数组，且长度必须在4到25之间&lt;/message&gt;<br />
&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/field&gt;<br />
&nbsp;&lt;!-- 校验Action的pass属性 --&gt;<br />
&nbsp;&lt;field name="pass"&gt;<br />
&nbsp;&nbsp;&lt;!-- 指定pass属性必须满足必填规则 --&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="trim"&gt;true&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;必须输入密码&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&lt;!-- 指定pass属性必须满足匹配指定的正则表达式 --&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="regex"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="expression"&gt;&lt;![CDATA[(\w{4,25})]]&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;您输入的密码只能是字母和数组，且长度必须在4到25之间&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&nbsp;&lt;!-- 指定age属性必须在指定范围内--&gt;<br />
&nbsp;&lt;field name="age"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="min"&gt;1&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="max"&gt;150&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;年纪必须在1到150之间&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&lt;/field&gt;<br />
&nbsp;&lt;!-- 指定birth属性必须在指定范围内--&gt;<br />
&nbsp;&lt;field name="birth"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="date"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 下面指定日期字符串时，必须使用本Locale的日期格式 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="min"&gt;1900-01-01&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="max"&gt;2050-02-21&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;年纪必须在${min}到${max}之间&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&lt;/validators&gt;<br />
实际上，这份校验文件与之前进行基本校验的校验文件并没有太大的区别。这也证明了Struts2框架的简单、易用。<br />
完成上面定义后，如果浏览者在输入页面中输入用户名，将焦点移到密码输入框时，将看到Ajax校验效果。</p>
</div>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/179313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-05 00:13 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/05/179313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java-web-struts2-2.0-防止重复提交之设置-intercept        </title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/04/179312.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Mon, 04 Feb 2008 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/04/179312.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/179312.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/04/179312.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/179312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/179312.html</trackback:ping><description><![CDATA[java-web-struts2-2.0-防止重复提交之设置-intercept&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=2070297&amp;Type=Rank"></script><img title="文章指数:0" alt="文章指数:0" src="http://blog.csdn.net/images/star_0.gif" border="0" />&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" />
<div class="postText">
<p><font size="3"><span class="Title"><font size="3">在用struts2.0标签开发中,经常要使用form提交.</font></span></font></p>
<p><font size="3">通常:</font></p>
<p><font size="3">1)写一个action类<br />
&nbsp;此action类完成提交后的保存动作.</font></p>
<p><font size="3">2)写一个静态jsp页面<br />
&nbsp;写form,以及输入input,和提交button.<br />
<br />
3)设置struts*****.xml文件<br />
配置action名称以及映射的类和返回结果名称等.</font></p>
<p><font size="3">问题:</font></p>
<p><font size="3">在点击"提交"后,我们通常会弹出一个提示信息的页面,用户此时有可能会按f5刷新当前提交的action,从而将多个相同的数据保存到了后台数据库,并且造成了潜在的安全危险!<br />
如何避免重复提交呢?</font></p>
<p><font size="3">1) 用&lt;s:token&gt;!<br />
如在输入界面的jsp里,设置token标志:</font></p>
<p><font size="3">&lt;form name="myname" action="myaction.do" method="post"&gt;</font></p>
<p><font size="3">&lt;input type="text" name="stuName" value="" .../&gt;</font></p>
<p><font size="3">... ...</font></p>
<p><font size="3">&lt;s:token/&gt;</font></p>
<p><font size="3">&lt;input&nbsp;type="button" onclick="mymethod(this.form);" .../&gt;</font></p>
<p><font size="3">&lt;/form&gt;&nbsp;</font></p>
<p><font size="3">2) 在struts****.xml文件里配置拦截器:</font></p>
<p><font size="3">&lt;!-- 保存 --&gt;<br />
&nbsp;&nbsp;&lt;action name="Save"<br />
&nbsp;&nbsp;&nbsp;class="com.yourcom.app.Action.Dataform.saveAction"<br />
&nbsp;&nbsp;&nbsp;method="Save"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;interceptor-ref name="defaultStack" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="token" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="invalid.token"&gt;/Info/NoBack.jsp&lt;/result&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;/action&gt;</font></p>
<p><font size="3">3)写一个名称为NoBack.jsp的提示文件,当重复f5刷新时,将显示本页内容,提示"不可重复提交,或者页面已经过期"</font></p>
<p><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/IUPRG/2.JPG" /></font></p>
<p><font size="3">&lt;s:token/&gt;在最终生成页面时,自动生成一个unique id,通过它拦截器才能知道页面是否是同一次提交.</font></p>
<p><font size="3"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/IUPRG/1.JPG" /></font></p>
</div>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/179312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-04 23:57 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/04/179312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache中URL Rewrite技术的实现     </title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178771.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Thu, 31 Jan 2008 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178771.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/178771.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/178771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/178771.html</trackback:ping><description><![CDATA[Apache中URL Rewrite技术的实现&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1652750&amp;Type=Rank"></script><span title="文章指数:90"><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star_half.gif" border="0"  alt="" /></span>&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" />
<div class="postText">
<div id="more">
<p>最近我们公司的网站在进行优化动作，要想采用一种好点的技术，使得原来的PHP动态形式的网页文件能够被GOOGLE等搜索引擎更加容易地收入其中，目前我们已经采用了一些改进办法：比如在后台用PHP程序将原来的文件改成HTM内容；采用Apache的Path_Info技术，但觉得还是不够强大，因此决定采用Apache中的URL Rewrite技术来试用一下。</p>
<p>很早就注意到它了，但一直不知道怎么实现，今天咬咬牙，翻了N篇有关的文章，终于实现了一些基本的功能：</p>
<p>1、修改http.conf</p>
<p>在你要修改网站的根目录下：</p>
<p><br />
DefaultType application/x-httpd-php<br />
rewriteengine on #必须<br />
options followsymlinks #必须<br />
RewriteRule /news/(\d+)\.html /news\.php\?id=$1 [N,L] #规则<br />
AllowOverride All</p>
<p>2、先修改http.conf</p>
<p><br />
DefaultType application/x-httpd-php<br />
options followsymlinks <br />
AllowOverride All<br />
</p>
<p>然后再在此目录下建立一个.htacess文件，它的内容如下：<br />
rewriteengine on <br />
rewritebase /websamples/urlrewrite/ <br />
RewriteRule news/(\d+)\.html news\.php\?id=$1 [N,L]</p>
<p>&nbsp;</p>
<p>这样就实现了将http://localhost/news/1000.html 解析为 http://localhost/news.php?id=1000的功能</p>
<p>附录：(一个网站的.htacess文件)</p>
<p>-------------------------------------------------------------------------------</p>
<p>ErrorDocument 401 /error.php<br />
rewriteengine on <br />
rewritebase /websamples/urlrewrite/power-for-less.com/</p>
<p>#show category<br />
#<br />
RewriteRule ^((laptop([^/]*))|(camcorder([^/]*))|(((digital)?).?camera([^/]*))|(power([^/]*))|(pda([^/]*))|(mobile([^/]*))|(two-way([^/]*))|(scanner([^/]*))|(mp3([^/]*)))\.htm(l?)$ babrand\.php\?fclassname=$1 [NC]</p>
<p>#show brands<br />
#<br />
RewriteRule ^(laptop([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(camcorder([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(((digital)?).?camera([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$5 [NC]<br />
RewriteRule ^(power([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(pda([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(mobile([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(two-way([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(scanner([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]<br />
RewriteRule ^(mp3([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&amp;fb_babrand=$3 [NC]</p>
<p>#show products<br />
#<br />
RewriteRule ^(laptop([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(camcorder([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(((digital)?).?camera([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$6 [NC]<br />
RewriteRule ^(power([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(pda([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(mobile([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(two-way([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(scanner([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]<br />
RewriteRule ^(mp3([^/]*))/([^/]+)/(.+)\.htm(l?)$ product\.php\?fclassname=$1&amp;fb_babrand=$3&amp;code=$4 [NC]</p>
</div>
</div>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/178771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-01 00:41 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/01/178771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache的URL重写规则的标志详细说明</title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178770.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Thu, 31 Jan 2008 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178770.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/178770.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/178770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/178770.html</trackback:ping><description><![CDATA[<p>Apache的URL重写规则的标志详细说明</p>
<p>1) R[=code](force redirect) 强制外部重定向<br />
&nbsp;&nbsp;&nbsp;强制在替代字符串加上<a href="http://thishost/" target="_blank">http://thishost</a>[:thisport]/前缀重定向到外部的URL.如果code不指定，将用缺省的302 HTTP状态码。<br />
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。<br />
3) G(force URL to be gone) 强制URL为GONE，返回410HTTP状态码。<br />
4) P(force proxy) 强制使用代理转发。<br />
5) L(last rule) 表明当前规则是最后一条规则，停止分析以后规则的重写。<br />
6) N(next round) 重新从第一条规则开始运行重写过程。<br />
7) C(chained with next rule) 与下一条规则关联<br />
&nbsp;&nbsp;&nbsp;如果规则匹配则正常处理，该标志无效，如果不匹配，那么下面所有关联的规则都跳过。<br />
8) T=MIME-type(force MIME type) 强制MIME类型<br />
9) NS (used only if no internal sub-request) 只用于不是内部子请求<br />
10） NC(no case) 不区分大小写<br />
11) QSA(query string append) 追加请求字符串<br />
12) NE(no URI escaping of output) 不在输出转义特殊字符<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如：RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed<br />
13) PT(pass through to next handler) 传递给下一个处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alias /def /ghi <br />
14) S=num(skip next rule(s)) 跳过num条规则<br />
15) E=VAR:VAL(set environment variable) 设置环境变量&nbsp;</p>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/178770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-01 00:41 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/01/178770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Apache实现UrlRewrite静态化页面的配置</title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178769.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Thu, 31 Jan 2008 16:40:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178769.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/178769.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/178769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/178769.html</trackback:ping><description><![CDATA[<div class="tit">关于Apache实现UrlRewrite静态化页面的配置</div>
<div class="date">2007年07月27日 星期五 22:56</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p><font color="#ff0000">关于UrlRewrite静态化的说明：</font></p>
            <p>(1)apache用户,首先确认您的服务器是apache架设的web服务器（此插件只使用于apache架设的服务器）<br />
            Apache Web Server（独立主机用户） <br />
            首先确定您使用的 Apache 版本，及是否加载了 mod_rewrite 模块。<br />
            Apache 1.x 的用户请检查 conf/httpd.conf 中是否存在如下两段代码：<br />
            LoadModule rewrite_module libexec/mod_rewrite.so<br />
            AddModule mod_rewrite.c<br />
            Apache 2.x 的用户请检查 conf/httpd.conf 中是否存在如下一段代码：<br />
            LoadModule rewrite_module modules/mod_rewrite.so<br />
            如果存在，那么在配置文件（通常就是 conf/httpd.conf）中加入如下代码。此时请务必注意，如果网站<br />
            使用通过虚拟主机来定义，请务必加到虚拟主机配置，即 &lt;VirtualHost&gt; 中去，如果加在虚拟主机配置外<br />
            部将可能无法使用。改好后然后将 Apache 重启。</p>
            <pre>&lt;IfModule mod_rewrite.c&gt;
            RewriteEngine On
            </pre>
            <pre>RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)-([0-9]+).html[?]{0,1}(.*)$ $1/forumdisplay.php
            ?f=$2&amp;st=$4&amp;pp=$3&amp;$5
            RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+).html[?]{0,1}(.*)$ $1/forumdisplay.php?f=$2&amp;pp=$3&amp;$4
            RewriteRule ^(.*)/forum-([0-9]+)-(q?)-([0-9]+).html[?]{0,1}(.*)$ $1/forumdisplay.php
            ?f=$2&amp;filter=quintessence&amp;pp=$3&amp;$4
            RewriteRule ^(.*)/forum-([0-9]+)-(q?).html[?]{0,1}(.*)$ $1/forumdisplay.php
            ?f=$2&amp;filter=quintessence&amp;$4
            RewriteRule ^(.*)/forum-([0-9]+).html[?]{0,1}(.*)$ $1/forumdisplay.php?f=$2&amp;$3
            RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+).html[?]{0,1}(.*)$ $1/showthread.php?t=$2&amp;pp=$3&amp;$4
            RewriteRule ^(.*)/thread-([0-9]+).html[?]{0,1}(.*)$ $1/showthread.php?t=$2&amp;$3
            RewriteRule ^(.*)/user-([0-9]+).html $1/profile.php?u=$2[L]
            RewriteRule ^(.*)/archive/f-([0-9]+)-([0-9]+).html $1/index.php?f$2-$3.html[L]
            RewriteRule ^(.*)/archive/t-([0-9]+)-([0-9]+).html $1/index.php?t$2-$3.html[L]
            &lt;/IfModule&gt;
            如果没有安装 mod_rewrite，您可以重新编译 Apache，并在原有 configure 的内容中加入
            --enable-rewrite=shared，然后再在 Apache 配置文件中加入上述代码即可。 <br />
            Apache Web Server（虚拟主机用户）
            <pre>在开始以下设置之前，请首先咨询您的空间服务商，空间是否支持 Rewrite 以及是否支持对站点
            目录中 .htaccess 的文件解析，否则即便按照下面的方法设置好了，也无法使用。
            </pre>
            <pre>检查论坛所在目录中是否存在 .htaccess 文件，如果不存在，请手工建立此文件。Win32 系统下
            ，无法直接建立 .htaccess 文件，您可以从其他系统中拷贝一份，或者在 魔力论坛技术支持栏目
            中下载此文件。编辑并修改 .htaccess 文件，添加以下内容 :
            </pre>
            <pre># 将 RewriteEngine 模式打开
            RewriteEngine On
            </pre>
            <pre># 修改以下语句中的 /molyx_board 为你的论坛目录地址，如果程序放在根目录中，请将
            /molyx_board 修改为 /
            RewriteBase /molyx_board/
            # Rewrite 系统规则请勿修改
            RewriteRule forum-([0-9]+)-([0-9]+)-([0-9]+).html forumdisplay.php?f=$1&amp;st=$3&amp;pp=$2&amp;$4
            RewriteRule forum-([0-9]+)-([0-9]+).html forumdisplay.php?f=$1&amp;pp=$2&amp;$3
            RewriteRule forum-([0-9]+)-(q?)-([0-9]+).html forumdisplay.php?f=$1&amp;filter=quintessence&amp;pp=$3
            RewriteRule forum-([0-9]+)-(q?).html forumdisplay.php?f=$1&amp;filter=quintessence
            RewriteRule forum-([0-9]+).html forumdisplay.php?f=$1
            RewriteRule thread-([0-9]+)-([0-9]+).html showthread.php?t=$1&amp;pp=$2&amp;$3
            RewriteRule thread-([0-9]+).html showthread.php?t=$1&amp;$2
            RewriteRule user-([0-9]+).html profile.php?u=$1
            RewriteRule archive/f-([0-9]+)-([0-9]+).html archive/index.php?f$1-$2.html
            RewriteRule archive/t-([0-9]+)-([0-9]+).html archive/index.php?t$1-$2.html</pre>
            <pre> </pre>
            <pre>以上为开启URL静态化的整个说明。</pre>
            <pre><font color="#ff0000">本人是独立主机，按照上面做，一直没有成功。开启静态化后，提示</font>
            <p><font color="#ff0000">The requested URL thread-11955.html was not found on this server</font></p>
            <p><font color="#ff0000">困惑了一天，修改了很多次规则都不行。后来尝试着结合虚拟主机用户方法。首先把httpd.conf中的规则</font></p>
            <p><font color="#ff0000">配置去掉，然后</font><font color="#ff0000">在论坛根目录创建.htaccess 文件，然后把规则写进去，重启apache，一切OK啦。</font></p>
            <p><font color="#ff0000">规则如下：</font></p>
            <p><font color="#ff0000"> </font></p>
            <p><font color="#ff0000">&lt;IfModule mod_rewrite.c&gt;
            </font></p>
            <pre><font color="#ff0000"># 将 RewriteEngine 模式打开
            RewriteEngine On
            </font></pre>
            <pre><font color="#ff0000"># 修改以下语句中的 /molyx_board 为你的论坛目录地址，如果程序放在根目录中，请将
            /molyx_board 修改为 /
            RewriteBase /molyx_board/
            # Rewrite 系统规则请勿修改
            RewriteRule forum-([0-9]+)-([0-9]+)-([0-9]+).html forumdisplay.php?f=$1&amp;st=$3&amp;pp=$2&amp;$4
            RewriteRule forum-([0-9]+)-([0-9]+).html forumdisplay.php?f=$1&amp;pp=$2&amp;$3
            RewriteRule forum-([0-9]+)-(q?)-([0-9]+).html forumdisplay.php?f=$1&amp;filter=quintessence&amp;pp=$3
            RewriteRule forum-([0-9]+)-(q?).html forumdisplay.php?f=$1&amp;filter=quintessence
            RewriteRule forum-([0-9]+).html forumdisplay.php?f=$1
            RewriteRule thread-([0-9]+)-([0-9]+).html showthread.php?t=$1&amp;pp=$2&amp;$3
            RewriteRule thread-([0-9]+).html showthread.php?t=$1&amp;$2
            RewriteRule user-([0-9]+).html profile.php?u=$1
            RewriteRule archive/f-([0-9]+)-([0-9]+).html archive/index.php?f$1-$2.html
            RewriteRule archive/t-([0-9]+)-([0-9]+).html archive/index.php?t$1-$2.html</font></pre>
            <p><font color="#ff9900"><font color="#ff0000">&lt;/IfModule&gt;
            </font>
            </font></p>
            </pre>
            </pre>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/178769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-01 00:40 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/01/178769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>resin的session id reuse特性(1)--发现问题  </title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178767.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Thu, 31 Jan 2008 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178767.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/178767.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/178767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/178767.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/aoxj/archive/2007/12/17/168165.html">resin的session id reuse特性(1)--发现问题</a> </div>
&nbsp;&nbsp;&nbsp; 近期因工作需求探索apache + resin的多机负载分布和多个webapp统一认证的实现方案, 期间设计多个webapp统一认证的实现方案时, 发现resin下通过cookie来传递jsessionid和通过url重写将jsessionid放url中传递, 会有细微的差异. <br />
<br />
&nbsp;&nbsp;&nbsp; 注：后来研究发现是resin提供的session id reuse特性，只是此文第一次发布时我还不知道有此特性，惭愧。<br />
<br />
在servlet规范中，HttpServletSession的获取时通过调用request.getSession(boolean createnew)方法来实现，其实现机制可以简单的理解为: 存在一个大的hashMap结构，key就是jsessionid，而valule是HttpservletSession对象。request.getSession(boolean createnew)方法通过jsessionid来获取对应的HttpservletSession，如果不存在并且参数createnew=true，则创建一个新的HttpservletSession对象，并设置jsessionid=session.getId() ，保存到hashMap结构中。以后再传递这个jsessionid. （详细的过程比较复杂，各家的实现也不尽相同，但大体的实现原理是如此。）<br />
<br />
关注以下几点：<br />
一). 获取jsessionid<br />
&nbsp;&nbsp;&nbsp; jsessionid的传递可以是以下途径<br />
&nbsp;&nbsp;&nbsp; 1. 放在cookie中<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Cookie: JSESSIONID=abcrmF3Gx-5Z-hhkgHfzr<br />
<br />
&nbsp;&nbsp;&nbsp; 2. 以参数形式放在url<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://10.3.2.35:11280/wmail/welcome.action?jsessionid=abcQNqiT4C01rg-necLBr<br />
<br />
&nbsp;&nbsp;&nbsp; 3. 用form表单传递，通常是用隐藏域<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;input type="hidden" name="jsessionid" value="abcQNqiT4C01rg-necLBr"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 4. url重写<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://10.3.2.35:11280/jid=abcQNqiT4C01rg-necLBr/wmail/welcome.action<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://10.3.2.35:11280/wmail/welcome.action;jsessionid=abcQNqiT4C01rg-necLBr<br />
<br />
&nbsp;&nbsp;&nbsp; 如果当前还没有jsessionid则当然就无法获取，通常用户第一次访问或者登录前就是这种情况.<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 可以通过request.getRequestedSessionId() 方法来获取本次http 请求的jsessonid值。<br />
<br />
二）获取到的HttpServletSession对象<br />
<br />
&nbsp;&nbsp;&nbsp; 如果HttpServletSession对象是已经存在的，则<br />
&nbsp;&nbsp;&nbsp; 1. session.isNew()=false<br />
&nbsp;&nbsp;&nbsp; 2. request.getRequestedSessionId() == jsessionid == session.getId()<br />
<br />
&nbsp;&nbsp;&nbsp; 如果HttpServletSession对象是调用request.getSession(true) (简写的request.getSession()方法等同于request.getSession(true) )时新创建的，则有以下特征：<br />
&nbsp;&nbsp;&nbsp; 1. session.isNew()=true<br />
&nbsp;&nbsp;&nbsp; 2. 以后传递的jsessionid=session.getId()<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 注意这里，如果request.getRequestedSessionId() 是空值，情况比较简单，以后传递jsessionid=session.getId()就是了。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 但是如果request.getRequestedSessionId() 不是空值，通过这个值没有获取到已经存在的session对象，而是返回了一个新的session对象，这个时候新的session.getId()和原有的request.getRequestedSessionId() 关系如何呢？下面详细阐述这种情况。<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
三) request.getRequestedSessionId() 不是空值时，新的session.getId() = ?<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 1). 测试代码如下: <br />
&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();<br />
&nbsp;&nbsp;&nbsp; String jid1 = request.getRequestedSessionId();<br />
&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession(true);<br />
&nbsp;&nbsp;&nbsp; String jid2 = request.getRequestedSessionId();<br />
<br />
&nbsp;&nbsp;&nbsp; logger.info("get HttpSession , isNew()=" + session.isNew() <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " getId()=" + session.getId()<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " and jid1=" + jid1<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " and jid2=" + jid2);<br />
<br />
&nbsp;&nbsp;&nbsp; 其中jid1和jid2分别是调用request.getSession(true)方法前后的request.getRequestedSessionId()值。<br />
<br />
&nbsp;&nbsp;&nbsp; 在resin中运行以上代码，测试request.getRequestedSessionId() 不是空值而对应jsessionid的session不存在的情况。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2). 通过cookie来传递jsessionid的情况，测试结果如下：<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; get HttpSession, isNew()=true getId()=abcqIgQroQ2Ov9lGYcYAr and jid1=abcqIgQroQ2Ov9lGYcYAr and jid2=abcqIgQroQ2Ov9lGYcYAr<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; get HttpSession, isNew()=true getId()=abcPQ3mpxKz8H-4UMdYAr and jid1=abcPQ3mpxKz8H-4UMdYAr and jid2=abcPQ3mpxKz8H-4UMdYAr<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; get HttpSession, isNew()=true getId()=abcdeE3iDy_bI536tLYAr and jid1=abcdeE3iDy_bI536tLYAr and jid2=abcdeE3iDy_bI536tLYAr<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以发现以下规律：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.&nbsp; isNew()=true<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2. session.getId() == jid1 == jid2<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 即新创建的session会使用传递过来的jsessionid值，即使这个jsessionid值根本没有对应的session存在<br />
<br />
&nbsp;&nbsp;&nbsp; 3)&nbsp; 通过url重写，将jsessionid放url中传递, 测试结果如下：<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; get HttpSession, isNew()=true getId()=abccw1zEC_RcN43qHMYAr and jid1=abcdUdTfKuLbge8h_LYAr and jid2=abcdUdTfKuLbge8h_LYAr<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://10.3.2.35:11280/jid=abccw1zEC_RcN43qHMYAr/uab/contactList.action<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; get HttpSession, isNew()=true getId()=abcFK7yOB1irgaYqgNYAr and jid1=abci-HpMPJU3egCB7MYAr and jid2=abci-HpMPJU3egCB7MYAr<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://10.3.2.35:11280/jid=abcFK7yOB1irgaYqgNYAr/uab/contactList.action<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (后面的http地址为页面跳转完成后显示在浏览器地址框中的页面url)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以发现以下规律：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1. isNew()=true<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2. jid1 == jid2<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; request.getRequestedSessionId()值在request.getSession(true)方法调用前后无变化<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3. session.getId()&nbsp; != jid1<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 即新创建的session不使用传递过来的jsessionid值,而是采用新值<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 4. 跳转完成后的http地址中,使用的是session.getId(), 而不是原来通过url重写传递过来的jsessionid<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 此时新的jsessionid覆盖了旧有的jsessionid.<br />
<br />
&nbsp;&nbsp;&nbsp; 4) 总结<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在resin的实现中, 通过cookie来传递jsessionid的情况和通过url重写将jsessionid放url中传递, 会有细微的差异. <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 以上测试的resin版本为3.0.26, 稍后有时间考虑测试其他版本和tomcat.<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 这个差异直接影响到跨webapp的多个webapp直接相互传递jsessionid的方式, 通过cookie传递jsessionid可以做到多个webapp之间在页面跳转时始终是一个相同的jsessionid,这种各个应用都可以方便的获取到自己的HttpServletSession对象. 但是如果是通过url重写,则破坏了jsessonid的一致性, 逼迫各个webapp之间跳转时必须用其他额外的方法来保证传递给对方的jsessionid的准确性,因为此时每个webapp的jsessionid都不一样了,必须记住其他每个webapp的jsessionid，造成跨webapp的页面跳转极其复杂，难于接受. 
<img src ="http://www.blogjava.net/Jiangzy/aggbug/178767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-01 00:24 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/01/178767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2小结 </title><link>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178766.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Thu, 31 Jan 2008 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178766.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/178766.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/02/01/178766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/178766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/178766.html</trackback:ping><description><![CDATA[<p>1、在web.xml中EncodingFilter的位置应该在Struts2的FilterDispatcher之前，道理很简单，要先调整字符集，再进入Action。</p>
<p>2、如果使用Urlrewrite，要指定filter-mapping的dispatcher方式，如下 <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;Struts2&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; <br />
&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; <br />
&lt;/filter-mapping&gt;</p>
<p>3、在做上传文件的时候，要在web.xml中增加ActionContextCleanUp这个filter，如果不增加，会发生第一次上传取不到文件的情况 <br />
&lt;filter&gt; <br />
&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt; <br />
&lt;filter-class&gt;org.apache.struts2.dispatcher.ActionContextCleanUp&lt;/filter-class&gt; <br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
按照Struts2的API，filter的顺序是 <br />
struts-cleanup filter <br />
SiteMesh filter <br />
FilterDispatcher </p>
<p>4、在Apache+Resin的情况下，要在WEB-INF下增加resin-web.xml，该文件只针对Resin有效，作用是指定后缀与 Resin的Servlet引擎匹配，要不然从Apache转发过去的请求到Resin后会出现404的情况，resin-web.xml举例如下： <br />
&lt;web-app xmlns="http://caucho.com/ns/resin"&gt; <br />
&lt;servlet-mapping url-pattern='*.bbscs' servlet-name='plugin_match'/&gt; <br />
&lt;/web-app&gt;</p>
<p>5、在使用&lt;s:url/&gt;标签的时候，会出现将get或post数值带入url参数的情况，如果不需要这些参数，可以在struts.properties文件中设置 <br />
struts.url.includeParams=none <br />
或是在&lt;s:url/&gt;标记中将includeParams属性设为none <br />
另外还有两个值 <br />
all,是把get和post中的参数加入到url参数中 <br />
get,是只把get中的参数加入到url参数中 </p>
<p>6、与webwork基本相同，Struts2提供了几种ui.theme，有xhtml、css_xhtml、simple等等，在 struts.properties中可以设置使用何种theme，这一点很关键，不同的theme，struts的tag会生成不同的html代码，而 且在某些情况下这些theme不能满足页面要求，则需要自己进行扩展了，这些theme都是由freemarker写的，仿照这写就可以。</p>
<p>7、单个checkbox的标记库好像只能返回boolean的值，如果在数据库中设计为int型，则需要做一些转换，这一点我觉得不如Struts1.x的方便。</p>
<p>8、总体来说Struts2的标记库使用上比Struts1.x的方便，页面整体也比较简洁，Struts2采用stack的方式存取数据，与Struts1相比各有千秋吧。</p>
<p>Struts2主要延续自webwork，以前使用webwork的朋友转过来并不困难，Struts2的几个核心的部分，比如拦截器、Result Configuration、OGNL stack等等还是需要仔细的体会，深入了解，才能做出优秀的系统。</p>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/178766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-02-01 00:23 <a href="http://www.blogjava.net/Jiangzy/archive/2008/02/01/178766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js压缩</title><link>http://www.blogjava.net/Jiangzy/archive/2008/01/25/177858.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Fri, 25 Jan 2008 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/01/25/177858.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/177858.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/01/25/177858.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/177858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/177858.html</trackback:ping><description><![CDATA[<p>压缩不仅仅可以提高用户的下载速度，同时还可以加密代码，下面说下一个常用的js压缩方法：</p>
<p>首先使用dojo的工具shrinksafe(http://shrinksafe.dojotoolkit.org/)压缩一下,dojo的这个工具会去掉注释，他的压缩不是简单的替换变量，而是利用了mozilla的一个工具,对js解析后才压缩，确保压缩后的代码不会出错。</p>
<p>dojo压缩后，并不会减少太多，下一步可以使用http://javascriptcompressor.com/这个站点进行更高层次的压缩,可惜只能登陆这个站点再压缩，只能将你的js代码复制的他的文本框，然后等他的压缩输出</p>
<p>经过这2步，你的js会变得既安全,文件又小 <br />
</p>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/177858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-01-25 23:11 <a href="http://www.blogjava.net/Jiangzy/archive/2008/01/25/177858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss下数据库连接的密码加密</title><link>http://www.blogjava.net/Jiangzy/archive/2008/01/08/173531.html</link><dc:creator>飛雪(leo)</dc:creator><author>飛雪(leo)</author><pubDate>Tue, 08 Jan 2008 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/Jiangzy/archive/2008/01/08/173531.html</guid><wfw:comment>http://www.blogjava.net/Jiangzy/comments/173531.html</wfw:comment><comments>http://www.blogjava.net/Jiangzy/archive/2008/01/08/173531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jiangzy/comments/commentRss/173531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jiangzy/services/trackbacks/173531.html</trackback:ping><description><![CDATA[<p>1.先来看一个普通的数据源配置文件 <br />
Java代码 <br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;&nbsp;&nbsp; <br />
&lt;datasources&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;local-tx-datasource&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt;&nbsp;&nbsp; //jndi名字&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;use-java-context&gt;false&lt;/use-java-context&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://10.16.175.137:3306/test&lt;/connection-url&gt;&nbsp; //URL地址&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;&nbsp; //驱动&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;user-name&gt;root&lt;/user-name&gt;&nbsp;&nbsp;&nbsp; //用户名&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;123456&lt;/password&gt;&nbsp; //密码&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;exception-sorter-class-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exception-sorter-class-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;metadata&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/local-tx-datasource&gt;&nbsp;&nbsp; <br />
&lt;/datasources&gt;&nbsp; </p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;datasources&gt;<br />
&nbsp; &lt;local-tx-datasource&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt;&nbsp;&nbsp; //jndi名字<br />
&nbsp;&nbsp;&nbsp; &lt;use-java-context&gt;false&lt;/use-java-context&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://10.16.175.137:3306/test&lt;/connection-url&gt;&nbsp; //URL地址<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;&nbsp; //驱动<br />
&nbsp;&nbsp;&nbsp; &lt;user-name&gt;root&lt;/user-name&gt;&nbsp;&nbsp;&nbsp; //用户名&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;123456&lt;/password&gt;&nbsp; //密码<br />
&nbsp;&nbsp;&nbsp; &lt;exception-sorter-class-name&gt;<br />
&nbsp;&nbsp;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exception-sorter-class-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;metadata&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br />
&nbsp; &lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</p>
<p><br />
看一下这个文件,里面用户名与密码都是以明文方式存储的,这样子对系统的安全而言带来了极大的威协。所以我们要为我们这个明文的密码加一下密,这就是本文的目的. <br />
2.说到密码加密，这里我们用到了JBoss下的一个类org.jboss.resource.security.SedureIdentityLoginModule,看看我们该如何用它来帮我们的密码加密。 </p>
<p>先看个配置数据源的例子(mysql-ds.xml)： </p>
<p>Java代码 <br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;&nbsp;&nbsp; <br />
&lt;datasources&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;local-tx-datasource&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;use-java-context&gt;false&lt;/use-java-context&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://192.168.1.91:3306/atteam&lt;/connection-url&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;security-domain&gt;EncryptDBPassword&lt;/security-domain&gt;//这里不用写上你的用户名与密码了，我们可以在login-config.xml里做点手脚，就OK了&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;metadata&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/local-tx-datasource&gt;&nbsp;&nbsp; <br />
&lt;/datasources&gt;&nbsp; </p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;datasources&gt; <br />
&nbsp; &lt;local-tx-datasource&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;use-java-context&gt;false&lt;/use-java-context&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://192.168.1.91:3306/atteam&lt;/connection-url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;security-domain&gt;EncryptDBPassword&lt;/security-domain&gt;//这里不用写上你的用户名与密码了，我们可以在login-config.xml里做点手脚，就OK了<br />
&nbsp;&nbsp;&nbsp; &lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;metadata&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br />
&nbsp; &lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</p>
<p>接着我们修改server\default\conf\login-config.xml文件,加上下面这一段配置文件 </p>
<p>Java代码 <br />
&lt;application-policy name="EncryptDBPassword"&gt; //这里的name应该是你在配置数据源时写的security-domain里的字符串&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;authentication&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;login-module code="org.jboss.resource.security.SecureIdentityLoginModule"&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag="required"&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="username"&gt;test&lt;/module-option&gt; //数据库的用户名&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="password"&gt;64c5fd2979a86168&lt;/module-option&gt; //数据库的密码，不过是加密过的了&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="managedConnectionFactoryName"&gt;jboss.jca:service=LocalTxCM,name=MySqlDS&lt;/module-option&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意name等于你的数据源的jndi-name,这里是MySqlDS&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/login-module&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/authentication&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;/application-policy&gt;&nbsp; </p>
<p>&nbsp;&lt;application-policy name="EncryptDBPassword"&gt; //这里的name应该是你在配置数据源时写的security-domain里的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;authentication&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;login-module code="org.jboss.resource.security.SecureIdentityLoginModule" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag="required"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="username"&gt;test&lt;/module-option&gt; //数据库的用户名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="password"&gt;64c5fd2979a86168&lt;/module-option&gt; //数据库的密码，不过是加密过的了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="managedConnectionFactoryName"&gt;jboss.jca:service=LocalTxCM,name=MySqlDS&lt;/module-option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意name等于你的数据源的jndi-name,这里是MySqlDS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/login-module&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/authentication&gt;<br />
&nbsp; &lt;/application-policy&gt;</p>
<p>3.补充一下，这个加密的密码是哪来的（呵呵，忘了说了） </p>
<p>java -cp "D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\lib\jboss-jmx.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\lib\jboss-common.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\lib\jboss-jca.jar;D:\TDdownload\jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\lib\jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule 123456 </p>
<p>Encoded password: 64c5fd2979a86168 </p>
<p>写上你自己的路径和你要加密的密码就行了,我这里要加密的密码是123456,加密过之后就是64c5fd2979a86168 <br />
</p>
<img src ="http://www.blogjava.net/Jiangzy/aggbug/173531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jiangzy/" target="_blank">飛雪(leo)</a> 2008-01-08 09:35 <a href="http://www.blogjava.net/Jiangzy/archive/2008/01/08/173531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>