??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品一区二区三区香蕉,蜜臀久久99精品久久久无需会员,国产精品资源网站http://www.aygfsteel.com/steady/category/23663.htmlzh-cnSun, 27 Feb 2011 18:40:13 GMTSun, 27 Feb 2011 18:40:13 GMT60IntelliJ IDEA 10.0 注册?注册?keygen/破解?/title><link>http://www.aygfsteel.com/steady/archive/2010/12/18/341047.html</link><dc:creator>steady</dc:creator><author>steady</author><pubDate>Sat, 18 Dec 2010 01:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/steady/archive/2010/12/18/341047.html</guid><wfw:comment>http://www.aygfsteel.com/steady/comments/341047.html</wfw:comment><comments>http://www.aygfsteel.com/steady/archive/2010/12/18/341047.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/steady/comments/commentRss/341047.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/steady/services/trackbacks/341047.html</trackback:ping><description><![CDATA[IntelliJ IDEA 10.0 发布?jin),攑և?IntelliJ IDEA 10.0 的注册机下蝲?a target="_blank">点击</a><font color="#002c99"><a ><font color="#002c99">下蝲</font></a></font> <img src ="http://www.aygfsteel.com/steady/aggbug/341047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/steady/" target="_blank">steady</a> 2010-12-18 09:56 <a href="http://www.aygfsteel.com/steady/archive/2010/12/18/341047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp-api.jar 引发的页面编译错?/title><link>http://www.aygfsteel.com/steady/archive/2009/08/17/291523.html</link><dc:creator>steady</dc:creator><author>steady</author><pubDate>Mon, 17 Aug 2009 09:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/steady/archive/2009/08/17/291523.html</guid><wfw:comment>http://www.aygfsteel.com/steady/comments/291523.html</wfw:comment><comments>http://www.aygfsteel.com/steady/archive/2009/08/17/291523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/steady/comments/commentRss/291523.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/steady/services/trackbacks/291523.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt">  Z(jin)~译方便我把 servlet-api.jar ?jsp-api.jar 和其?jar 包都攑֜一P?ant build 的时候就?x)一q被拷到 Web 目?WEB-INF/lib 下,不过q次因此出现?jin)一?jsp 面的编译错误,所有的 jsp 面打开都会(x)在页面上报编译错误,后台无Q何信息。考虑?jsp 面的编译可能和 jsp-api.jar 有关Q于是将 WEB-INF/lib 下的 servlet-api.jar ?jsp-api.jar U走Q问题解冟?/span></p> <p><span style="font-size: 10pt">  后来发现攑֜里面的这两个包是 tomcat5.5 的,?JSP 2.0 规范的,而部|的服务器是 tomcat 6.0 ?JSP 2.1 规范的,两者可能有一定的冲突Q才Dq样的错误?/span></p> <img src ="http://www.aygfsteel.com/steady/aggbug/291523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/steady/" target="_blank">steady</a> 2009-08-17 17:22 <a href="http://www.aygfsteel.com/steady/archive/2009/08/17/291523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单的玩了(jin)下BeanShellhttp://www.aygfsteel.com/steady/archive/2009/02/26/256741.htmlsteadysteadyThu, 26 Feb 2009 01:56:00 GMThttp://www.aygfsteel.com/steady/archive/2009/02/26/256741.htmlhttp://www.aygfsteel.com/steady/comments/256741.htmlhttp://www.aygfsteel.com/steady/archive/2009/02/26/256741.html#Feedback1http://www.aygfsteel.com/steady/comments/commentRss/256741.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/256741.html  Z(jin)实现工作中对脚本的支持Q简单的玩了(jin)一?BeanShellQ这个小的嵌入?Java 代码解释器可以将  Java 语言像动态脚本一h行,几行命o(h)Q它?yu)p把一D?Java 代码l玩转?/span>

  工作中有个q样的简单案例,当一W单子金额大?50万时Q应该将d分配l?Senior Agent 处理Q否则交l?Junior Agent 处理Q我们用 BeanShell 单模拟这D脚本?/span>

    public static void main(String[] args) throws Exception {
        Interpreter i = new Interpreter();
        i.set(”price”, 1000000);
        i.set(”user”, “”);
        i.eval(”if(price > 500000)\n” +
                “user = \”SeniorAgent\”;\n” +
                “else \n” +
                “user = \”JuniorAgent\”;”);
        System.out.println(i.get(”user”));
    } 

  q行l果是打印出?jin)?x)SeniorAgent

  可以看出QBeanShell 用非常动态化的方式,完成?jin)我们一个简单的案例的处理,q里Q我们只需要将需要解析的 Java 语言的脚本交l?BeanShell ?InterceptorQƈ把脚本中用到的参数g入,可以了(jin)Q最后,我们把运结果赋l一个变量,然后获取变量l果Q就可以?jin)?/span>

  看到 Developer Works |站上有一?BeanShell 实现公式理的文章:(x)http://www.ibm.com/developerworks/cn/java/l-formula/index.htmlQ可以参考一下?br />
