??xml version="1.0" encoding="utf-8" standalone="yes"?>AV激情亚洲男人的天堂国语,亚洲区日韩区无码区,国产亚洲精品资源在线26uhttp://m.tkk7.com/1504/category/32240.html不轻易服?不轻a攑ּ.--心是梦的舞台Q心有多大,舞台有多大。踏t实实做事,认认真真做h?/description>zh-cnMon, 22 Mar 2010 20:51:44 GMTMon, 22 Mar 2010 20:51:44 GMT60使用Struts的Token机制解决表单的重复提交【收藏?/title><link>http://m.tkk7.com/1504/archive/2009/04/13/265329.html</link><dc:creator>weesun一c阳?/dc:creator><author>weesun一c阳?/author><pubDate>Mon, 13 Apr 2009 09:13:00 GMT</pubDate><guid>http://m.tkk7.com/1504/archive/2009/04/13/265329.html</guid><wfw:comment>http://m.tkk7.com/1504/comments/265329.html</wfw:comment><comments>http://m.tkk7.com/1504/archive/2009/04/13/265329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/1504/comments/commentRss/265329.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/1504/services/trackbacks/265329.html</trackback:ping><description><![CDATA[来源Q?a href="http://m.tkk7.com/pdw2009/archive/2006/04/09/40094.html">http://m.tkk7.com/pdw2009/archive/2006/04/09/40094.html</a> <div><span style="color: #4b4b4b; font-family: Verdana; font-size: 13px; line-height: 19px; "> <p>首先必须要通过一个Action再{向那个添加记录的面,转向函数如下.<br /> <br />  public ActionForward tokenTest(<br />    ActionMapping mapping,<br />    ActionForm form,<br />    HttpServletRequest request,<br />    HttpServletResponse response) throws Exception {<br />   saveToken(request);//把一个token ID保存到Session,q在且要转到的页?br />        //?lt;html:form>中添加一?lt;input type="hideen">的标{?<br />   return mapping.findForward("add");<br />  }<br /> <br /> <br /> 一个输出入面如容如下:<br /> <br /> <%@ page language="java" pageEncoding="UTF-8"%></p> <p><%@ taglib uri="<a style="color: #1a8bc8; text-decoration: none; ">http://struts.apache.org/tags-bean</a>" prefix="bean" %><br /> <%@ taglib uri="<a style="color: #1a8bc8; text-decoration: none; ">http://struts.apache.org/tags-html</a>" prefix="html" %><br /> <%@ taglib uri="<a style="color: #1a8bc8; text-decoration: none; ">http://struts.apache.org/tags-logic</a>" prefix="logic" %><br /> <%@ taglib uri="<a style="color: #1a8bc8; text-decoration: none; ">http://struts.apache.org/tags-tiles</a>" prefix="tiles" %></p> <p><br /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /> <html:html lang="true"><br />   <head><br />     <html:base /><br />     <br />     <title>tokentest.jsp</title><br />     <br />     <meta http-equiv="pragma" content="no-cache"><br />     <meta http-equiv="cache-control" content="no-cache"><br />     <meta http-equiv="expires" content="0">    <br />     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><br />     <meta http-equiv="description" content="This is my page"><br />   </head><br />   <br />   <body><br />       <br><br />       <logic:present name="error"><br />          <pre style="color:#ff2255"><bean:write name="error"/></pre><br />       </logic:present><br />       <center><br />       <html:form action="/insert.do" method="post"><br />         <table border="0" cellspacing="0" ><br />           <tr><br />             <td width="30%">用户?lt;/td><br />             <td width="70%"><html:text property="username"/></td><br />           </tr><br />           <tr><br />             <td>地址:</td><br />             <td><html:text property="address"/></td><br />           </tr><br />           <tr><br />             <td colspan="2"><html:submit value="提交"/></td><br />           </tr><br />         </table><br />        </html:form><br />       </center><br />   </body><br /> </html:html><br /> 面的处理Action内容如下:<br />    public ActionForward execute(<br />   ActionMapping mapping,<br />   ActionForm form,<br />   HttpServletRequest request,<br />   HttpServletResponse response) {<br />   TokenTestForm tokenTestForm = (TokenTestForm) form;<br />   if(!isTokenValid(request)){ //重复提交<br />    request.setAttribute("error","不能得复提交!!!");<br />    //saveToken(request); 重新生成tokenid,<br />    return mapping.findForward("return");<br />   }else{<br />    resetToken(request);<br />   }<br />   //执行相关操作<br />   System.out.println(tokenTestForm.getUsername()+"--"+tokenTestForm.getAddress());<br />   return mapping.findForward("ok");<br />  }<br /> <br /> x已完?至于原理,p己去查一些资料就完全明白?...<br /> </p> <p><br /> </p> <p>2.来源<a >http://www2.cnblogs.com/snoopy/articles/54699.html</a></p> <p> </p> <h2><a id="AjaxHolder_ctl01_TitleUrl" >使用Struts的Token机制解决表单的重复提?/a> </h2> <div id="k24s6ke" class="postbody"> <h3 class="title">前几天被q个问题困扰了,在Google中搜“表单重复提交”Q也搜到不少资料Q但有的讲的不是很清楚,所以走了些弯\Q现在写下来Q不能算原创吧?/h3> <br /> <p>Struts的TokenQo牌)机制能够很好的解册单重复提交的问题Q基本原理是Q服务器端在处理到达的请求之前,会将<em>h中包含的令牌?/em>与保存在当前用户会话中的令牌D行比较,看是否匹配。在处理完该h后,且在{复发送给客户端之前,会产生一个新的o牌,该o牌除传给客户端以外,也会用户会话中保存的旧的o牌进行替换。这样如果用户回退到刚才的提交面q再ơ提交的话,客户端传q来的o牌就和服务器端的令牌不一_从而有效地防止了重复提交的发生?/p> <br /> <p>q时其实也就是两点,W一Q你需要在h中有q个令牌|h中的令牌值如何保存,其实和我们qx在页面中保存一些信息是一LQ通过隐藏字段来保存,保存的Ş式如Q? 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,q个value是TokenProcessorcM的generateToken()获得的,是根据当前用Lsession id和当前时间的long值来计算的。第二:在客L提交后,我们要根据判断在h中包含的值是否和服务器的令牌一_因ؓ服务器每ơ提交都会生成新的TokenQ所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交?/p> <br /> <p>在Action中的addҎ中,我们需要将Token值明的要求保存在页面中Q只需增加一条语句:saveToken(request);Q如下所C: <br /> <font color="red">public ActionForward add(ActionMapping mapping, ActionForm form, <br /> HttpServletRequest request, HttpServletResponse response)<br /> //前面的处理省?br /> saveToken(request);<br /> return mapping.findForward("add");<br /> }</font>在Action的insertҎ中,我们Ҏ表单中的Tokeng服务器端的Token值比较,如下所C:<br /> <font color="red">public ActionForward insert(ActionMapping mapping, ActionForm form, <br /> HttpServletRequest request, HttpServletResponse response)<br /> if (isTokenValid(request, true)) {<br /> // 表单不是重复提交<br /> //q里是保存数据的代码<br /> } else {<br /> //表单重复提交<br /> saveToken(request);<br /> //其它的处理代?br /> }<br /> }</font></p> </div> <p> 说明Q在前一个{向提交信息的面需?span style="color: #ff0000; ">saveToken(request);</span></p> <p><font color="#FF0000">在保存页面?/font></p> <p><font color="#FF0000"> <p>        <span id="4mk4q2m" class="Apple-tab-span" style="white-space:pre"> </span>if(!isTokenValid(request))</p> <p>        <span id="issom4q" class="Apple-tab-span" style="white-space:pre"> </span>{ //重复提交</p> <p>        <span id="2g4u44g" class="Apple-tab-span" style="white-space:pre"> </span>    System.out.println("重复提交");</p> <p><br /> </p> <p>        <span id="2i4gmw2" class="Apple-tab-span" style="white-space:pre"> </span>   System.out.println("能得复提?!!");</p> <p>        <span id="qeamw4a" class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p>        <span id="q6cqk4a" class="Apple-tab-span" style="white-space:pre"> </span>else</p> <p>        <span id="44m4aqe" class="Apple-tab-span" style="white-space:pre"> </span>{</p> <p>                request.setAttribute("saveInfo", info);</p> <p>                logger.debug("save successful");</p> <p>                resetToken(request); //删除session中的令牌 </p> <p>        <span id="k4m42ca" class="Apple-tab-span" style="white-space:pre"> </span>ward=mapping.findForward("notice")Q?/p> <p>        <span id="wkeyi4y" class="Apple-tab-span" style="white-space:pre"> </span>}</p> </font></p> </span></div> <img src ="http://m.tkk7.com/1504/aggbug/265329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/1504/" target="_blank">weesun一c阳?/a> 2009-04-13 17:13 <a href="http://m.tkk7.com/1504/archive/2009/04/13/265329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts中Action传参?[ȝ]http://m.tkk7.com/1504/archive/2009/02/22/256101.htmlweesun一c阳?/dc:creator>weesun一c阳?/author>Sun, 22 Feb 2009 11:47:00 GMThttp://m.tkk7.com/1504/archive/2009/02/22/256101.htmlhttp://m.tkk7.com/1504/comments/256101.htmlhttp://m.tkk7.com/1504/archive/2009/02/22/256101.html#Feedback0http://m.tkk7.com/1504/comments/commentRss/256101.htmlhttp://m.tkk7.com/1504/services/trackbacks/256101.html

public ActionForward userSave(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  UserForm userForm = (UserForm) form;

  return mapping.findForward("userSave");
 }

//传参?br />  public ActionForward userSave(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  UserForm userForm = (UserForm) form;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 String path = mapping.findForward("delete").getPath();

  //TODO: d本Action所有的h参数Q将path重新构造,加上h参数

  ActionForward forward= new ActionForward(path+"&pageId=1");
  forward.setRedirect(true);
//传参数后q回
  return forward;

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 // return mapping.findForward("userSave");
 }




]]>
bean:define id的用[ȝ]http://m.tkk7.com/1504/archive/2009/02/22/256099.htmlweesun一c阳?/dc:creator>weesun一c阳?/author>Sun, 22 Feb 2009 11:40:00 GMThttp://m.tkk7.com/1504/archive/2009/02/22/256099.htmlhttp://m.tkk7.com/1504/comments/256099.htmlhttp://m.tkk7.com/1504/archive/2009/02/22/256099.html#Feedback0http://m.tkk7.com/1504/comments/commentRss/256099.htmlhttp://m.tkk7.com/1504/services/trackbacks/256099.html<bean:define   id="pagename"   name="requestName"/>  
   
  id:指的是这个bean的唯一名字(可以自由定义或者说可以自定义但是必d一)Q在q里定义的id="pagename" ,在要调用的网里面可以随便的使用和访?  
  name:指的是从上一个页面或者action里面传过来的变量Q可以是Mcd?例如再上一|页定义request.setAttribute("requestName", requestName);)  
  例如Q? 
      我有一个Bean对象User对象Q这个里面保存了admin理员的个h信息Q姓?name)Q性别(sex)、年?age)那么怎么用呢? 
  在action里面你可以把User对象传过? 
  request.setAttribute("user",User);  
  在页? 
  <bean:define   id="admin"   name="user"./>  
  然后可以和bean:write搭配使用  
  <bean:write   name="admin"   property="name"/>  
  <bean:write   name="admin"   property="sex"/>  
  <bean:write   name="admin"   property="age"/>

]]>
AJAX和Struts的action交互使用[原创ȝ]http://m.tkk7.com/1504/archive/2009/02/22/256094.htmlweesun一c阳?/dc:creator>weesun一c阳?/author>Sun, 22 Feb 2009 11:34:00 GMThttp://m.tkk7.com/1504/archive/2009/02/22/256094.htmlhttp://m.tkk7.com/1504/comments/256094.htmlhttp://m.tkk7.com/1504/archive/2009/02/22/256094.html#Feedback1http://m.tkk7.com/1504/comments/commentRss/256094.htmlhttp://m.tkk7.com/1504/services/trackbacks/256094.html1.h面的JS,客户端实?br /> <script type="text/javascript">
 var flagvalue=0;
 var rest="";
 var resta="";
 //实现AJAX验证
 var http_request = false;
 var infoForm_flag=false;
 var lotId="";