From:
http://www.steadyxp.com/archives/851.html



steady 2009-02-26 09:56 发表评论
]]>
HttpClientq接的强刉?/title><link>http://www.aygfsteel.com/steady/archive/2009/02/23/256206.html</link><dc:creator>steady</dc:creator><author>steady</author><pubDate>Mon, 23 Feb 2009 05:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/steady/archive/2009/02/23/256206.html</guid><wfw:comment>http://www.aygfsteel.com/steady/comments/256206.html</wfw:comment><comments>http://www.aygfsteel.com/steady/archive/2009/02/23/256206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/steady/comments/commentRss/256206.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/steady/services/trackbacks/256206.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>  服务器上?HttpClient q程调用另一台服务器的一些资源,但是?netstat 查看l常出现?jin)很多?CLOSE_WAIT 的连接,最后追查原因,是因?HttpClient ?method.releaseConnection() q不是强刉放连接,Z(jin)减小q接敎ͼ使用?jin)如下解x案。在 HttpClient 完成h后的 finally 块里面这么写?/span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>    } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>finally</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>           </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> (method != </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>) {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>                  method.releaseConnection();</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> (Exception e) {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>                  </span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #0000c0; font-family: "Courier New";'>logger</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>.error(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";'>"-------> Release HTTP connection exception:"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>, e);</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              }</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>           }</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>           </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> (client != </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>) {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>                  ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown();</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'> (Exception e) {</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>                  </span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #0000c0; font-family: "Courier New";'>logger</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>.error(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";'>"-------> Close HTTP connection exception:"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>, e);</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              }</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>              client = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'" mce_style='font-size: 10pt; color: #7f0055; font-family: "Courier New";'>null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>;</span></p> <p style="margin: 0cm 0cm 0pt; text-align: left" align="left" mce_style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>           }</span></p> <p style="margin: 0cm 0cm 0pt" mce_style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: black; font-family: 'Courier New'" mce_style='font-size: 10pt; color: black; font-family: "Courier New";'>       }</span></p> <br /> 原文Q?a >http://www.steadyxp.com/archives/832.html</a> <img src ="http://www.aygfsteel.com/steady/aggbug/256206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/steady/" target="_blank">steady</a> 2009-02-23 13:49 <a href="http://www.aygfsteel.com/steady/archive/2009/02/23/256206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM 整合 Drools(JBoss Rule) - 整合角色分配http://www.aygfsteel.com/steady/archive/2008/09/05/227236.htmlsteadysteadyFri, 05 Sep 2008 07:29:00 GMThttp://www.aygfsteel.com/steady/archive/2008/09/05/227236.htmlhttp://www.aygfsteel.com/steady/comments/227236.htmlhttp://www.aygfsteel.com/steady/archive/2008/09/05/227236.html#Feedback0http://www.aygfsteel.com/steady/comments/commentRss/227236.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/227236.html  jBPM 是一个非怼U的开源工作流引擎Q虽然他不是一个一站式的工作流q_Q不q它已经为我们提供了(jin)比较丰富的底层操作,Z(jin)满特定的项目需求,我们一般需要对其进行二ơ开发,才能适用于具体的业务需求?/span>

  其中一个主要的扩展Ҏ(gu)针对 TaskNode q行的用L(fng)分配。TaskNode ?jBPM 中一个非帔R要的概念Q一个Q务节点可以包含若q个dQ不同的d可以׃同的人来完成QQ务实例被分配l?actorId 来完成,其中指定Ch的分配工作就?Assignment 要处理的Q这也是我们需要定制的功能Qؓ(f)?jin)实现用L(fng)分配Q我们需要实?AssignmentHandler 接口Q接口原型如下?/span>

public interface AssignmentHandler extends Serializable {    
    void assign(Assignable assignable, ExecutionContext executionContext) throws Exception;
}

  通常用代码实现的话,我们可以让一个类实现q个接口Qƈ?swimlane 或?tasknode 中的 assignment 指定该类。但是,q样的灵zL是昄不够的,在系l的使用q程中,分配{略?x)不断的q行调整Q因此我们需要更为灵zȝ解决Ҏ(gu)QjBPM 本n可以使用Z Bean Shell 的脚本来写分配策略,但是 Bean Shell 不是那么强大Q我们需要更为强大的解决Ҏ(gu)Q因此,我们选用?jin)已l被 JBoss 收ؓ(f)旗下?JBoss Drools 4.0 规则引擎 (?3.0 的时候曾l改名ؓ(f) JBoss RulesQ?.0 又改回来?

  完整版本h看:(x)http://www.steadyxp.com/archives/120.html



steady 2008-09-05 15:29 发表评论
]]>
用JavaWeb应用中URL上包含的jsessionidhttp://www.aygfsteel.com/steady/archive/2007/09/08/143664.htmlsteadysteadySat, 08 Sep 2007 12:13:00 GMThttp://www.aygfsteel.com/steady/archive/2007/09/08/143664.htmlhttp://www.aygfsteel.com/steady/comments/143664.htmlhttp://www.aygfsteel.com/steady/archive/2007/09/08/143664.html#Feedback4http://www.aygfsteel.com/steady/comments/commentRss/143664.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/143664.htmlJava Web 应用gLq样的情况,有事没事L要在 URL 后面加上?jsessionidQ而且g不能使用配置的方式直接禁?URL 传?sessionidQ这P比较容易造成安全性的问题Q或者在览器地址栏里留下一堆很不好看的地址Q在 Struts2 中,使用?url 标签的所?a style="color: #8ab037" target="_blank">链接Q甚?CSS, JS q样的东西,都会(x)加上 jsessionidQ如何去用呢,搜烦(ch)国内的相x章,无功而返Q询问我们过ȝ架构师,也没有做q,只好惛_法去扑֛外的|站Q找C(jin)q样的一文章?br />
http://randomcoder.com/articles/jsessionid-considered-harmful

通过加入 Filter 的方式过滤掉 URL 中包含的 jsessionidQ再重新包装 Response q回l浏览器?br />
因ؓ(f)没有太多东西Q就不多解释?jin),大家拿?jin)用就可以?jin)?br />
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Servlet filter which disables URL-encoded session identifiers.
 * <p/>
 * <pre>
 * Copyright (c) 2006, Craig Condit. All rights reserved.
 * <p/>
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * <p/>
 *   * Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 * <p/>
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * </pre>
 
*/
@SuppressWarnings(
"deprecation")
public class DisableUrlSessionFilter implements Filter {

    
/**
     * Filters requests to disable URL-based session identifiers.
     
*/
    
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
// skip non-http requests
        if (!(request instanceof HttpServletRequest)) {
            chain.doFilter(request, response);
            
return;
        }

        HttpServletRequest httpRequest 
= (HttpServletRequest) request;
        HttpServletResponse httpResponse 
= (HttpServletResponse) response;

        
// clear session if session id in URL
        if (httpRequest.isRequestedSessionIdFromURL()) {
            HttpSession session 
= httpRequest.getSession();
            
if (session != null) session.invalidate();
        }

        
// wrap response to remove URL encoding
        HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(httpResponse) {
            @Override
            
public String encodeRedirectUrl(String url) {
                
return url;
            }

            @Override
            
public String encodeRedirectURL(String url) {
                
return url;
            }

            @Override
            
public String encodeUrl(String url) {
                
return url;
            }

            @Override
            
public String encodeURL(String url) {
                
return url;
            }
        };

        
// process next request in chain
        chain.doFilter(request, wrappedResponse);
    }

    
/**
     * Unused.
     
*/
    
public void init(FilterConfig config) throws ServletException {
    }

    