function Save()
{
   
      var infoForm=document.projectSetForm;
      infoForm_flag=infoForm;
      lotId=infoForm.lotId.value;
      //表名U?br />       var dc = infoForm.tablename.value;
      if(dc==""||dc==null){
       alert("表名UC能ؓI?");
       infoForm.tablename.focus();
       infoForm.tablename.select();
       return false;
 }
function send_request(url)
  {//初始化、指定处理函数、发送请求的函数
    http_request = false;
    //开始初始化XMLHttpRequest对象
    if(window.XMLHttpRequest)
    { //Mozilla 览?br />       http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {//讄MiMEcd
           http_request.overrideMimeType('text/xml');
      }
    }
    else if (window.ActiveXObject)
    { // IE览?br />       try
      {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
       catch (e)
      {
        try
        {
             http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e)
        {
        }
      }
    }
    if (!http_request) { // 异常Q创建对象实例失?br />      window.alert("不能创徏XMLHttpRequest对象实例.");
     return false;
    }
    http_request.onreadystatechange = processRequest;
    // 定发送请求的方式和URL以及是否同步执行下段代码
    http_request.open("GET", url, true);
    http_request.send(null);
  }
     //处理q回信息的函?br />      function processRequest()
     {
         if (http_request.readyState == 4)
         {
             //判断对象状?br />              if (http_request.status == 200)
             {
                 //信息已经成功q回Q开始处理信?br />                  var str=http_request.responseText;//获得从服务器q回的文本信?br />                  if(str=="no")
                 {
                     alert("您选择了模型分属不同的模板,请选择同一模板对应是模?");
                     //return false;
                     infoForm_flag.action="projectSet.do?do=add&lotId="+lotId;
                     infoForm_flag.submit();
                 }
                 else
                 {
                  infoForm_flag.action="projectSet.do?do=creattable&save=-1";
               infoForm_flag.submit();
              }
             } else
             {
                 //面不正?br />                  alert("您所h的页面有异常?);
             }
         }
     }
  function userCheck()
  {
    send_request('projectSet.do?do=check&rest='+rest);
  }
</script>
2.ProjectSetAction.java

package com.gpdi.softevaluate.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProjectSetAction extends DispatchAction
{
         

/**
  * <p>模板验证</p>
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return
  * @throws Exception
  */
 public ActionForward check(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
 {
   String rest="";
   String lotId="";
   String retn="";
   String flag="";
   CommDaoFactory mgObj = new CommDaoFactory();
   try
   {
       rest=request.getParameter("rest");
       lotId=request.getParameter("lotId");
   }
   catch(Exception e)
   {
   
   }
if(!rest.equals("0")||!rest.equals("")||rest!=null)
 {
     flag="no";
}
else
{
      flag="ok";

}
       PrintWriter out=response.getWriter();
//服务器返回信?br />        out.write(flag);
       out.close();
     //d本Action所有的h参数Q将path重新构造,加上h参数

     //ActionForward forward= new ActionForward("project/projectSet.do?do=add&lotId=6");
     //forward.setRedirect(true);
      //传参数后q回
     //return forward;    
    return mapping.findForward(null);
 
 }
public ActionForward creattable(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
{
     //实现功能代码
return mapping.findForward("create");
}

}
3.struts.config.xml
 <action attribute="projectSetForm" name="projectSetForm"
    parameter="do" path="/project/projectSet" scope="request"
       type="com.gpdi.softevaluate.action.ProjectSetAction" validate="false">
   <forward name="list" path="/project/viewProject.jsp" />
   <forward name="add" path="/project/addProject.jsp" />
   <forward name="create" path="/project/createTable.jsp" />
  </action>



]]>
DWR与Struts整合2007-08-07 【收藏?/title><link>http://m.tkk7.com/1504/archive/2008/08/03/219703.html</link><dc:creator>weesun一c阳?/dc:creator><author>weesun一c阳?/author><pubDate>Sun, 03 Aug 2008 07:34:00 GMT</pubDate><guid>http://m.tkk7.com/1504/archive/2008/08/03/219703.html</guid><wfw:comment>http://m.tkk7.com/1504/comments/219703.html</wfw:comment><comments>http://m.tkk7.com/1504/archive/2008/08/03/219703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/1504/comments/commentRss/219703.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/1504/services/trackbacks/219703.html</trackback:ping><description><![CDATA[<div id="a2cq2ee" class="postText">1.下載DWR Version 2 <br /> <a class="ilink" target="_blank">https://dwr.dev.java.net/files/documents/2427/47504/dwr.jar</a> <br /> <br /> 2.安裝DWR,把dwr.jar攑ֈWEB-INF/lib?<br /> <br /> web.xml中加入DWRServlet & ActionServlet <br /> 其中<load-on-startup>的部分要特別注意,ActionServlet要先初始?所以數字要比較? <br /> <pre> <servlet> </pre> <pre><servlet-name>action</servlet-name> </pre> <pre><servlet-class>org.apache.struts.action.ActionServlet</pre> <pre></servlet-class> </pre> <pre><init-param> </pre> <pre><param-name>config</param-name> </pre> <pre><param-value>/WEB-INF/struts-config.xml</param-value> </pre> <pre></init-param> </pre> <pre><init-param> </pre> <pre><param-name>debug</param-name> </pre> <pre><param-value>2</param-value> </pre> <pre></init-param> </pre> <pre><load-on-startup>2</load-on-startup> </pre> <pre></servlet> </pre> <pre><servlet-mapping> </pre> <pre><servlet-name>action</servlet-name> </pre> <pre><url-pattern>*.do</url-pattern> </pre> <pre></servlet-mapping> </pre> <pre><servlet> </pre> <pre><servlet-name>dwr-invoker</servlet-name> </pre> <pre><servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> </pre> <pre><init-param> </pre> <pre><param-name>debug</param-name> </pre> <pre><param-value>true</param-value> </pre> <pre></init-param> </pre> <pre><load-on-startup>10</load-on-startup> </pre> <pre></servlet> </pre> <pre><servlet-mapping> </pre> <pre> <servlet-name>dwr-invoker</servlet-name> </pre> <pre><url-pattern>/dwr<font class="java-comment" color="#006400">/*</url-pattern> </font></pre> <pre><font class="java-comment" color="#006400"></servlet-mapping></font><br /> dwr.xml中加入struts的設?其中formBean的參數的value?會對應到struts-config.xml?lt;form-beans>的設?</pre> <pre><dwr>  <pre><allow> </pre> <pre><create creator=<font class="java-string" color="#000080">"struts"</font> javascript=<font class="java-string" color="#000080">"testFrm"</font>> </pre> <pre><param name=<font class="java-string" color="#000080">"formBean"</font> value=<font class="java-string" color="#000080">"testActionForm"</font>/> </pre> <pre></create> </pre> <pre></allow> </pre> <pre></dwr> </pre> <pre><br /> <br /> struts-config.xml </pre> <pre> </pre> <pre> <pre><struts-config> </pre> <pre><form-beans> </pre> <pre><form-bean name=<font class="java-string" color="#000080">"testActionForm"</font> type=<font class="java-string" color="#000080">"test.struts.testActionForm"</font> /> </pre> <pre></form-beans> </pre> <pre><action-mappings> </pre> <pre><action name=<font class="java-string" color="#000080">"testActionForm"</font> path=<font class="java-string" color="#000080">"/testAction"</font> scope=<font class="java-string" color="#000080">"session"</font> type=<font class="java-string" color="#000080">"test.struts.testAction"</font> validate=<font class="java-string" color="#000080">"false"</font>> </pre> <pre><forward name=<font class="java-string" color="#000080">"display"</font> path=<font class="java-string" color="#000080">"/display.jsp"</font> /> </pre> <pre></action> </pre> <pre></action-mappings> </pre> <pre><message-resources parameter=<font class="java-string" color="#000080">"ApplicationResources"</font> /></pre> <pre></struts-config></pre> <pre><br /> <br /> testActionForm.java,getDate()會透過dwr,取得珑֜最新的日期 </pre> <pre> </pre> <pre> <pre><font class="java-reserved_word" color="#000080"><strong>package</strong></font> test.struts; </pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.*;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> java.util.*; </pre> <pre><font class="java-reserved_word" color="#000080"><strong>public</strong></font> <font class="java-reserved_word" color="#000080"><strong>class</strong></font> testActionForm <font class="java-reserved_word" color="#000080"><strong>extends</strong></font> ActionForm <font class="java-bracket" color="#000080">{</font>  </pre> <pre><font class="java-reserved_word" color="#000080"><strong>private</strong></font> String strDate;  </pre> <pre><font class="java-reserved_word" color="#000080"><strong>public</strong></font> <font class="java-reserved_word" color="#000080"><strong>void</strong></font> setStrDate(String strDate) <font class="java-bracket" color="#000080">{</font> </pre> <pre>this.strDate = strDate; </pre> <pre><font class="java-bracket" color="#000080">}</font>  </pre> <pre><font class="java-reserved_word" color="#000080"><strong>public</strong></font> String getStrDate() <font class="java-bracket" color="#000080">{</font> </pre> <pre><font class="java-reserved_word" color="#000080"><strong>return</strong></font> strDate; </pre> <pre><font class="java-bracket" color="#000080">}</font>  </pre> <pre> <font class="java-comment" color="#006400">//dwr</font> <font class="java-reserved_word" color="#000080"><strong>public</strong></font> String getDate() <font class="java-bracket" color="#000080">{</font> </pre> <pre>Date date = <font class="java-reserved_word" color="#000080"><strong>new</strong></font> Date(); </pre> <pre><font class="java-reserved_word" color="#000080"><strong>return</strong></font> date.toString(); </pre> <pre> <font class="java-bracket" color="#000080">}</font> </pre> <pre><font class="java-bracket" color="#000080">}</font></pre> </pre> </pre> </pre> <pre><br /> <br /> testAction.java </pre> <pre> <pre><font class="java-reserved_word" color="#000080"><strong>package</strong></font> test.struts; </pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.ActionMapping;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.ActionForm;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> javax.servlet.http.HttpServletRequest;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> javax.servlet.http.HttpServletResponse;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.ActionForward;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.Action;</pre> <pre><font class="java-reserved_word" color="#000080"><strong>import</strong></font> org.apache.struts.action.*; </pre> <pre><font class="java-reserved_word" color="#000080"><strong>public</strong></font> <font class="java-reserved_word" color="#000080"><strong>class</strong></font> testAction <font class="java-reserved_word" color="#000080"><strong>extends</strong></font> Action <font class="java-bracket" color="#000080">{</font> </pre> <pre> <font class="java-reserved_word" color="#000080"><strong>public</strong></font> ActionForward execute(ActionMapping mapping, ActionForm form, </pre> <pre>HttpServletRequest request, </pre> <pre>HttpServletResponse response) <font class="java-bracket" color="#000080">{</font>  </pre> <pre>testActionForm actionForm = (testActionForm) form; </pre> <pre> System.out.println(actionForm.getStrDate()); </pre> <pre><font class="java-reserved_word" color="#000080"><strong>return</strong></font> mapping.findForward(<font class="java-string" color="#000080">"display"</font>); </pre> <pre><font class="java-bracket" color="#000080">}</font></pre> <pre><font class="java-bracket" color="#000080">}</font></pre> <br /> </pre> <pre></pre> <pre><br /> date.jsp,在form的部?請用struts ?tag library,我把<html:text property="strDate" size="30" >Ҏ<input type="text" name="strDate">?無法正常的接受到? </pre> <pre> <pre><%@ page contentType=<font class="java-string" color="#000080">"text/html; charset=Big5"</font> %></pre> <pre><%@ taglib uri=<font class="java-string" color="#000080">"/WEB-INF/struts-bean.tld"</font> prefix=<font class="java-string" color="#000080">"bean"</font> %></pre> <pre><%@ taglib uri=<font class="java-string" color="#000080">"/WEB-INF/struts-html.tld"</font> prefix=<font class="java-string" color="#000080">"html"</font> %></pre> <pre><%@ taglib uri=<font class="java-string" color="#000080">"/WEB-INF/struts-logic.tld"</font> prefix=<font class="java-string" color="#000080">"logic"</font> %></pre> <pre><html><head></pre> <pre><title>title</title> </pre> <pre><script type=<font class="java-string" color="#000080">'text/javascript'</font> src=<font class="java-string" color="#000080">'dwr/interface/testFrm.js'</font>></script> </pre> <pre><script type=<font class="java-string" color="#000080">'text/javascript'</font> src=<font class="java-string" color="#000080">'dwr/engine.js'</font>></script> </pre> <pre><script type=<font class="java-string" color="#000080">'text/javascript'</font> src=<font class="java-string" color="#000080">'dwr/util.js'</font>></script></pre> <pre></head></pre> <pre><SCRIPT LANGUAGE=<font class="java-string" color="#000080">"JavaScript"</font> type=<font class="java-string" color="#000080">""</font>> </pre> <pre>function refreshDate() <font class="java-bracket" color="#000080">{</font> </pre> <pre> testFrm.getDate(populateDate)</pre> <pre>;<font class="java-bracket" color="#000080">}</font> </pre> <pre>function populateDate(data)<font class="java-bracket" color="#000080">{</font> </pre> <pre>DWRUtil.setValue(<font class="java-string" color="#000080">'strDate'</font>, data);</pre> <pre><font class="java-bracket" color="#000080">}</font> </pre> <pre></script> </pre> <pre><body> </pre> <pre><html:form action=<font class="java-string" color="#000080">"testAction.do"</font>></pre> <pre>dateQ?lt;html:text property=<font class="java-string" color="#000080">"strDate"</font> size=<font class="java-string" color="#000080">"30"</font> ></html:text> </pre> <pre><input type=<font class="java-string" color="#000080">"button"</font> onclick=<font class="java-string" color="#000080">"refreshDate();"</font> value=<font class="java-string" color="#000080">"更新日期"</font>/><br/>  </pre> <pre><html:submit>送出 </html:submit></pre> <pre></html:form></body></html></pre> <br /> </pre> <pre><br /> <br /> display.jsp </pre> <pre> <pre><%@ page contentType=<font class="java-string" color="#000080">"text/html; charset=Big5"</font> %></pre> <pre><%@ taglib uri=<font class="java-string" color="#000080">"/WEB-INF/struts-bean.tld"</font> prefix=<font class="java-string" color="#000080">"bean"</font> %></pre> <pre><a href="mailto:%@page%20import=">%@page import=<font class="java-string" color="#000080">"test.struts.*"</font>%</a></pre> <pre><html></pre> <pre><head></pre> <pre><title>test</title></pre> <pre></head><body bgcolor=<font class="java-string" color="#000080">"#ffffff"</font>><h1>您送出的日?<br></pre> <pre><bean:write name=<font class="java-string" color="#000080">"testActionForm"</font> property=<font class="java-string" color="#000080">"strDate"</font>/></h1></pre> <pre></body></pre> <pre></html></pre> <br /> </pre> <pre></pre> <pre> <br /> <br /> </pre> <p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1621900</p> <br /> </div> <div id="o4mqkua" class="postFoot"><script src="http://localhost:82/PromoteIcon.aspx?id=1621900"></script>[<a title="功能强大的网l收藏夹Q一U钟操作可以轻村֮C存带来的价倹{分享带来的快乐" href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏到我的网?/a>]   会上树的猪发表于 2007q?5?3?09:24:00 </div> <img src ="http://m.tkk7.com/1504/aggbug/219703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/1504/" target="_blank">weesun一c阳?/a> 2008-08-03 15:34 <a href="http://m.tkk7.com/1504/archive/2008/08/03/219703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts+hibernate+spring+dwr的一个小的DEMO【收藏?/title><link>http://m.tkk7.com/1504/archive/2008/08/03/219702.html</link><dc:creator>weesun一c阳?/dc:creator><author>weesun一c阳?/author><pubDate>Sun, 03 Aug 2008 07:31:00 GMT</pubDate><guid>http://m.tkk7.com/1504/archive/2008/08/03/219702.html</guid><wfw:comment>http://m.tkk7.com/1504/comments/219702.html</wfw:comment><comments>http://m.tkk7.com/1504/archive/2008/08/03/219702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/1504/comments/commentRss/219702.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/1504/services/trackbacks/219702.html</trackback:ping><description><![CDATA[<p>最q无聊,做了一?span class="hilite1">DWR</span>的验证和<font face="Arial">eXtremeTable的应用的例子</font></p> <p>前期的系l创建、struts、hibernate、spring的集成工作就不用说了Q一路下?#8230;………</p> <p>主要?span class="hilite1">DWR</span>的应用,它用于表单验证:</p> <p>1、先看它的配|:</p> <p>Q?Q在web.xml里加上:</p> <div id="ou2giso" class="code_title">xml 代码</div> <div id="kgyk2gw" class="dp-highlighter"> <div id="yossugu" class="bar"></div> <ol class="dp-xml"> <li id="yisegom" class="alt">  <span id="i2qqssy" class="tag"><<span id="24q444e" class="tag-name">servlet</span><span id="mo2ss2u" class="tag">></span>  </span> </li> <li id="cu4yq4c" class="">   <span id="cuqkcc2" class="tag"><</span><span id="2c62244" class="tag-name">servlet-name</span><span id="ai2w44u" class="tag">></span><span id="as242yw" class="hilite1">dwr-invoker</span><span id="224y4uu" class="tag"><span id="mc4g42w" class="tag-name">servlet-name</span><span id="2eik42c" class="tag">></span>      </span> </li> <li id="4sgc4ay" class="alt">   <span id="m44acsq" class="tag"><</span><span id="y24mo44" class="tag-name">servlet-class</span><span id="2si4ock" class="tag">></span>uk.ltd.getahead.<span id="og4u244" class="hilite1">dwr.<span id="24w4e4q" class="hilite1">DWR</span>Servlet</span><span id="ogmm2u4" class="tag"><span id="4uuysqo" class="tag-name">servlet-class</span><span id="ks4am24" class="tag">></span>   </span> </li> <li id="gsyi2y4" class="">     <span id="244ces4" class="tag"><</span><span id="g44244k" class="tag-name">init-param</span><span id="i444iq4" class="tag">></span>   </li> <li id="kk624qq" class="alt">     <span id="24wcu24" class="tag"><</span><span id="24y4euq" class="tag-name">param-name</span><span id="yq2oqoo" class="tag">></span>debug<span id="eyc4g4u" class="tag"><span id="kescges" class="tag-name">param-name</span><span id="kesegmc" class="tag">></span>   </span> </li> <li id="k2uk2oa" class="">     <span id="2wyaec4" class="tag"><</span><span id="2444444" class="tag-name">param-value</span><span id="2ac4ok4" class="tag">></span>true<span id="4gqk2sq" class="tag"><span id="egc44cq" class="tag-name">param-value</span><span id="a2q4usa" class="tag">></span>   </span> </li> <li id="2wwis4g" class="alt">   <span id="m4g2y4y" class="tag"><span id="ueysu24" class="tag-name">init-param</span><span id="24ouyuu" class="tag">></span>   </span> </li> <li id="2mg4ow4" class="">    <span id="eeqcumw" class="tag"><</span><span id="k2yeiee" class="tag-name">load-on-startup</span><span id="euq24w4" class="tag">></span>1<span id="kewi24k" class="tag"><span id="emq4k4a" class="tag-name">load-on-startup</span><span id="2iuo44y" class="tag">></span>     </span> </li> <li id="a4444ci" class="alt"> <span id="gqk4uqq" class="tag"><span id="g6y4yyo" class="tag-name">servlet</span><span id="6yseowc" class="tag">></span>      </span> </li> <li id="4k44k4k" class="">     </li> <li id="2qakees" class="alt">   <span id="4q4y4us" class="tag"><</span><span id="2mg2aqw" class="tag-name">servlet-mapping</span><span id="qakw2cs" class="tag">></span>   </li> <li id="g2esw2w" class="">  <span id="22ey4cs" class="tag"><</span><span id="ssw24cq" class="tag-name">servlet-name</span><span id="42qkm44" class="tag">></span><span id="wmoqss4" class="hilite1">dwr-invoker</span><span id="uwqiccu" class="tag"><span id="4um2y4e" class="tag-name">servlet-name</span><span id="2g42w4g" class="tag">></span>   </span> </li> <li id="woy24o4" class="alt">  <span id="m44qq42" class="tag"><</span><span id="ce4c4ay" class="tag-name">url-pattern</span><span id="as2ic4k" class="tag">></span>/<span id="m4k2c44" class="hilite1">dwr/*</span><span id="244w24m" class="tag"><span id="keg4qe4" class="tag-name">url-pattern</span><span id="og22cas" class="tag">></span>   </span> </li> <li id="og6kges" class=""><span id="2ycm42c" class="tag"><span id="ceysk2m" class="tag-name">servlet-mapping</span><span id="2q4uoeu" class="tag">></span>   </span> </li> <li id="cey24uu" class="alt">    </li> </ol> </div> <p> </p> <p>Q?Q再Z个类Q用于获取验证输Z息的属性文Ӟq个文g是参考了良葛??strong><font color="#ff0000"><span id="s4gk4om" class="hilite1">DWR</span> 入門與應用(一Q?/font></strong></p> <p>里的Book代码</p> <p>java 代码</p> <div id="yis4wkq" class="dp-highlighter"> <div id="2ke4oes" class="bar"></div> <ol class="dp-j"> <li id="wgiw42e" class="alt"><span id="2yicgek" class="keyword">package test.common;   </span> </li> <li id="gg4s444" class="">   </li> <li id="2wgkouc" class="alt"><span id="y24m4c4" class="keyword">import</span> java.util.ResourceBundle;    </li> <li id="4sm4o4e" class="">   </li> <li id="2wo44ms" class="alt"><span id="oy2accy" class="keyword">public</span> <span id="4y44g4e" class="keyword">class</span> GetProperties{    </li> <li id="ceoiki2" class="">    <span id="y2m2ywy" class="keyword">private</span> ResourceBundle resource;    </li> <li id="u2aewwk" class="alt">        </li> <li id="wi2c2ig" class="">    <span id="kmy22ci" class="keyword">public</span> GetProperties()    </li> <li id="oqce2k4" class="alt">    {    </li> <li id="mmyski2" class="">            </li> <li id="2ceis4k" class="alt">                              resource = ResourceBundle.getBundle(<span id="umeakki" class="string">"<span id="6a2mg44" class="hilite1">dwr</span>Pro"</span>);    </li> <li id="4wi4s42" class="">     }    </li> <li id="yauoi4i" class="alt">                </li> <li id="um2g4wm" class="">    <span id="o2oy4we" class="keyword">public</span> String getDescription(String key)     </li> <li id="m2acguu" class="alt">    {    </li> <li id="2sqim4c" class="">       <span id="2qu44sg" class="keyword">return</span> resource.getString(key);    </li> <li id="kcyauki" class="alt">    }    </li> <li id="24oicky" class="">   </li> <li id="gy2uomi" class="alt">}   </li> </ol> </div> <p>Q?Q编写属性文?span class="hilite1">dwr</span>Pro_zh_CN.propertieQ中文)?span class="hilite1">dwr</span>_en.propertiesQ英文)</p> <div id="6iu4i4a" class="code_title">java 代码</div> <div id="gis444e" class="dp-highlighter"> <ol class="dp-j"> <li id="k4c4a4c" class="alt">username_hasUsed = 用户名已用,请选择别的用户?   </li> <li id="m24acaq" class="">username_canUse  = 恭喜Q用户名可以使用    </li> <li id="w2gam4u" class="alt">   </li> <li id="2gic444" class="">username_hasUsed =username has used!    </li> <li id="cuw2e44" class="alt">username_canUse  = username can use!   </li> </ol> </div> <p> </p> <p>Q?Q配|?span class="hilite1">dwr</span>.xmlQ里面用了spring的bean 和javac?/p> <div id="2cuyq4a" class="code_title">xml 代码</div> <div id="iiko444" class="dp-highlighter"> <div id="q24gsqg" class="bar"></div> <ol class="dp-xml"> <li id="2mqkea4" class="alt"><span id="u2kc42e" class="tag"><<span id="g2gqaa4" class="tag-name"><span id="km4gigi" class="hilite1">dwr</span></span><span id="2qcmgg4" class="tag">></span>  </span> </li> <li id="scm4gqa" class="">   </li> <li id="wgskm2m" class="alt">  <span id="4y44ssq" class="tag"><</span><span id="ck2yqq4" class="tag-name">allow</span><span id="e2m4w4e" class="tag">></span>   </li> <li id="6yi4cm4" class="">     <span id="c4yse4w" class="tag"><</span><span id="oykmw2e" class="tag-name">create</span> <span id="mwq2s44" class="attribute">creator</span>=<span id="cmiamsc" class="attribute-value">"spring"</span> <span id="22cwyo4" class="attribute">javascript</span>=<span id="444yaak" class="attribute-value">"userManager"</span><span id="6wyakia" class="tag">></span>   </li> <li id="44smowm" class="alt">        <span id="me44qa4" class="tag"><</span><span id="ooik2cq" class="tag-name">param</span> <span id="gscwg4g" class="attribute">name</span>=<span id="2yak4q4" class="attribute-value">"beanName"</span> <span id="o24qiq4" class="attribute">value</span>=<span id="cwos2yu" class="attribute-value">"userManager"</span><span id="k4au44w" class="tag">/></span>   </li> <li id="kmoqa64" class="">       <span id="2uw2444" class="tag"><</span><span id="oik4u4c" class="tag-name">include</span> <span id="4gq2k4i" class="attribute">method</span>=<span id="242cckq" class="attribute-value">"findUserIsExist"</span><span id="eoaswci" class="tag">/></span>   </li> <li id="k2sm24e" class="alt">    <span id="2iu2o4c" class="tag"><span id="2g4ses4" class="tag-name">create</span><span id="m44c4us" class="tag">></span>   </span> </li> <li id="wq444wu" class="">        </li> <li id="keq4m44" class="alt">  <span id="cs44w6k" class="tag"><</span><span id="e4u4kws" class="tag-name">create</span> <span id="4444k6o" class="attribute">creator</span>=<span id="6qcq4ws" class="attribute-value">"new"</span> <span id="2qce424" class="attribute">javascript</span>=<span id="24acs4s" class="attribute-value">"User"</span> <span id="ya444gy" class="attribute">scope</span>=<span id="w2444g4" class="attribute-value">"application"</span><span id="y24kma4" class="tag">></span>   </li> <li id="sm2uw4e" class="">            <span id="22w4gye" class="tag"><</span><span id="qqew2ks" class="tag-name">param</span> <span id="2m444ee" class="attribute">name</span>=<span id="2oya44i" class="attribute-value">"class"</span> <span id="2i4cemi" class="attribute">value</span>=<span id="4amg64s" class="attribute-value">"test.common.GetProperties"</span><span id="owqmay4" class="tag">/></span>   </li> <li id="kkmi4cy" class="alt">        <span id="qs2ey44" class="tag"><span id="ck2accm" class="tag-name">create</span><span id="ck2e44c" class="tag">></span>          </span> </li> <li id="a242gs4" class="">  <span id="qiaw24i" class="tag"><span id="6s44coo" class="tag-name">allow</span><span id="ss2m4wc" class="tag">></span>   </span> </li> <li id="ssug4qy" class="alt"><span id="6co4y64" class="tag"><span id="4mo4scc" class="tag-name"><span id="2mg4cu4" class="hilite1">dwr</span></span><span id="2gqcgem" class="tag">></span>   </span></li> </ol> </div> <p>spring beanName  的value =“userManager”从applicationContext.xml里取?/p> <div id="eeosguu" class="code_title">xml 代码</div> <div id="uc66m6w" class="dp-highlighter"> <div id="ccwyw0o" class="bar"></div> <ol class="dp-xml"> <li id="ew0qk0s" class="alt"><span id="06qaym0" class="tag"><<span id="00q0u0y" class="tag-name">bean</span> <span id="smmy0ws" class="attribute">id</span>=<span id="q0ey800" class="attribute-value">"userManagerTarget"</span> <span id="aaugcig" class="attribute">class</span>=<span id="ggq8cmk" class="attribute-value">"test.spring.serviceImpl.UserServiceImpl"</span><span id="u0kki0y" class="tag">></span>  </span> </li> <li id="00coa6y" class=""><span id="0660o0g" class="tag"><</span><span id="ogk0m86" class="tag-name">property</span> <span id="aicmy6g" class="attribute">name</span>=<span id="ooy86ek" class="attribute-value">"userDao"</span><span id="u8a60y0" class="tag">></span>   </li> <li id="e0u6oq0" class="alt">  <span id="8yic6sq" class="tag"><</span><span id="a8m000q" class="tag-name">ref</span> <span id="6000ses" class="attribute">bean</span>=<span id="6ake00u" class="attribute-value">"userDao"</span><span id="e0me0m0" class="tag">/></span>   </li> <li id="e8ik8ee" class=""><span id="qs0my6e" class="tag"><span id="80000em" class="tag-name">property</span><span id="88cgcu0" class="tag">></span>   </span> </li> <li id="wa0000g" class="alt"><span id="i8eym00" class="tag"><span id="c8e00ge" class="tag-name">bean</span><span id="qc80wqo" class="tag">></span>   </span> </li> <li id="cqa00cs" class="">        </li> <li id="ke0suem" class="alt">        </li> <li id="qqk8wu0" class=""> <span id="886wy6i" class="tag"><</span><span id="8qcmgio" class="tag-name">bean</span> <span id="80wy0wu" class="attribute">id</span>=<span id="qis08ka" class="attribute-value">"userManager"</span> <span id="we0a00a" class="attribute">class</span>=<span id="oy00c0c" class="attribute-value">"org.springframework.aop.framework.ProxyFactoryBean"</span><span id="o8km006" class="tag">></span>   </li> <li id="ii060mi" class="alt">    <span id="sc8oqou" class="tag"><</span><span id="8i00ks0" class="tag-name">property</span> <span id="a00k00k" class="attribute">name</span>=<span id="8wqsq0q" class="attribute-value">"proxyInterfaces"</span><span id="moce86e" class="tag">></span>   </li> <li id="ccakqoi" class="">    <span id="0kmoay0" class="tag"><</span><span id="0q00yo0" class="tag-name">value</span><span id="eoiumke" class="tag">></span>test.spring.service.IUserService<span id="8yy00g0" class="tag"><span id="8egsm0o" class="tag-name">value</span><span id="ac8y66c" class="tag">></span>   </span> </li> <li id="86m0ywg" class="alt">    <span id="o0uqs00" class="tag"><span id="umoqcay" class="tag-name">property</span><span id="aic0qmk" class="tag">></span>   </span> </li> <li id="8ismwmc" class="">    <span id="kswg00q" class="tag"><</span><span id="mwqke8w" class="tag-name">property</span> <span id="e8smgek" class="attribute">name</span>=<span id="qy8aw0u" class="attribute-value">"interceptorNames"</span><span id="k0smom0" class="tag">></span>   </li> <li id="gseoi0k" class="alt">       <span id="goi0ks0" class="tag"><</span><span id="8i0seai" class="tag-name">list</span><span id="8m00m0e" class="tag">></span>     </li> <li id="000oqoe" class="">        <span id="su8m08s" class="tag"><</span><span id="iiu8gmc" class="tag-name">idref</span> <span id="yic806g" class="attribute">bean</span>=<span id="iamo8ay" class="attribute-value">"transactionInterceptor"</span><span id="umoiusy" class="tag">/></span>     </li> <li id="m0a0cu0" class="alt">          <span id="m0a0si0" class="tag"><</span><span id="cuoa0aq" class="tag-name">idref</span> <span id="8su6eaq" class="attribute">bean</span>=<span id="skeyig0" class="attribute-value">"userManagerTarget"</span><span id="ewg0yo0" class="tag">/></span>   </li> <li id="i0wasii" class="">       <span id="a0g0000" class="tag"><span id="0060a6e" class="tag-name">list</span><span id="6w0asqg" class="tag">></span>   </span> </li> <li id="6osu0wu" class="alt">    <span id="oyiu86g" class="tag"><span id="yq0ewms" class="tag-name">property</span><span id="6umis8s" class="tag">></span>        </span> </li> <li id="8wys8uq" class=""> <span id="yic0u0e" class="tag"><span id="yqu6wu0" class="tag-name">bean</span><span id="6ue6w80" class="tag">></span>    </span></li> </ol> </div> <p>q里应该大家都懂Q就不罗嗦了</p> <p> </p> <p>Q?Q配好了q些Q就可以在页面里用了</p> <div id="i0u0w0g" class="code_title">java 代码</div> <div id="uueqai0" class="dp-highlighter"> <div id="meoqkiy" class="bar"></div> <ol class="dp-j"> <li id="k8ykuk6" class="alt"><!--page language=<span id="8ooi06m" class="string">"java" pageEncoding=<span id="kuey8a0" class="string">"UTF-8"</span><span-->  </span></span> </li> <li id="0yic0m8" class="">   </li> <li id="u800k00" class="alt">   </li> <li id="gqumooc" class=""><!--ctype html public </sp--><span id="moq0iay" class="string">"-//W3C//DTD HTML 4.01 Transitional//EN">    </span> </li> <li id="i0qacki" class="alt">   </li> <li id="iueiciy" class="">      </li> <li id="k8i60mc" class="alt">        </li> <li id="80c0o0e" class="">        </li> <li id="0m0ik6s" class="alt">        </li> <li id="kk8wqy0" class="">        </li> <li id="80ac0ii" class="alt">          </li> <li id="0qiu0iq" class="">     <script type='text javascript?  src="dwr/</span"><span id="s00060k" class="keyword">interface/userManager.js'>    <li id="u06akkq" class="alt">     <script type='text javascript?  src="dwr/engine.js">    <li id="0gi0e6c" class="alt">     <script type='text javascript?  src="dwr/</span"><span id="00coqo6" class="keyword">interface/GetProperties.js'>    <li id="mmo0s6g" class="">        <li id="megam06" class="alt"><span>     <script type='text javascript?> <li id="oykuy8a" class="alt">    }    <li id="8yse800" class="">        <li id="egiswu8" class="alt">        <li id="c00066o" class="">        <li id="uk8000m" class="alt">        <li id="eegi0ki" class="">      <li id="8w60umc" class="alt">      <li id="8k00g0c" class="">      <li id="00k000w" class="alt">        <li id="gykm8ek" class="">      <span id="q0080ka" class="string">"0">    </span> <li id="cueys00" class="alt">         <tr> </tr>    <li id="m0i0e0c" class="">           <td> </td> Login:    <li id="kmeauki" class="alt">           <td> </td> <span id="ugqkmk8" class="string">"text" name=<span id="8o0u00s" class="string">"user.name"</span> id=<span id="k0i00us" class="string">"username"</span> onblur=<span id="8se00qw" class="string">"checkName()"</span>/><span id="aseo0ea" class="string">"check_username">   </span> </span> <li id="ccwqs0s" class="">            <li id="ck8yayo" class="alt">         <tr> </tr>    <li id="00ocw0g" class="">           <td> </td> Password:    <li id="ce80ii8" class="alt">           <td> </td> <span id="y8yq000" class="string">"password" name=<span id="8oq0u0s" class="string">"user.password"</span> id=<span id="i00umks" class="string">"username"</span> onblur=<span id="6gk00wk" class="string">"checkpassword()"</span>/><span id="g8w0e06" class="string">"check_password">   </span> </span> <li id="e8000ge" class="">            <li id="8iceyg0" class="alt">         <tr> </tr>    <li id="g0coao0" class="">          <span id="ieqek8k" class="string">"2" align=<span id="8ssmygg" class="string">"center"</span>>    </span> <li id="i8u00g0" class="alt">            <li id="o8ac00a" class="">          <li id="8ae0mgw" class="alt">     <li id="00mgk0s" class="">      <li id="o0s00om" class="alt"></li> </ol> </div> <p> </p> <p>q里当填了Login框,当光标从输入框移开时就实行?/p> <div id="oys80ec" class="code_title">js 代码</div> <div id="8yuogwm" class="dp-highlighter"> <div id="8wi60s0" class="bar"></div> <ol class="dp-c"> <li id="8am00m0" class="alt"><span id="yeys0g0" class="keyword">function checkName()   </span> <li id="8og0800" class="">    {    <li id="awyqsi0" class="alt">        <span id="06s0y6o" class="keyword">var</span> username = document.userForm.username.value;    <li id="uqscw0o" class="">        userManager.findUserIsExist(username,callback);    <li id="80u0giw" class="alt">    }   </li> </ol> </div> <p> </p> <p><font face="Arial">userManager.findUserIsExist(username,callback)时关键,q里q?/font></p> <p><font face="Arial">  <script src="dwr/interface/userManager.js" type="text/javascript"></script> <p> </p> <p>d<span id="08a0c0o" class="hilite1">dwr</span>.xml?font face="Arial">userManagerQ然后读取applicationContext.xml?font face="Arial">userManager  bean Q进而实?font face="Arial">findUserIsExistҎ?/font></font></font></p> <p> </p> </span></li> </ol> </div> <img src ="http://m.tkk7.com/1504/aggbug/219702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/1504/" target="_blank">weesun一c阳?/a> 2008-08-03 15:31 <a href="http://m.tkk7.com/1504/archive/2008/08/03/219702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 CAS ?Tomcat 中实现单点登?/title><link>http://m.tkk7.com/1504/archive/2008/08/03/219699.html</link><dc:creator>weesun一c阳?/dc:creator><author>weesun一c阳?/author><pubDate>Sun, 03 Aug 2008 07:19:00 GMT</pubDate><guid>http://m.tkk7.com/1504/archive/2008/08/03/219699.html</guid><wfw:comment>http://m.tkk7.com/1504/comments/219699.html</wfw:comment><comments>http://m.tkk7.com/1504/archive/2008/08/03/219699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/1504/comments/commentRss/219699.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/1504/services/trackbacks/219699.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">转自Qhttp://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html<br /> <img alt="" src="http://www.ibm.com/i/c.gif" width="10" height="1" /> <table width="160" align="right" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td width="10"><img alt="" src="http://www.ibm.com/i/c.gif" width="10" height="1" /></td> <td> <table width="150" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>文档选项</td> </tr> </tbody> </table> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td width="150"><noscript> <tr valign="top"> <td width="8"><img alt="" height="1" width="8" src="http://www.ibm.com/i/c.gif"/ /></td> <td width="16"><img alt="" width="16" height="16" src="http://www.ibm.com/i/c.gif"/ /></td> <td width="122"> <p>未显C需?JavaScript 的文档选项</p> </td> </tr> </noscript> <table width="143" border="0" cellpadding="0" cellspacing="0"> <script language="JavaScript" type="text/javascript"> <!-- document.write(' <tr valign="top"> <td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt=""/ /></td> <td width="16"><img alt="打印机的版面设|成横向打印模式" height="16" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td> <td width="122"> <p><strong><a href="javascript:print()">打印本页</a></strong></p> </td> </tr> '); //--> </script> <tbody> <tr valign="top"> <td width="8"><img src="http://www.ibm.com/i/c.gif" alt="" width="8" height="1" /></td> <td width="16"><img alt="打印机的版面设|成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" vspace="3" width="16" height="16" /></td> <td width="122"> <p><strong><a href="javascript:print()">打印本页</a></strong></p> </td> </tr> <input value="单点dQSingle Sign On , U?SSO Q是目前比较行的服务于企业业务整合的解x案之一Q?SSO 使得在多个应用系l中Q用户只需要登录一ơ就可以讉K所有相互信ȝ应用pȝ。CAS(Central Authentication Service)是一ƾ不错的针对 Web 应用的单点登录框Ӟ本文介绍?CAS 的原理、协议、在 Tomcat 中的配置和用,对于采用 CAS 实现轻量U单点登录解x案的入门读者具有一定指g用? name="body" type="hidden" /><input value="使用 CAS ?Tomcat 中实现单点登? name="subject" type="hidden" /><input value="cn" name="lang" type="hidden" /> <script language="JavaScript" type="text/javascript"> <!-- document.write(' <tr valign="top"> <td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt=""/ /></td> <td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="此作为电子邮件发? /></td> <td width="122"> <p><a href="javascript:document.email.submit();"><strong>此作为电子邮件发?/strong></a></p> </td> </tr> '); //--> </script> <tr valign="top"> <td width="8"><img src="http://www.ibm.com/i/c.gif" alt="" width="8" height="1" /></td> <td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" alt="此作为电子邮件发? vspace="3" width="16" height="16" /></td> <td width="122"> <p><a href="javascript:document.email.submit();"><strong>此 作为电子邮件发?/strong></a></p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> </td> </tr> </tbody> </table> <p>U? 别: 初</p> <p><a >? ?/a> (<a href="mailto:zzhangt@cn.ibm.com?subject=%E4%BD%BF%E7%94%A8%20CAS%20%E5%9C%A8%20Tomcat%20%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95">zzhangt@cn.ibm.com</a>), 软g工程? IBM<br /> <a >? U坤</a> (<a href="mailto:wangbk@cn.ibm.com?subject=%E4%BD%BF%E7%94%A8%20CAS%20%E5%9C%A8%20Tomcat%20%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95">wangbk@cn.ibm.com</a>), 软g工程? IBM<br /> </p> <p>2008 q? 4 ? 10 ?/p> <blockquote>单点dQSingle Sign On , U?SSO Q是目前比较行的服务于企业业务整合的解x案之一Q?SSO 使得在多个应用系l中Q用户只需要登录一ơ就可以讉K所有相互信ȝ应用pȝ。CAS(Central Authentication Service)是一ƾ不错的针对 Web 应用的单点登录框Ӟ本文介绍?CAS 的原理、协议、在 Tomcat 中的配置和用,对于采用 CAS 实现轻量U单点登录解x案的入门读者具有一定指g用?/blockquote> <p><a name="2.CAS 介绍">CAS 介绍</a></p> <p>CAS ?Yale 大学发v的一个开源项目,旨在?Web 应用pȝ提供一U可靠的单点dҎQCAS ? 2004 q?12 月正式成?JA-SIG 的一个项目。CAS h以下特点Q?/p> <ul> <li> 开源的企业U单点登录解x案?/li> <li> CAS Server 为需要独立部|的 Web 应用?/li> <li> CAS Client 支持非常多的客户?q里指单点登录系l中的各?Web 应用)Q包?Java, .Net, PHP, Perl, Apache, uPortal, Ruby {?/li> </ul> <p><a name="N1008D">CAS 原理和协?/a></p> <p>从结构上看,CAS 包含两个部分Q?CAS Server ?CAS Client。CAS Server 需要独立部|Ԍ主要负责对用L认证工作QCAS Client 负责处理对客L受保护资源的讉KhQ需要登录时Q重定向?CAS Server。图1 ?CAS 最基本的协议过E:</p> <br /> <a name="N10098"><strong>?1. CAS 基础协议</strong></a><br /> <img alt="CAS 基础协议" src="http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image001.jpg" width="467" height="341" /> <br /> <p>CAS Client 与受保护的客L应用部v在一P?Filter 方式保护受保护的资源。对于访问受保护资源的每?Web hQCAS Client 会分析该h?Http h中是否包?Service TicketQ如果没有,则说明当前用户尚未登录,于是请求重定向到指定好?CAS Server d地址Qƈ传?Service Q也是要访问的目的资源地址Q,以便d成功q后转回该地址。用户在W?3 步中输入认证信息Q如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service TicketQƈ~存以待来验证Q之后系l自动重定向?Service 所在地址Qƈ为客L览器设|一?Ticket Granted CookieQTGCQ,CAS Client 在拿?Service 和新产生?Ticket q后Q在W?5Q? 步中?CAS Server q行w䆾合适,以确?Service Ticket 的合法性?/p> <p>在该协议中,所有与 CAS 的交互均采用 SSL 协议Q确保,ST ?TGC 的安全性。协议工作过E中会有 2 ơ重定向的过E,但是 CAS Client ?CAS Server 之间q行 Ticket 验证的过E对于用h透明的?/p> <p>另外QCAS 协议中还提供?Proxy Q代理)模式Q以适应更加高、复杂的应用场景Q具体介l可以参?CAS 官方|站上的相关文档?/p> <p><a name="N100B0">准备工作</a></p> <p>本文中的例子?tomcat5.5 Zq行讲解Q下载地址Q?/p> <p> <a >http://tomcat.apache.org/download-55.cgi</a> </p> <p>?CAS 官方|站下蝲 CAS Server ?ClientQ地址分别为:</p> <p> <a >http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip</a> </p> <p> <a >http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip</a> </p> <br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /> <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /> </td> <td valign="top" align="right"><a class="fbox"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="3.部v CAS Server">部v CAS Server</a></p> <p>CAS Server 是一套基?Java 实现的服务,该服务以一?Java Web Application 单独部v在与 servlet2.3 兼容?Web 服务器上Q另外,׃ Client ?CAS Server 之间的交互采?Https 协议Q因此部|?CAS Server 的服务器q需要支?SSL 协议。当 SSL 配置成功q后Q像普?Web 应用一样将 CAS Server 部v在服务器上就能正常运行了Q不q,在真正用之前,q需要扩展验证用L接口?/p> <p>?Tomcat 上部|一个完整的 CAS Server 主要按照以下几个步骤Q?/p> <p><a name="N100DD"><span>配置 Tomcat 使用 Https 协议</span></a></p> <p>如果希望 Tomcat 支持 HttpsQ主要的工作是配|?SSL 协议Q其配置q程和配|方法可以参? Tomcat 的相x档。不q在生成证书的过E中Q会有需要用C机名的地方,CAS 不要使用 IP 地址Q而要使用机器名或域名?/p> <p><a name="N100E6">部v CAS Server</a></p> <p>CAS Server 是一?Web 应用包,前面下载的 cas-server-3.1.1-release.zip 解开Q把其中?cas-server-webapp-3.1.1.war 拯? tomcat?webapps 目录Qƈ更名?cas.war。由于前面已配置?tomcat ?https 协议Q可以重新启? tomcatQ然后访问:https://localhost:8443/cas Q如果能出现正常?CAS d面Q则说明 CAS Server 已经部v成功?/p> <p>虽然 CAS Server 已经部v成功Q但q只是一个缺省的实现Q在实际使用的时候,q需要根据实际概况做扩展和定Ӟ最主要的是扩展认证 (Authentication) 接口?CAS Server 的界面?/p> <p><a name="N100F2">扩展认证接口</a></p> <p>CAS Server 负责完成对用L认证工作Q它会处理登录时的用户凭?(Credentials) 信息Q用户名/密码Ҏ最常见的凭证信息。CAS Server 可能需要到数据库检索一条用户帐号信息,也可能在 XML 文g中检索用户名/密码Q还可能通过 LDAP Server 获取{,在这U情况下QCAS 提供了一U灵zMl一的接口和实现分离的方式,实际使用? CAS 采用哪种方式认证是与 CAS 的基本协议分d的,用户可以Ҏ认证的接口去定制和扩展?/p> <p> <strong>扩展 AuthenticationHandler</strong> </p> <p>CAS 提供扩展认证的核心是 AuthenticationHandler 接口Q该接口定义如清?1 下:</p> <br /> <a name="N10107"><strong>清单 1. AuthenticationHandler定义</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> public interface AuthenticationHandler {<br /> /**<br /> * Method to determine if the credentials supplied are valid.<br /> * @param credentials The credentials to validate.<br /> * @return true if valid, return false otherwise.<br /> * @throws AuthenticationException An AuthenticationException can contain<br /> * details about why a particular authentication request failed.<br /> */<br /> boolean authenticate(Credentials credentials) throws AuthenticationException;<br /> /**<br /> * Method to check if the handler knows how to handle the credentials<br /> * provided. It may be a simple check of the Credentials class or something<br /> * more complicated such as scanning the information contained in the<br /> * Credentials object. <br /> * @param credentials The credentials to check.<br /> * @return true if the handler supports the Credentials, false othewrise.<br /> */<br /> boolean supports(Credentials credentials);<br /> }<br /> </pre> </td> </tr> </tbody> </table> <br /> <p>该接口定义了 2 个需要实现的ҎQsupports ()Ҏ用于查所l的包含认证信息的Credentials 是否受当?AuthenticationHandler 支持Q?authenticate() Ҏ则担当验证认证信息的dQ这也是需要扩展的主要ҎQ根据情况与存储合法认证信息的介质进行交互,q回 boolean cd的|true 表示验证通过Qfalse 表示验证p|?/p> <p>CAS3中还提供了对AuthenticationHandler 接口的一些抽象实玎ͼ比如Q可能需要在执行authenticate() Ҏ前后执行某些其他操作Q那么可以让自己的认证类扩展自清?2 中的抽象c:</p> <br /> <a name="N10117"><strong>清单 2. AbstractPreAndPostProcessingAuthenticationHandler定义</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> public abstract class AbstractPreAndPostProcessingAuthenticationHandler <br /> implements AuthenticateHandler{<br /> protected Log log = LogFactory.getLog(this.getClass());<br /> protected boolean preAuthenticate(final Credentials credentials) {<br /> return true;<br /> }<br /> protected boolean postAuthenticate(final Credentials credentials,<br /> final boolean authenticated) {<br /> return authenticated;<br /> }<br /> public final boolean authenticate(final Credentials credentials)<br /> throws AuthenticationException {<br /> if (!preAuthenticate(credentials)) {<br /> return false;<br /> }<br /> final boolean authenticated = doAuthentication(credentials);<br /> return postAuthenticate(credentials, authenticated);<br /> }<br /> protected abstract boolean doAuthentication(final Credentials credentials) <br /> throws AuthenticationException;<br /> }<br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>AbstractPreAndPostProcessingAuthenticationHandler cL定义? preAuthenticate() Ҏ?postAuthenticate() ҎQ而实际的认证工作交由 doAuthentication() Ҏ来执行。因此,如果需要在认证前后执行一些额外的操作Q可以分别扩?preAuthenticate()? ppstAuthenticate() ҎQ?doAuthentication() 取代 authenticate() 成ؓ了子cd要实现的方法?/p> <p>׃实际q用中,最常用的是用户名和密码方式的认证,CAS3 提供了针对该方式的实玎ͼ如清?3 所C:</p> <br /> <a name="N10127"><strong>清单 3. AbstractUsernamePasswordAuthenticationHandler 定义</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> public abstract class AbstractUsernamePasswordAuthenticationHandler extends <br /> AbstractPreAndPostProcessingAuthenticationHandler{<br /> ...<br /> protected final boolean doAuthentication(final Credentials credentials)<br /> throws AuthenticationException {<br /> return authenticateUsernamePasswordInternal((UsernamePasswordCredentials) credentials);<br /> }<br /> protected abstract boolean authenticateUsernamePasswordInternal(<br /> final UsernamePasswordCredentials credentials) throws AuthenticationException; <br /> protected final PasswordEncoder getPasswordEncoder() {<br /> return this.passwordEncoder;<br /> }<br /> public final void setPasswordEncoder(final PasswordEncoder passwordEncoder) {<br /> this.passwordEncoder = passwordEncoder;<br /> }<br /> ...<br /> }<br /> </pre> </td> </tr> </tbody> </table> <br /> <p>Z用户名密码的认证方式可直接扩展自 AbstractUsernamePasswordAuthenticationHandlerQ验证用户名密码的具体操作通过实现 authenticateUsernamePasswordInternal() Ҏ辑ֈQ另外,通常情况下密码会是加密过的,setPasswordEncoder() Ҏ是用于指定适当的加密器?/p> <p>从以上清单中可以看到QdoAuthentication() Ҏ的参数是 Credentials cdQ这是包含用戯证信息的一个接口,对于用户名密码类型的认证信息Q可以直接? UsernamePasswordCredentialsQ如果需要扩展其他类型的认证信息Q需要实现Credentials接口Qƈ且实现相应的 CredentialsToPrincipalResolver 接口Q其具体Ҏ可以借鉴 UsernamePasswordCredentials ? UsernamePasswordCredentialsToPrincipalResolver?/p> <p> <strong>JDBC 认证Ҏ</strong> </p> <p>用户的认证信息通常保存在数据库中,因此本文选用q种情况来介l。将前面下蝲? cas-server-3.1.1-release.zip 包解开后,?modules 目录下可以找到包 cas-server-support-jdbc-3.1.1.jarQ其提供了通过 JDBC q接数据库进行验证的~省实现Q基于该包的支持Q我们只需要做一些配|工作即可实?JDBC 认证?/p> <p>JDBC 认证Ҏ支持多种数据库,DB2, Oracle, MySql, Microsoft SQL Server {均可,q里?DB2 作ؓ例子介绍。ƈ且假设DB2数据库名Q?CASTestQ数据库d用户名: db2userQ数据库d密码Q? db2passwordQ用户信息表为: userTableQ该表包含用户名和密码的两个数据分别ؓ userName ?password?/p> <p> <strong>1. </strong> <strong>配置</strong> <strong> DataStore</strong> </p> <p>打开文g %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xmlQ添加一个新? bean 标签Q对?DB2Q内容如清单 4 所C:</p> <br /> <a name="N10152"><strong>清单 4. 配置 DataStore</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"><br /> <property name="driverClassName"><br /> <value>com.ibm.db2.jcc.DB2Driver</value><br /> </property><br /> <property name="url"><br /> <value>jdbc:db2://9.125.65.134:50000/CASTest</value><br /> </property><br /> <property name="username"><br /> <value>db2user</value><br /> </property><br /> <property name="password"><br /> <value>db2password</value><br /> </property><br /> </bean><br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>其中 id 属性ؓ?DataStore 的标识,在后面配|?AuthenticationHandler 会被引用Q另外,需要提?DataStore 所必需的数据库驱动E序、连接地址、数据库d用户名以及登录密码?/p> <p> <strong>2. 配置 AuthenticationHandler</strong> </p> <p>?cas-server-support-jdbc-3.1.1.jar 包中Q提供了 3 个基?JDBC ? AuthenticationHandlerQ分别ؓ BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其? BindModeSearchDatabaseAuthenticationHandler 是用所l的用户名和密码d立数据库q接Q根据连接徏立是否成功来判断验证成功? 否;QueryDatabaseAuthenticationHandler 通过配置一?SQL 语句查出密码Q与所l密码匹配;SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字D,构造查询语句来验证?/p> <p>使用哪个 AuthenticationHandlerQ需要在 deployerConfigContext.xml 中设|,默认情况下,CAS 使用一个简单的 username=password ? AuthenticationHandlerQ在文g中可以找到如下一行:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword<br /> AuthenticationHandler" />Q我们可以将其注释掉Q换成我们希望的一? AuthenticationHandlerQ比如,使用QueryDatabaseAuthenticationHandler ? SearchModeSearchDatabaseAuthenticationHandler 可以分别选取清单 5 或清?6 的配|?/p> <br /> <a name="N1016D"><strong>清单 5. 使用 QueryDatabaseAuthenticationHandler</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><br /> <property name="dataSource" ref=" casDataSource " /><br /> <property name="sql" <br /> value="select password from userTable where lower(userName) = lower(?)" /><br /> </bean><br /> </pre> </td> </tr> </tbody> </table> <br /> <br /> <a name="N10177"><strong>清单 6. 使用 SearchModeSearchDatabaseAuthenticationHandler</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean id="SearchModeSearchDatabaseAuthenticationHandler"<br /> class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"<br /> abstract="false" singleton="true" lazy-init="default" <br /> autowire="default" dependency-check="default"><br /> <property name="tableUsers"><br /> <value>userTable</value><br /> </property><br /> <property name="fieldUser"><br /> <value>userName</value><br /> </property><br /> <property name="fieldPassword"><br /> <value>password</value><br /> </property><br /> <property name="dataSource" ref=" casDataSource " /><br /> </bean><br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>另外Q由于存攑֜数据库中的密码通常是加密过的,所?AuthenticationHandler 在匹配时需要知道用的加密ҎQ在 deployerConfigContext.xml 文g中我们可以ؓ具体? AuthenticationHandler c配|一?propertyQ指定加密器c,比如对于 QueryDatabaseAuthenticationHandlerQ可以修改如清单7所C:</p> <br /> <a name="N10184"><strong>清单 7. d passwordEncoder</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><br /> <property name="dataSource" ref=" casDataSource " /><br /> <property name="sql" <br /> value="select password from userTable where lower(userName) = lower(?)" /><br /> <property name="passwordEncoder" ref="myPasswordEncoder"/><br /> </bean><br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>其中 myPasswordEncoder 是对清单 8 中设|的实际加密器类的引用:</p> <br /> <a name="N10191"><strong>清单 8. 指定具体加密器类</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean id="passwordEncoder" <br /> class="org.jasig.cas.authentication.handler.MyPasswordEncoder"/><br /> </pre> </td> </tr> </tbody> </table> <br /> <p>q里 MyPasswordEncoder 是根据实际情况自己定义的加密器,实现 PasswordEncoder 接口及其 encode() Ҏ?/p> <p> <strong>3. 部v依赖?/strong> </p> <p>在以上配|完成以后,需要拷贝几个依赖的包到 cas 应用下,包括Q?/p> <ul> <li> ?cas-server-support-jdbc-3.1.1.jar 拯?%CATALINA_HOME%/webapps/cas/ WEB-INF/lib 目录?/li> <li> 数据库驱动,׃q里使用 DB2Q将 %DB2_HOME%/java 目录下的 db2java.zip Q更名ؓ db2java.jarQ? db2jcc.jar, db2jcc_license_cu.jar 拯? %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录。对于其他数据库Q同样将相应数据库驱动程序拷贝到该目录?/li> <li> DataStore 依赖?commons-collections-3.2.jar, commons-dbcp-1.2.1.jar, commons-pool-1.3.jarQ需要到 apache |站?Commons 目下蝲以上 3 个包放进 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录?/li> </ul> <p><a name="N101B0"><span>扩展 CAS Server 界面</span></a></p> <p>CAS 提供?2 套默认的面Q分别ؓ“ default ”?#8220; simple ”Q分别在目录“ cas/WEB-INF/view/jsp/default ”?#8220; cas/WEB-INF/view/jsp/simple ”下。其? default 是一个稍微复杂一些的面Q?CSSQ?simple 则是能让 CAS 正常工作的最化的面?/p> <p>在部|?CAS 之前Q我们可能需要定制一套新?CAS Server 面Q添加一些个性化的内宏V最单的Ҏ是拯一?default ?simple 文g?#8220; cas/WEB-INF/view/jsp ”目录下,比如命名?newUIQ接下来是实现和修改必要的页面,?4 个页面是必须的:</p> <ul> <li> casConfirmView.jsp: 当用户选择?#8220; warn ”时会看到的确认界?/li> <li> casGenericSuccess.jsp: 在用h功通过认证而没有目的Service时会看到的界?/li> <li> casLoginView.jsp: 当需要用h供认证信息时会出现的界面</li> <li> casLogoutView.jsp: 当用L?CAS 单点dpȝ会话时出现的界面</li> </ul> <p>CAS 的页面采?Spring 框架~写Q对于不熟悉 Spring 的用者,在修改之前需要熟悉该框架?/p> <p>面定制完过后,q需要做一些配|从而让 CAS 扑ֈ新的面Q拷?#8220; cas/WEB-INF/classes/default_views.properties ”Q重命名?#8220; cas/WEB-INF/classes/ newUI_views.properties ”Qƈ修改其中所有的值到相应新页面。最后是更新“ cas/WEB-INF/cas-servlet.xml ”文g中的 viewResolverQ将其修改ؓ如清?9 中的内容?/p> <br /> <a name="N101D4"><strong>清单 9. 指定 CAS 面</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <bean id="viewResolver" <br /> class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0"><br /> <property name="basenames"><br /> <list><br /> <value>${cas.viewResolver.basename}</value><br /> <value> newUI_views</value><br /> </list><br /> </property><br /> </bean><br /> </pre> </td> </tr> </tbody> </table> <br /> <br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /> <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /> </td> <td valign="top" align="right"><a class="fbox"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="4.部v客户端应?>部v客户端应?/a></p> <p>单点d的目的是Z让多个相兌的应用用相同的dq程Q本文在讲解q程中构?2个简单的应用Q分别以 casTest1 ?casTest2 来作为示例,它们均只有一个页面,昄Ƣ迎信息和当前登录用户名。这 2 个应用用同一套登录信息,q且只有dq的用户才能讉KQ通过本文的配|,实现单点dQ即只需d一ơ就可以讉Kq两个应用?/p> <p><a name="N101E4"><span>?CAS Server 建立信Q关系</span></a></p> <p>假设 CAS Server 单独部v在一台机?AQ而客L应用部v在机?B 上,׃客户端应用与 CAS Server 的通信采用 SSLQ因此,需要在 A ?B ?JRE 之间建立信Q关系?/p> <p>首先?A 机器一P要生?B 机器上的证书Q配|?Tomcat ?SSL 协议。其ơ,下蝲<a >http://blogs.sun.com/andreas/entry/no_more_unable_to_find</a> ?InstallCert.javaQ运?#8220; java InstallCert compA:8443 ”命oQƈ且在接下来出现的询问中输? 1。这P将 A dC B ?trust store 中。如果多个客L应用分别部v在不同机器上Q那么每个机器都需要与 CAS Server 所在机器徏立信dpR?/p> <p><a name="N101F4">配置 CAS Filter</a></p> <p>准备好应?casTest1 ?casTest2 q后Q分别部|在 B ?C 机器上,׃ casTest1 和casTest2QB ?C 完全{同Q我们以 casTest1 ?B 机器上的配置做介l,假设 A ?B 的域名分别ؓ domainA ? domainB?/p> <p>?cas-client-java-2.1.1.zip 改名?cas-client-java-2.1.1.jar q拷贝到 casTest1/WEB-INF/lib目录下,修改 web.xml 文gQ添?CAS FilterQ如清单 10 所C:</p> <br /> <a name="N10203"><strong>清单 10. d CAS Filter</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <web-app><br /> ...<br /> <filter><br /> <filter-name>CAS Filter</filter-name><br /> <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class><br /> <init-param><br /> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name><br /> <param-value>https://domainA:8443/cas/login</param-value><br /> </init-param><br /> <init-param><br /> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name><br /> <param-value>https://domainA:8443/cas/serviceValidate</param-value><br /> </init-param><br /> <init-param><br /> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name><br /> <param-value>domainB:8080</param-value><br /> </init-param><br /> </filter><br /> <filter-mapping><br /> <filter-name>CAS Filter</filter-name><br /> <url-pattern>/protected-pattern/*</url-pattern><br /> </filter-mapping><br /> ...<br /> </web-app><br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>对于所有访问满?casTest1/protected-pattern/ 路径的资源时Q都要求?CAS Server dQ如果需要整?casTest1 均受保护Q可以将 url-pattern 指定?#8220;/*”?/p> <p>从清?10 可以看到Q我们可以ؓ CASFilter 指定一些参敎ͼq且有些是必ȝQ?a >? ?1</a> ?a >? ?2</a> 中分别是必需和可选的参数Q?/p> <br /> <a name="表格1|table"><strong>表格 1. CASFilter 必需的参?/strong></a><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="text-align: left; vertical-align: top;"> <strong>参数?/strong> </td> <td style="text-align: left; vertical-align: top;"> <strong>作用</strong> </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.loginUrl </td> <td style="text-align: left; vertical-align: top;"> 指定 CAS 提供d面?URL </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.validateUrl </td> <td style="text-align: left; vertical-align: top;"> 指定 CAS 提供 service ticket ?proxy ticket 验证服务?URL </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.serverName </td> <td style="text-align: left; vertical-align: top;"> 指定客户端的域名和端口,是指客户端应用所在机器而不?CAS Server 所在机器,该参数或 serviceUrl 臛_有一个必L? </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.serviceUrl </td> <td style="text-align: left; vertical-align: top;"> 该参数指定过后将覆盖 serverName 参数Q成为登录成功过后重定向的目的地址 </td> </tr> </tbody> </table> <br /> <br /> <a name="表格2|table"><strong>表格 2. CASFilter 可选参?/strong></a><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="text-align: left; vertical-align: top;"> <strong>参数?/strong> </td> <td style="text-align: left; vertical-align: top;"> <strong>作用</strong> </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.proxyCallbackUrl </td> <td style="text-align: left; vertical-align: top;"> 用于当前应用需要作为其他服务的代理(proxy)时获?Proxy Granting Ticket 的地址 </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.authorizedProxy </td> <td style="text-align: left; vertical-align: top;"> 用于允许当前应用从代理处获取 proxy ticketsQ该参数接受以空格分隔开的多?proxy URLsQ但实际使用只需要一个成功即可。当指定该参数过后,需要修?validateUrl ?proxyValidateQ而不再是 serviceValidate </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.renew </td> <td style="text-align: left; vertical-align: top;"> 如果指定?trueQ那么受保护的资源每ơ被讉K时均要求用户重新q行验证Q而不之前是否已l通过 </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.wrapRequest </td> <td style="text-align: left; vertical-align: top;"> 如果指定?trueQ那?CASFilter 重新包?HttpRequest,q且?getRemoteUser() Ҏq回当前d用户的用户名 </td> </tr> <tr> <td style="text-align: left; vertical-align: top;"> edu.yale.its.tp.cas.client.filter.gateway </td> <td style="text-align: left; vertical-align: top;"> 指定 gateway 属? </td> </tr> </tbody> </table> <br /> <p><a name="N102BB">传递登录用户名</a></p> <p>CAS 在登录成功过后,会给览器回?CookieQ设|新的到?Service Ticket。但客户端应用拥有各自的 SessionQ我们要怎么在各个应用中获取当前d用户的用户名呢?CAS Client ?Filter 已经做好了处理,在登录成功后Q就可以直接?Session 的属性中获取Q如清单 11 所C:</p> <br /> <a name="N102C7"><strong>清单 11. ?Java 中通过 Session 获取d用户?/strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> // 以下两者都可以<br /> session.getAttribute(CASFilter.CAS_FILTER_USER);<br /> session.getAttribute("edu.yale.its.tp.cas.client.filter.user");<br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>?JSTL 中获取用户名的方法如清单 12 所C:</p> <br /> <a name="N102D4"><strong>清单 12. 通过 JSTL 获取d用户?/strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> <c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/><br /> </pre> </td> </tr> </tbody> </table> <br /> <p>另外QCAS 提供了一?CASFilterRequestWrapper c,该类l承自HttpServletRequestWrapperQ主要是重写?getRemoteUser() ҎQ只要在前面配置 CASFilter 的时候ؓ其设|?#8220; edu.yale.its.tp.cas.client.filter.wrapRequest ”参数? trueQ就可以通过 getRemoteUserQ) Ҏ来获取登录用户名Q具体方法如清单 13 所C:</p> <br /> <a name="N102E1"><strong>清单 13. 通过 CASFilterRequestWrapper 获取d用户?/strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);<br /> out.println("The logon user:" + reqWrapper.getRemoteUser());<br /> </pre> </td> </tr> </tbody> </table> <br /> <br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /> <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /> </td> <td valign="top" align="right"><a class="fbox"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="5.效果">效果</a></p> <p>?casTest1 ?casTest2 中,都有一个简?Servlet 作ؓƢ迎面 WelcomPageQ且该页面必ȝ录过后才能访问,面代码如清?14 所C:</p> <br /> <a name="N102F4"><strong>清单 14. WelcomePage 面代码</strong></a><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <pre> <br /> public class WelcomePage extends HttpServlet {<br /> public void doGet(HttpServletRequest request, HttpServletResponse response)<br /> throws IOException, ServletException<br /> {<br /> response.setContentType("text/html");<br /> PrintWriter out = response.getWriter();<br /> out.println("<html>");<br /> out.println("<head>");<br /> out.println("<title>Welcome to casTest2 sample System!</title>");<br /> out.println("</head>");<br /> out.println("<body>");<br /> out.println("<h1>Welcome to casTest1 sample System!</h1>");<br /> CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);<br /> out.println("<p>The logon user:" + reqWrapper.getRemoteUser() + "</p>");<br /> HttpSession session=request.getSession();<br /> out.println("<p>The logon user:" + <br /> session.getAttribute(CASFilter.CAS_FILTER_USER) + "</p>");<br /> out.println("<p>The logon user:" + <br /> session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "</p>");<br /> out.println("</body>");<br /> out.println("</html>");<br /> }<br /> }<br /> <br /> </pre> </td> </tr> </tbody> </table> <br /> <p>在上面所有配|结束过后,分别?AQ?BQ?C上启?casQ?casTest1 ? casTest2Q按照下面步骤来讉K casTest1 ?casTest2Q?/p> <ol type="1"> <li> 打开览器,讉K <a href="http://domainb:8080/casTest1/WelcomePage">http://domainB:8080/casTest1/WelcomePage</a> Q浏览器会弹出安全提C,接受后即转到 CAS 的登录页面,如图 2 所C:</li> </ol> <br /> <a name="_Ref188554660"><strong>?2. CAS d面</strong></a><br /> <img alt="CAS d面" src="http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image002.jpg" width="553" height="351" /> <br /> <ol type="1"> <li> d成功后,再重定向?casTest1 ?WelcomePage 面Q如<a >? </a> 所C:</li> </ol> <br /> <a name="_Ref188552289"><strong>?3. d后访?casTest1 的效?/strong></a><br /> <img alt="d后访?casTest1 的效? src="http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image003.jpg" width="554" height="315" /> <br /> <p>可以看到<a >? </a> 中地址栏里的地址多出了一?ticket 参数Q这是 CAS 分配l当前应用的 ST(Service Ticket)?/p> <ol type="1"> <li> 再在同一个浏览器的地址栏中输入 <a href="http://domainb:8080/casTest1/WelcomePage">http://domainC:8080/casTest2/WelcomePage</a> Q系l不再提C用L录,而直接出现如?4 所C的面Qƈ且显C在 casTest1 中已l登录过的用戗?/li> </ol> <br /> <a name="N1034A"><strong>?4. ?casTest1 中登录过后访?casTest2 的效?/strong></a><br /> <img alt="?casTest1 中登录过后访?casTest2 的效? src="http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image004.jpg" width="553" height="307" /> <br /> <ol type="1"> <li> 重新打开一个浏览器H口Q先输入 <a href="http://domainb:8080/casTest1/WelcomePage">http://domainC:8080/casTest2/WelcomePage</a> Q系l要求登录,在登录成功过后,正确昄 casTest2 的页面。之后再在地址栏重新输?<a href="http://domainb:8080/casTest1/WelcomePage">http://domainB:8080/casTest1/WelcomePage</a> Q会直接昄 casTest1 的页面而无需再次d?/li> </ol> <br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /> <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /> </td> <td valign="top" align="right"><a class="fbox"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="6.l束?>l束?/a></p> <p>本文介绍?CAS 单点d解决Ҏ的原理,q结合实例讲解了?Tomcat 中?CAS 的配|、部|方法以及效果。CAS 是作为开源单点登录解x案的一个不错选择Q更多的使用l节可以参?CAS 官方|站?/p> <br /> <br /> <p><a name="resources">参考资?</a></p> <ul> <li> 有关 CAS 斚w的信息, 请参?a >CAS 官方|站</a>? <br /> <br /> </li> <li> 览<a >JA-SIG C֌</a>Q与C֌分n Java 技术? </li> </ul> <br /> <br /> <p><a name="author">作者简?/a></p> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td colspan="3"><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="5" /></td> </tr> <tr valign="top" align="left"> <td><br /> </td> <td><img alt="" src="http://www.ibm.com/i/c.gif" width="4" height="5" /></td> <td width="100%"> <p>张涛QIBM 中国软g开发实验室工程师,目前主要致力于基?Rational q_解决Ҏ的开发?/p> </td> </tr> </tbody> </table> <br /> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td colspan="3"><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="5" /></td> </tr> <tr valign="top" align="left"> <td><br /> </td> <td><img alt="" src="http://www.ibm.com/i/c.gif" width="4" height="5" /></td> <td width="100%"> <p>王秉坤,IBM 中国软g开发实验室工程师,目前主要致力于基?Rational q_解决Ҏ的开发?/p> </td> </tr> </tbody> </table> <br /> </span> <img src ="http://m.tkk7.com/1504/aggbug/219699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/1504/" target="_blank">weesun一c阳?/a> 2008-08-03 15:19 <a href="http://m.tkk7.com/1504/archive/2008/08/03/219699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国电信讑֤采购评分pȝhttp://m.tkk7.com/1504/archive/2008/07/17/215528.htmlweesun一c阳?/dc:creator>weesun一c阳?/author>Thu, 17 Jul 2008 08:21:00 GMThttp://m.tkk7.com/1504/archive/2008/07/17/215528.htmlhttp://m.tkk7.com/1504/comments/215528.htmlhttp://m.tkk7.com/1504/archive/2008/07/17/215528.html#Feedback0http://m.tkk7.com/1504/comments/commentRss/215528.htmlhttp://m.tkk7.com/1504/services/trackbacks/215528.html go go!








后记Q?br /> 中国电信讑֤采购评分pȝ是中国电信集团公司在奥运前的一个重要项目,也算是咱为奥q做贡献吧!自己亲nl历了项目开始到技术的每一个忙的日日夜夜Q项目后期,汶川大地震发生,5?2日当时正?8楼开会,讨论目相关的事情,至今记忆深刻?br /> H然接到北京的朋友发来的短信说地震了Q问我有没有感觉刎ͼ说实话,当时q没有感觉到Q后来看报纸说广?0层以上才有觉察,本以为是虚惊一场,没有惛_ 刻间无数生命逝去?br /> 一时后,|上全是关于汶川大地震的报道Q才知道出大事了。赶紧打l在成都和西安的朋友Q却一个都没有打通,都是不在服务区,自己从心底里印证q可能是一 场我们都没有惛_的巨大的N性地震?br /> 晚上会到Ӟ打开电视Q印证了猜测的正性?br /> 之后电视Q网l全是关于汶川地震的报道Q和全国人民聚全国之力赈灄事情Q真惛_灑֌救灾的冲动?br /> 5?5日早?点爬hQ跟同事一起去体育中心献血Q排了半个多时的队伍,被告在血库已l满了,我们只能先登讎ͼ留下联系方式Q待~Z旉知。很? 憾,没有能尽上一点微薄的力量Q但是还是很高兴Q因为明白,全民都在力Q?br /> 5?5日下午,捐了100块,公司的所有同事都捐了Qƈ且都是自愿的Q能力有限,一份能的力量吧!
5?9日,全国哀悼日Q我们也暂时停下目工作Q公司全体同事一h力默哀Q整个城市沉在汽笛马达响v的哀思中?br /> 愿死者安息,生者更加坚?
q是我毕业一q之际经历的目Q工作了一q_在公司结识好多朋友,大家周末一h球Q一LQ学C很多东西Qؓ人处事,也从刚毕业的毛头子逐渐的长 大?br /> 都说公司学做事Q大公司学做人,目前q没有进q大公司Q没有发a权,但是在自q公司Q却是过的很开心,也很充实Q我惛_司的大与都不最重要Q重要的 是你能学C么,你能做什么,你可以做C么?br /> 我有自己的理惻I我也有自q目标Q感谢这一q里朋友们和同事们的帮助Q我会努力的Q加油!
我深爱我的公司!q是我的一个家
Q?

]]>
վ֩ģ壺 Ʒަv| һƵ| պƷһ | AVר߲| | ޳aƬ߹ۿձ鶹| aëƬaëƬ| ҳƷ˿| ۺר| ѹۿ| ޹һaëƬ| պѹۿһ| AVƬ߹ۿ| ˳Ƶ| 91޹˾Ʒ| þóaëƬѹۿվ| ˾Ʒձר| ƷƵ| ҹƵ| Ʒһ | ƬAëƬ鴤 | һ| Ƭѿ| aѹۿþav| ޹˾þۺ3d| õ߳| ձ| һһëƬѲ| ¹AVר| Ƶۿ| 99ֻоƷѲ| Ů߹ۿ| žžƵ| 96ѾƷƵ߹ۿ| һƵ| þþþþaŷa| ޹ۺ߾Ʒ| Ů18һëƬѹۿ| һëƬѿ| þҹ³˿Ƭ| xvideos|