/**
     * Unused.
     
*/
    
public void destroy() {
    }

-------------------------------------------------------------------------------------------------
Z做个?a style="color: #8ab037" target="_blank">q告 铑֮中国 www.linkedcast.cn 上线q行Q欢q广?Blogger 使用
铑֮中国Q写文章也可以赚钱哦

steady 2007-09-08 20:13 发表评论
]]>
Struts2 整合 Discuz 论坛 (1)http://www.aygfsteel.com/steady/archive/2007/08/11/136046.htmlsteadysteadySat, 11 Aug 2007 09:30:00 GMThttp://www.aygfsteel.com/steady/archive/2007/08/11/136046.htmlhttp://www.aygfsteel.com/steady/comments/136046.htmlhttp://www.aygfsteel.com/steady/archive/2007/08/11/136046.html#Feedback2http://www.aygfsteel.com/steady/comments/commentRss/136046.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/136046.html因ؓ(f)有一?Struts2 |站发布Q需要整合一个论坛来使用Q公司的一个项目过Ll整合过一个英文论坛,但似乎不能满x们的需求,需要找一个成熟稳定的中文论坛Q与我们的系l结合?br>
最l选择?Discuz 作ؓ(f)我们的论坛系l,主要是因为它提供?jin)一套可用的 Passport APIQ来直接与我们现有系l进行整合?br>
下面摘录 Discuz 文档中的内容来说明整合原理,随后的几中Q将详细描述具体的整合过E?br>

假设已设|如下变量或参数

  • 挂接 Discuz! Passport 的应用程序假设ؓ(f)一?PHP 语言~写?CMS pȝ
  • Discuz! ?URL ?http://www.myforums.com
  • 应用E序?URL ?http://www.mywebsite.com
  • 应用E序的注册页面ؓ(f) http://www.mywebsite.com/register.php
  • 应用E序的登录页面ؓ(f) http://www.mywebsite.com/login.php?action=login
  • 应用E序的退出页面ؓ(f) http://www.mywebsite.com/login.php?action=logout

开启通行证后的用L(fng)录流E?

  • 如果用户在论坛点?#8220;d”Q则转向C先设|好的应用程序登录页面(http://www.mywebsite.com/login.php?action=loginQ,q在d面?URL 中加入参?forwardQ加?forward 后的链接例如 http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.phpQ,用于在登录后用户导向到指定?URL?br>
  • 应用E序收到此请求后Q按照惯例生成表单,q?u>增加一个表单变量,?GET 方式传递过来的 forward 参数通过表单q行传递?/u>

  • 用户在应用程序的表单中填写登录信息,q提交到应用E序的登录验证程序。应用程序验证用h交的用户名和密码的合法性:(x)

    • 如果不通过Q提C用户名密码错误Q要求其q回上一重新填写?br>
    • 如果通过Q需要进行如下操作:(x)

      • 讄自n Cookie ?SessionQ得应用程序自w处于登录状态?br>
      • (g)查表单中是否提交?forward 变量Q如有,则意味着dh可能是由论坛而来Q将此变量传递到后面的请求中。如没有Q自行生?forward 变量Q得论坛登录后能够跌{回到应用E序中?/u>

      • 通过 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,登录请求传递到论坛q行处理。其?auth 用来用户信息与资料以特定的格式Q加密传递给论坛Qforward 用于告知论坛 Passport API 完成自n操作后{向到?URL 地址Qverify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说明?/u>


  • Discuz! Passport API 在接收到由应用程序通过 header() 提交q来的请求后Q进行如下操作:(x)

    • Ҏ(gu) verify 判断 auth ?forward 变量是否合法Q如合法则l,否则l止?br>
    • ?auth Ҏ(gu)既定法解密Qƈq原成数l,数组的内容与格式在后面q行说明。根据数l中的内容,(g)查此用户是否存在。如存在Q则Ҏ(gu)上述数组中的内容 UPDATE 论坛中相应的用户资料。如不存在,则用数l中的信?INSERT 到论坛用戯料表中?br>
    • 论坛讄 Cookie ?SessionQ得论坛自w处于登录状态?br>
    • Ҏ(gu)应用E序反馈?forward |通过 header('Location: http://xxx') 的Ş式将面跌{?forward 变量指定?URL?/li>


  • xQ登录流E结?/li>

开启通行证后的用户退出流E?

  • 如果用户在论坛点?#8220;退?#8221;Q则转向C先设|好的应用程序退出页面(http://www.mywebsite.com/login.php?action=logoutQ,q在d面?URL 中加入参?forwardQ例?http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.phpQ,用于在退出后用户导向到指定?URL?br>
  • 应用E序收到此请求后Q清除自w?Cookie ?SessionQ得应用程序自w处于非d状态?br>
  • (g)查是否提交了(jin) forward 变量Q如有,则意味着dh可能是由论坛而来Q将此变量传递到后面的请求中。如没有Q自行生?forward 变量Q得论坛登录后能够跌{回到应用E序?/u>?br>
  • 通过 header('Location: http://www.myforums.com/api/passport.php?action=logout&forward=http://yyy&verify=zzz') 的方式,退?gu)求传递到论坛q行处理。其?forward 用于告知论坛 Passport API 完成自n操作后{向到?URL 地址Qverify 用于验证 forward 变量的有效性。forward、verify 格式与结构将在后面进行说?/u>?br>
  • Discuz! Passport API 在接收到由应用程序通过 header() 提交q来的请求后Q进行如下操作:(x)

    • Ҏ(gu) verify 判断 forward 变量是否合法Q如合法则l,否则l止?br>
    • 清楚论坛?Cookie ?SessionQ得论坛自w处于非d状态?br>
    • Ҏ(gu)应用E序反馈?forward |通过 header('Location: http://xxx') 的Ş式将面跌{?forward 变量指定?URL?/li>


  • xQ退出流E结束?/li>

开启通行证后的用h册流E?

  • 如果用户在论坛点?#8220;注册”Q则转向C先设|好的应用程序注册页面(http://www.mywebsite.com/register.phpQ,q在注册面?URL 中加入参?forwardQ例?http://www.mywebsite.com/register.php?forward=http://www.myforums.com/index.phpQ,用于在注册后用户导向到指定?URL

  • 应用E序收到此请求后Q按照惯例生成表单,q?u>增加一个表单变量,?GET 方式传递过来的 forward 参数通过表单q行传?/u>

  • 用户在应用程序的表单中填写注册信息,q提交到应用E序的注册验证程序。应用程序验证用h交信息的完整性和合法性:(x)

    • 如果不通过Q提C其问题所在,要求其返回上一重新填?br>
    • 如果通过Q需要进行如下操作:(x)

      • 用戯料插入到应用E序自n用户数据库中

      • 讄自n Cookie ?SessionQ得应用程序自w处于登录状?br>
      • (g)查表单中是否提交?forward 变量Q如有,则意味着注册h可能是由论坛而来Q将此变量传递到后面的请求中。如没有Q自行生?forward 变量Q得论坛注册后能够跌{回到应用E序?/u>

      • 通过 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,注册请求传递到论坛q行处理。其?auth 用来用户信息与资料以特定的格式Q加密传递给论坛Qforward 用于告知论坛 Passport API 完成自n操作后{向到?URL 地址Qverify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说?/u>


  • Discuz! Passport API 在接收到由应用程序通过 header() 提交q来的请求后Q进行如下操作:(x)

    • Ҏ(gu) verify 判断 auth ?forward 变量是否合法Q如合法则l,否则l止

    • ?auth Ҏ(gu)既定法解密Qƈq原成数l,数组的内容与格式在后面q行说明。根据数l中的内容,(g)查此用户是否存在。如存在Q则Ҏ(gu)上述数组中的内容 UPDATE 论坛中相应的用户资料。如不存在,则用数l中的信?INSERT 到论坛用戯料表?br>
    • 论坛讄 Cookie ?SessionQ得论坛自w处于登录状?br>
    • Ҏ(gu)应用E序反馈?forward |通过 header('Location: http://xxx') 的Ş式将面跌{?forward 变量指定?URL


  • xQ注册流E结?

    本部分中Q加下划U显C的部分Q是需要对(zhn)的应用E序q行更改的部分,事实上,q部分更改会(x)非常Ҏ(gu)和方ѝ?/strong>



steady 2007-08-11 17:30 发表评论
]]>
Quartz 目应用W记-补充http://www.aygfsteel.com/steady/archive/2007/08/03/134149.htmlsteadysteadyFri, 03 Aug 2007 01:00:00 GMThttp://www.aygfsteel.com/steady/archive/2007/08/03/134149.htmlhttp://www.aygfsteel.com/steady/comments/134149.htmlhttp://www.aygfsteel.com/steady/archive/2007/08/03/134149.html#Feedback4http://www.aygfsteel.com/steady/comments/commentRss/134149.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/134149.htmlReschedule
rescheduleJob(String triggerName, String groupName, Trigger newTrigger)

在进?reschedule 操作的时候,我们通常只需要修?Trigger 的时_(d)q时候我们只需要重?new 一个含有新?Schedule 旉?Trigger 对象Qreschedule 一下就可以?jin)?/p>

Unschedule
unscheduleJob(String triggerName, String groupName)

q行 unschedule 的时候,我们只需要知道名字和 group 可以了(jin)?/p>

q行 Schedule 操作前后QDatabase 中的相关数据都会(x)被更改,在执?unschedule 或者该 schedule 已经执行q,数据库中?trigger 信息都会(x)被删除?/p>

steady 2007-08-03 09:00 发表评论
]]>
Quartz 目应用W记http://www.aygfsteel.com/steady/archive/2007/08/02/134017.htmlsteadysteadyThu, 02 Aug 2007 08:28:00 GMThttp://www.aygfsteel.com/steady/archive/2007/08/02/134017.htmlhttp://www.aygfsteel.com/steady/comments/134017.htmlhttp://www.aygfsteel.com/steady/archive/2007/08/02/134017.html#Feedback4http://www.aygfsteel.com/steady/comments/commentRss/134017.htmlhttp://www.aygfsteel.com/steady/services/trackbacks/134017.htmlQuartz 是一个强大的企业U?Schedule 工具Q也是目前最好的开?/font> Schedule 工具Q最q因为项目的需要,单的用到?Quartz 的一些功能,寚w目中使用 Quartz 的一些问题做单的记录?/p>

?Quartz 的应用中Q我们用C(jin)以下的一些东西,ScheduleFactory, Scheduler, Job, JobDetail, TriggerQ简单说明一下他们的用途?/p>

SchedulerFactory ?Scheduler 的工厂,我们可以从中获得受工厂管理的 Scheduler 对象?br>
SchedulerFactory scheduleFactory = new StdSchedulerFactory();
Scheduler scheduler = scheduleFactory.getScheduler();

Scheduler 是一个计划集Q其中可以包含多?JobDetail ?Trigger l成的计划Q务?br>我们可以?SchedulerFactory 中取?Scheduler?/p>

接口Job是每个业务上需要执行的d需要实现的接口Q该接口只有一个方法:(x)

public interface Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException;
}

我们可以在里面定义我们的 Job 执行逻辑Q比如清除过期数据,更新~存{?/p>

JobDetail描述?jin)一个Q务具体的信息Q比如名Uͼl名{等?br>JobDetail jobDetail = new JobDetail("SayHelloWorldJob", Scheduler.DEFAULT_GROUP, SayHelloWorldJob.class);
在上面的构造方法中Q第一个是d的名UͼW二个是l名Q第三个是实际当Q务需要执行的回调cR?/p>

Trigger֐思义是触发器,Quartz有个很好的想法就是分M(jin)d和Q务执行的条g。Trigger是控制d执行条g的类Q当Trigger认ؓ(f)执行条g满的时刻,Trigger?x)通知相关的JobL行。分ȝ好处是:(x)
1.你可以ؓ(f)某个Job兌多个TriggerQ其中Q何一个条件满都可以触发job执行Q这样可以完成一些组合的高触发条g
2.当Trigger失效后(比如Q一个永q都不能满的条Ӟ(j)Q你不必d明一个新的jobQ代替的是你可以为job兌一个新的Trigger让job可以l箋执行?/p>

目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,SimpleTrigger用来完成一些比如固定时间执行的dQ比如:(x)从现在开?分钟后等{;而CronTrigger(没错Q和unix的cronq程的含意一?用来执行calendar-like的Q务,比如Q每周五下午3Q?0Q每月最后一天等{?/p>

在我们项目中Q都是一些固定时间的 JobQ所以只用到?SimpleTrigger?br>Trigger trigger = new SimpleTrigger("SayHelloWorldJobTrigger",Scheduler.DEFAULT_GROUP,new Date(),null,0,0L);
q个构造方法中Q第一个是Trigger的名UͼW二个是Trigger的组名,W三个是d开始时_(d)W四个是l束旉Q第五个是重复次敎ͼ使用SimpleTrigger.REPEAT_INDEFINITELY帔R表示无限ơ)(j)Q最后一个是重复周期Q单位是毫秒Q,那么q样创Z(jin)一个立dƈ只执行一ơ的d?/p>

但我们定义好?JobDetailQJobQ和 Trigger 后,可以开?Schedule 一?Job ?jin)?/p>

scheduler.scheduleJob(jobDetail, trigger);

q条语句是把job和Trigger兌Q这样当Trigger认ؓ(f)应该触发的时候就?x)调用(实际上是Scheduler调用Qjob.executeҎ(gu)?jin)?/p>

scheduler.start();
千万别忘?jin)加上上面的语句Q这条语句通知Quartz使安排的计划生效?/p>

关于executeҎ(gu)的参数JobExecutionContext
JobExecutionContext和很多Contextl尾的类功能一P提供的运行时ȝ上下文环境,JobExecutionContext中有Scheduler,JobDetail,Trigger{很多对象的引用Q从而当你在executeҎ(gu)内部需要这些对象的时刻提供的便利?/p>

在项目中Q我们把需要执行的 Job 相对应的一些信息放?JobExecutionContext 中,?Job 执行的时候可以调用?br>
jobDetail.getJobDataMap().put(userid, id);

?Job 中,我们可以拿到相关?Context 信息Q?br>
jobExecutionContext.getJobDetail().getJobDataMap().getInt(userid);

JobDetail和Trigger的name和group
Scheduler实例对应?jin)很多job和trigger的实例,Z(jin)方便的区分,Quartz使用name和groupq两个特性,正如你想向的一P同一个group下不能有两个相同name的JobDetailQTrigger同理Q同一个Scheduler下不能有两个相同group的JobDetail,Trigger同理QJobDetail和Trigger的完全限定名为:(x)group + name

Z(jin)让服务器重启以后Q我们的 Scheduler 信息仍然不丢失,我们通常采用数据库持久化 Scheduler 的信息?br>DBScript ?Quartz 的下载包中的Qquartz-1.6.0\docs\dbTables 下,选择自己使用?DB 相应?Script 导入数据库就可以?jin)?br>在应用中Q我们需要配|一?quartz.properties 才能正常使用 DB。我们可以在 quartz-1.6.0\examples\example10 中找到该文g的样例,E作一些修改,可以放到自己项目源码的根目录下使用?jin)?br>
讄 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 卛_启用Z JDBC ?Quartz 信息持久化?br>
Ҏ(gu)目情况讄以下配置信息Q?br>org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/myapplication
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password =
org.quartz.dataSource.myDS.maxConnections = 5

但是光设|了(jin) Database 不够Q我们还需要在 Application 启动的时候自动启?Scheduler 才行Q我们只需要简单的写一?Servlet ?Listener q在 web.xml 中声明该 Listener Q在 Servlet Ҏ(gu)启动的时候,Scheduler 开始自动执行?/p>

public class ScheduleStartListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        try {
           scheduleFactory.getScheduler().start();
        } catch (SchedulerException e) {
           // write log
        }
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        try {
           scheduleFactory.getScheduler().shutdown();
        } catch (SchedulerException e) {
           // write log
        }
    }
}

?web.xml 里面加入以下配置Q?br><listener>
    <listener-class>org.agilejava.scheduler.ScheduleStartListener</listener-class>
</listener>

以上单的记录?jin)在目中关?Quartz 的一些应用,如果有什么新的用心(j)得,?x)在后面l箋加入的?/p>

steady 2007-08-02 16:28 发表评论
]]>
վ֩ģ壺 üɽ| ˮ| | | | | ̨| ¡| | ī| պ| | | | | | | Ӵ| Ӣ| | | º| Ǧɽ| | | ¡| | Ұ| | ԭƽ| | | | | ߺ| ʡ| | | | ΢| |