烦恼岁月

付出总是有回报的 take action follow your heart , or follow your head
posts - 40, comments - 5, trackbacks - 0, articles - 4

2007年11月13日

自动地可视化表示数据库也可以让您受益匪浅。实体关系图(ERD)是实现数据库可视化的最流行的图示类型。大多数创建 ERD 的工具(例如,ERWinfor)都需要手动生成 ERD。虽然我将要示范的工具 SchemaSpy 无法与现存的一些更复杂的工具媲美,但是它能够提供数据库的高级 ERD 视图 — 以及约束、关系等。而且,通过自动构建来运行它,您就可以轻松地从您的版本控制库中检查数据定义语言(Data Definition Language,DDL)的最新显示。

Ant 脚本使用 SchemaSpy 工具来创建 Javadoc 格式的文件:

结合使用 SchemaSpy、Ant 和 Javadoc

<property name="reports.dir" value="${basedir}"/>
<java jar="schemaSpy_3.1.1.jar"
  output="${reports.dir}/output.log"
  error="${reports.dir}/error.log"
  fork="true">
  <arg line="-t mysql"/>
  <arg line="-host localhost"/>
  <arg line="-port 3306"/>
  <arg line="-db brewery"/>
  <arg line="-u root"/>
  <arg line="-p sa"/>
  <arg line="-cp mysql-connector-java-5.0.5-bin.jar"/>
  <arg line="-o ${reports.dir}"/>
</java>

 

使用 java Ant 任务调用 SchemaSpy,传递了很多属性:

  • -t 为数据库类型(有效值为 mysqloradb2,等等。)
  • -host 为托管数据库的计算机名。
  • -port 为数据库 URL 的端口数。
  • -u 为数据库用户名。
  • -p 为数据库密码。
  • -cp 为类路径(用于指示数据库驱动程序 JAR 文件的位置)。
  • -o 为输出目录的位置。

这些 SchemaSpy 的命令行属性用于生成显示 ERD 的 HTML 文件

通过结合使用多种工具、作为构建的一部分针对数据库执行 ERD 生成脚本,并调度 ERD 生成,您就可以在开发过程中轻松、快速地做出很多数据库决策。

另外,对于喜欢maven的同学,SchemaSpy  也提供了plugin

http://maven.wakaleo.com/mojo/maven-schemaspy-plugin/faq.html

posted @ 2010-05-16 16:16 不需要解释 阅读(381) | 评论 (0)编辑 收藏

     参加工作也已经5年多了,一直想回头回想一下自己,然后动笔写下来,一来是自己目前还可以记忆起一些事情,等自己将来老了,可以看看这些东西回忆回忆。二来也是想做一个总结。本来这个题目也可以叫做我的bmi5年,不过大家知道bmi的实在是少,而且现在这个公司已经名义上不存在了。

     我是在2001年去沈阳读书的,一直也是很喜欢沈阳的气候和东北人的豪爽,东北爷们是真正可以拿心和你交朋友的,不过我实在不喜欢东北的饮食,觉得不细腻,另外南方还有我的女人在等我回去,要女人来东北,难度不是一般的大,所以在找工作的时候,我就下定决心一定要找南方的公司,最好广州,深圳的,或者老家南昌的也是可以的。但是南方公司去东北招生的实在是少,除了华为,中兴之外真的是少的可怜,尽管我们学校在沈阳也是数一数二的学校。

     在04年在10月份,我面试的第一家公司是东软,没有办法,谁让我们学校是东软的最大股东尼(不知道现在是不是),面试的过程也还不错,考试题也做的很顺,东软还提出我们下学期直接找一些外教来教我们日文,不过当时东软给出的薪水实在是低的可怜,只有1800元,而且还要自己负责住宿,自己当时也老大不小了,还有女人在读书,是不是也是需要买些礼物的,而且沈阳和大连都不是我想去的地方,结果就直接没有去报道。

     接下来的日子也就整天在校内的招聘网站(白山黑水)上看帖子,看到了上海bmi的招聘广告,一看是上海的公司,而且做的是辽宁网通的项目,感觉项目很大,可以学到不少东西,关键是上海的公司,项目做完了就可以去上海发展呢,而且当时女朋友也还在读研究生,仔细的想想觉得这个公司还是比较适合自己,于是也开始做准备,接下来的事情都很顺利,笔试,面试,当时有资格参加面试的,整个我们学校也就2个人,一个本科生,一个研究生,不过最后那个研究生也没有过去。

     在辽宁项目的前期这段时间,估计也会我成长最快,也是最艰苦的时间,我后续的会详细介绍到。我第一天上班就是去做release,也就是做发布和部署,在当时的项目中,我们并没有像一些公司还有项目配置员这个角色,就是直接拉一个开发人员来负责做release,这个角色当时是在项目中最辛苦的一个,经常是下午6点开始,然后编译3-4个小时,到10点才可以编译完成(比较顺利的情况下),如果遇到编译不过去的时候,还需要联系开发人员进行修改,编译之后在对照check list进行增量部署。

    在第一天上班,我就从上午10点过去,第2天凌晨3点半才下班,到4点才到学校宿舍睡觉,后续的1个月都是如此,现在回想起来,感觉当时真的是很辛苦,不过那段时间也开始熟习了不少东西,知道了基于模块开发,对ant,weblogic,oracle,plsql,linux,aix等的使用也开始非常熟习了。在这段时间里也开始熟习了公司的项目情况,开发人员,测试人员。

posted @ 2010-05-04 00:06 不需要解释 阅读(213) | 评论 (0)编辑 收藏

    最近在看一些项目的代码,总是发现很少项目提供出uml图,或者就是提供uml图的也有可能并没有和代码对应上,如果有正确的uml图,可以非常方便的为大家更好的理解代码层次逻辑。其实我们可以使用使用UMLGraph来生成uml图,直接使用java代码来生成UMLGraph。对于大部分项目来说,我们一般使用maven和ant(还在使用ant,你out了)来作为项目的编译工具。

    在maven中,我们可以在pom.xml增加:

    <reporting>
        <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.6.1</version>
        <configuration>
          <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>
          <!-- <docletPath>/path/to/UmlGraph.jar</docletPath> -->
          <docletArtifact>
            <groupId>org.umlgraph</groupId>
            <artifactId>doclet</artifactId>
            <version>5.1</version>
          </docletArtifact>
          <additionalparam>-views</additionalparam>
          <useStandardDocletOptions>true</useStandardDocletOptions>
        </configuration>
        </plugin>
        </plugins>
    </reporting>

使用javadoc:aggregate 就可以生成出整个项目按照package的uml图了。

如果是使用ant,在build.xml中增加target

   <target name="genuml">
        <property name="uml.dir" value="${basedir}/uml"/>
        <property name="src.uml.dir" value="${src.dir}/uml"/>
        <mkdir dir="${uml.dir}"/>
        <path id="uml.source.path">
           <pathelement path="${src.uml.dir}/"/>
           <pathelement path="${src.java.dir}"/>
        </path>
        <javadoc sourcepathref="uml.source.path" packagenames="*" package="true">
           <doclet name="org.umlgraph.doclet.UmlGraph" path="${basedir}/lib/UmlGraph.jar">
               <param name="-d" value="${uml.dir}"/>
           </doclet>
        </javadoc>
        <apply executable="dot" dest="${uml.dir}" parallel="false">
            <arg value="-Tpng"/>
            <arg value="-o"/>
            <targetfile/>
            <srcfile/>
            <fileset dir="${uml.dir}" includes="*.dot"/>
            <mapper type="glob" from="*.dot" to="*.png"/>
        </apply>
    </target>

注意:要正常使用 UMLGraph,您必须先安装 Graphviz 工具,请自己google相关信息。

posted @ 2010-04-19 23:59 不需要解释 阅读(1491) | 评论 (0)编辑 收藏

       尽管工作了5年多了,现在能想起来的培训真的是少之又少,但是我想以后,我一定不会这样说了,因为我参加了百支了!

       百支对于我来说是一次清洗,洗掉以前的恶习,洗掉以前的老思维,重新培养我丢掉已久的价值观,重新找回往日的激情。来阿里之后,也一直在想一个问题,阿里和我以前公司有什么不同?或者说有什么特别的之处?其实这个问题有很简单,就是阿里是一家有梦想的公司,一家有价值观的公司,一家有亲情,友情的公司,一家工作生活一体的公司,从中国来看,阿里是唯一一家大的公司,而且价值体系贯彻的这么好的公司,only one in china。

      百支培训了很多业务知识,传统线,虚拟线,兄弟线,安全线,资金线,…学到了很多东西。

      百支的培训,让我开始结识了新的同学,新的家人,新的伙伴,让我们happly every day! 认真工作,快乐生活!

posted @ 2010-04-16 21:48 不需要解释 阅读(329) | 评论 (0)编辑 收藏

   随着网络技术的发展,很多恶意程序往往按照常规方法无法彻底删除。有没有什么方法能够在不安装任何第三方工具的情况下,删除它们呢?笔者经过多年实践,告诉大家一个秘密武器--关闭Explorer进程法。

  在服务器系统出现问题时,例如某个文件无法删除,某个程序假死或者是系统没有响应都可以按CTRL+SHIFT+ESC,调出Windows任务管理器。接下来找到“进程”标签,将“explorer.exe”进程关闭。接下来整个桌面就会消失,只剩下桌布了。然后通过Windows任务管理器的“文件”菜单下的“新建任务(运行)”打开“创建新任务”窗口,通过“浏览”按钮找到要删除文件所在目录,在浏览窗口里直接删除即可。99%都可以将这个顽固的文件删除,删除后继续选择“文件”菜单下的“新建任务(运行)”打开“创建新任务”窗口,在打开处输入命令--explorer后回车,我们将返回到正常的桌面界面下。显然,对付顽固文件,这个方法尤为简单。

posted @ 2009-11-10 16:19 不需要解释 阅读(148) | 评论 (0)编辑 收藏

    1、专注于构建一个强有力的团队,这一团队能够解决困难的问题,并为客户创造真正的价值。
  2、领导者鼓舞;管理者授权。要同时成为优秀的领导者和管理者,你需要就愿景进行沟通并理解其细节。
  3、对可能出现的障碍有所准备,防微杜渐,在这些障碍尚未壮大时就清除它们。
  4、花时间来仔细倾听别人的意见,但不要过于担心其他人的想法。
  5、专注于事实。
  6、充当一个衰减器,而不是放大器,为团队提供稳定性。
  7、永远不要将不能解释的事情归咎为蓄意破坏。
  8、培养幽默意识来作为严肃认真的一种平衡:对工作一丝不苟,对自己轻松自如。
  9、除了工作,还应该懂得享受生活,而且每年要读25本书。
  10、相信你的直觉:如果你感觉不妙,那么很可能预感就会成真。

posted @ 2009-11-08 03:10 不需要解释 阅读(145) | 评论 (0)编辑 收藏

Productize software

When talking about the productized software, people often think of Microsoft Office and Microsoft XP. Of course the Microsoft product series is very successful. They can provide excellent GUI, and good user experience.

In China, there is a different picture for software products. Let me take Chinese software development companies for example. Most of the companies in China work on some projects, instead of specific products, When a company starts a new project, they need to invest lots of developers and money into the project. Sometimes, they also need to send a number of technicians to the customer site to do the development. In my opinion, there are two reasons.

(1) The software is not very satisfactory enough to be a perfect product.

(2) Chinese customers have lots of special requirements.

Customer is GOD. We can not change the ideas of customer most of time. So, we need to improve our product. Then how to evaluate a software product's success? Because of various concerns, different users hold different opinions and will arrive at different conclusions.

As for redevelopment and customization, the following should be more concerned:

(1) Software scaffolding

If the product provides scaffolding, the redevelopment people will quickly generate code (from database, UML, etc….). As we know, the Spring, Hibernate also provide some scaffolding.

(2) Easy installation package

Most of time, the installation gives the first impression to the customer. So it is very important.

A simple installation must ensure everyone, even someone not very familiar with the application, can install the software.

The installation log file also plays significant role. Sometimes, it’s possible for the customer’s environment to have some problem so that the installation runs unsuccessfully. In this situation, the customer can send the log file to the technicians for analysis.

People who do not know about your product also can install easily according to wizard.

(3) Lots of Examples

The examples are the best teacher. Why most of java developer favor apache ant? The reason is that apache ant can provide lots of examples; you can find any task example in apache ant web site.

Example not only provides assistance to the development but also the product redevelopment If your product provides lost of examples, the questions from customers will be reduced substantially.

(4) Online documentation

If the developer can find some on-line document, he will not worry about that the document in his hands is an old version. And of course, the product developer also can work more effectively. For example, if the document has some error, or need to be modified, he can fix it quickly.

(5) Very good support

If the customer has some problem when he use or customize, he can get easily the support.

As for end-users, the following is very important.

(1) Friendly GUI, operator easily

(2) Collection client information online active, when some error happen.

(3) Auto-update to new version.

For customer, he does not need install some patch.

(4) In a conspicuous place clearly marked version of the software, and contact method

As for a kernel developer, he might think we need to provide:

(1) OSGI framework or plug-in framework to facilitate the expansion

(2) Standard software delivery process

(3) Software quality control

(4) A very good suite of documents.

posted @ 2009-11-02 11:26 不需要解释 阅读(194) | 评论 (0)编辑 收藏

Repositories are remote collections of projects from which Maven uses to populate the local repository of the build system. It is from this local repository that Maven calls it plugins and dependencies. Different remote repositories may contain different projects, and under the active profile they may be searched for a matching release or snapshot artifact.

Example A.8. Repository Configuration in settings.xml

<settings xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
  <profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>codehausSnapshots</id>
          <name>Codehaus Snapshots</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://snapshots.maven.codehaus.org/maven2</url>
          <layout>default</layout>
        </repository>
      </repositories>
      <pluginRepositories>
        ...
      </pluginRepositories>
      ...
    </profile>
  </profiles>
  ...
</settings>
releases, snapshots

These are the policies for each type of artifact, Release or snapshot. With these two sets, a POM has the power to alter the policies for each type independent of the other within a single repository. For example, one may decide to enable only snapshot downloads, possibly for development purposes.

enabled

true or false for whether this repository is enabled for the respective type (releases or snapshots).

updatePolicy

This element specifies how often updates should attempt to occur. Maven will compare the local POMs timestamp to the remote. The choices are: always, daily (default), interval:X (where X is an integer in minutes) or never.

checksumPolicy

When Maven deploys files to the repository, it also deploys corresponding checksum files. Your options are to ignore, fail, or warn on missing or incorrect checksums.

layout

In the above description of repositories, it was mentioned that they all follow a common layout. This is mostly correct. Maven 2 has a default layout for its repositories; however, Maven 1.x had a different layout. Use this element to specify which if it is default or legacy. If you are upgrading from Maven 1 to Maven 2, and you want to use the same repository which was used in your Maven 1 build, list the layout as legacy

posted @ 2009-11-02 11:25 不需要解释 阅读(1627) | 评论 (0)编辑 收藏

there are lots tools about the java obfuscate. I know two.

(1)proguard

(2)yguard

the proguard support ant, maven. I use maven as the project and build tools. so I want use the maven proguard plugin, but It is not easy to use. so I use yguard.

in your pom.xml, you can  add:

    <plugin>
            <groupId>net.sf.mgp</groupId>
            <artifactId>maven-unclasses-plugin</artifactId>
            <version>0.0.2</version>
        </plugin>
        <plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <dependencies>
    <dependency>
      <groupId>yguard</groupId>
      <artifactId>yguard</artifactId>
      <version>2.3.0</version>
      <scope>system</scope>
      <systemPath>lib/yguard.jar</systemPath>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <phase>package</phase>
      <configuration>
        <tasks>
          <property refid="maven.compile.classpath"
            name="mvn.classpath"></property>
          <!-- <echo message="Using Maven Classpath: ${mvn.classpath}" /> -->
          <taskdef name="yguard"
            classname="com.yworks.yguard.YGuardTask"/>
          <yguard>
            <!-- Input file and output file is the same. -->
            <inoutpair
              in="${project.build.directory}/${project.build.finalName}.${project.packaging}"
              out="${project.build.directory}/${project.build.finalName}.jar"/>
            <!-- Obfuscate classes plus string references. -->
            <rename
              logfile="${project.build.directory}/yguard.log.xml"
              replaceClassNameStrings="true">
              <!-- Keep the only class to be used for easy running and its public method main(). -->
              <keep>
                  <class classes="public" methods="public">
                  <patternset>
                    <include name=”xx.xxx.xxx.util.ConnectionUtil"/>
                  </patternset>
                </class>
              </keep>
            </rename>
            <!-- There are some external libraries used - Maven knows details. -->
            <externalclasses>
              <pathelement path="${mvn.classpath}"/>
            </externalclasses>
          </yguard>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>


It is very cool!!!.

posted @ 2009-10-19 00:50 不需要解释 阅读(595) | 评论 (0)编辑 收藏

有个大师说过一句话,有人的地方就有江湖,有江湖的地方就有斗争。今天在java eys就看到了一场Resourcebundle引起的口角,集体见:

http://www.javaeye.com/topic/6417?page=1.

这个问题在jdk1.6已经不存在

clearCache
public static final void clearCache()
Removes all resource bundles from the cache that have been loaded using the caller's class loader.
Since:
1.6
See Also:
ResourceBundle.Control.getTimeToLive(String,Locale)

clearCache
public static final void clearCache(ClassLoader loader)
Removes all resource bundles from the cache that have been loaded using the given class loader.
Parameters:
loader - the class loader
Throws:
NullPointerException - if loader is null
Since:
1.6
See Also:
ResourceBundle.Control.getTimeToLive(String,Locale)

 

在1.5,1.4怎么办呢:

   Class klass = ResourceBundle.getBundle("your.Bundle").getClass().getSuperclass();
   Field field = klass.getDeclaredField("cacheList");
   field.setAccessible(true);
   sun.misc.SoftCache cache = (sun.misc.SoftCache)field.get(null);
   cache.clear();
   field.setAccessible(false);

这样就可以清楚cache.

posted @ 2009-10-17 17:23 不需要解释 阅读(207) | 评论 (0)编辑 收藏

Build in properties
  • ${basedir} represents the directory containing pom.xml
  • ${version} equivalent to ${project.version} or ${pom.version}
Pom/Project properties

All elements in the pom.xml, can be referenced with the project. prefix or using pom. as prefix. This list is just an example of some commonly used elements.

  • ${project.build.directory} results in the path to your "target" dir, this is the same as ${pom.project.build.directory}
  • ${project.build.outputDirectory} results in the path to your "target/classes" dir
  • ${project.name} or ${pom.name} refers to the name of the project.
  • ${project.version} or ${pom.version} refers to the version of the project.
  • ${project.build.finalName} refers to the final name of the file created when the built project is packaged
Local user settings

Similarly, values in the user's settings.xml can be referenced using property names with settings. prefix.

  • ${settings.localRepository} refers to the path of the user's local repository.
  • ${maven.repo.local} also works for backward compatibility with maven1 ??
Environment variables

Environment variables can be referenced using the env prefix

  • ${env.M2_HOME} returns the Maven2 installation path.
  • ${java.home} specifies the path to the current JRE_HOME environment use with relative paths to get for example:
    <jvm>${java.home}../bin/java.exe</jvm>
    Java system properties

All Java System Properties defined by the JVM.

Custom properties in the POM

User defined properties in the pom.xml.

<project>
...
  <properties>
     <my.filter.value>hello</my.filter.value>
  </properties>
...
</project>
  • ${my.filter.value} will result in hello if you inserted the above XML fragment in your pom.xml
Parent Project variables

How can parent project variables be accessed?

You can use the prefix: ${parent.project}.

For example, use ${parent.project.version} to retrieve parent version.

A good way to determine possible variables is to have a look directly at the API. The above example was not working for me, maybe it was working that way with older releases of maven. I'm currently using Maven 2.2.1, and to access the Parent you can use ${project.parent}. This will return an org.apache.maven.project.MavenProject instance.

Reflection Properties

The pattern ${someX.someY.someZ} can simply sometimes mean getSomeX().getSomeY().getSomeZ(). Thus, properties such as ${project.build.directory} is translated to getProject().getBuild().getDirectory().

posted @ 2009-10-11 23:01 不需要解释 阅读(1295) | 评论 (0)编辑 收藏

今天是伟大的甘地的生日,刚好在印度出差也就享受了一天假期,不过如果我在国内的话今天也是不上班了,因为今天是伟大祖国生日的第2天。

今天继续在搞weblogic和jetty的调试,发现一个问题,weblogic会对response中的内容trim,jetty不会。估计是ebos中有一段代码在response的out里面写了一些空白进去,导致这个内容到client端的时候就会解析不对。obj.responseXML会是空。

另外,Fiddler是监控网络连接的,一般的话它会监控有线的那个,我在酒店是使用无线上网,所以一开始找不到原因还以为是fiddler不支持无线方式的监控,查看了一下配置才发现问题。

最后实在没有办法直接写死,好在我做的只是一个开发辅助工具,不需要考虑性能影响:

var xmlData = obj.responseText.trim();
//alert(xmlData);
obj.responseXML.loadXML(xmlData);

明天继续完善程序,争取在这个假期完成之前能完成大体,后续文档补充。也算是功德一件了。

posted @ 2009-10-03 03:31 不需要解释 阅读(206) | 评论 (0)编辑 收藏

     出国有很多好处也有很多坏处,这里就说一处好处,就是可以为自己的历史课好好的补一补了。历史以成败论英雄,当权者一般都会去篡改历史的,不过在长久看来,大家都不过是历史的一粒沙尘,是无法改变历史的,人只能创造历史,无法修改历史。在中国内地的当代史就是一部篡改的历史,所以这次出国就好好的补了补,在国外很多网站都可以访问,使用google可以查任何你想要查的东西,不会过滤掉一些关键的信息。

      下面我就来说说我对近代一些人物的再认识吧:

     先说蒋先生,其实这个人的功劳应该是很大的,我个人觉得比先祖的功劳要大,毕竟统一了中国,而且在台湾也实现了一定程度的民主。尤其的是在8年抗战的历史上更是不能抹去的功绩,历史应该给蒋先生一个公道。

     张学良,这个人的爱国程度超出我原来的影响,以前的历史书上也是说张学良是千古功臣,但是说的很含糊,尤其是在D的丰功伟绩下显得不是伟大,张学良这个人不仅仅是爱国,而且这个人的心胸非常的大,他让蒋先生关了后半辈子,看采访他的是很,他也只是一笑而过,当然这个或者是他后来是基督教有关。

     蒋夫人,不愧是中国的第一夫人,如果有人问我中国的第一夫人是谁?很茫然,是胡夫人吗?她做了一些啥?看看人家蒋夫人在抗战时候做的事情,抗战后方支援,美国国会演讲,国际场合的外交,真的不愧是第一夫人,不过对这个,我了当代历史说的就更加的少了。

    毛太祖,看他在建国后的人大会议上,俨然就是一个皇帝,虽然他本人非常的亲民,而且一直也是爱民如子,不过他错过了历史给他的机会,如果他能学一下华盛顿,为中国留下一个比较完善的制度,我看今天的中国应该会更加富强了。非常可惜,强人政治的时候没有推进民主,在后强人政治就只是剩下了利益斗争了。

    周公,周公年轻的时候非常有才华,非常懂得协调各方的关系,不过可能是太陶醉在协调者的角色上面,导致后期严重的边缘化,他参加革命不必太祖晚,而且有很长一段时间地位还比毛祖高。后来的边缘化导致不得不为了自保,手举红皮书,高喊毛主席万岁来自保,甚至自己的养女,自己的第一任女朋友都眼睁睁的看着他们迫害致死,其下场可想而知。

    今天看一段网上录像,说小平同志还跟过冯玉祥。历史课本上貌似没有这个。

posted @ 2009-09-27 02:08 不需要解释 阅读(141) | 评论 (0)编辑 收藏

     大概在4年前,我还在沈阳做辽宁网通的boss项目,那个时候系统刚刚上线,问题成堆,尤其是一些单子由于程序或者是数据问题,出现异常,出现异常就必须去更正数据,让单子继续走下去。那个时候公司有个强人,使用Python来做这个事情,说白了也是比较简单,就是使用Python调用server端得ejb,修改数据然后提交到server上去。不过在那个时候懂一门动态语言在我看来非常的不简单。

      goon,最近闲的无事,把同事的一个程序拿过来修改了一下,大概也是实现了这样的一个逻辑,不过没有使用Python,or Jython,使用的是java 程序员都很熟悉的Beanshell 语言来写,并添加上了SWT,作为ui。这样对公司大部分人就没有什么难度了,直接可以写java代码,而且没有Jython那样格式的严格要求(很烦人)。

    先上一下图:

image

结果后台配置,就可以直接修改,查看server上的数据,如果有问题的单子还可以通过这个来修改,非常cool。

怎么做到这点呢:

(1)通过java调用beanshell的方法,init 一个init.bsh, 在这个bsh里面写上你自己的逻辑,比如lookup ejb,写好一些方法,这样使用者就直接可以调用了。

(2)把一些服务器的配置写到配置文件里面去。

如果修扩展,也很简单,直接修改一下配置文件,添加一些jar 并在init.bsh里面添加自己的逻辑就可以了。

posted @ 2009-09-23 23:42 不需要解释 阅读(163) | 评论 (0)编辑 收藏

    昨天晚上就抵达了india的hyderabad,一个发展中的城市,在这个城市你可以看到90年代在珠三角的样子,所以至少来讲,india还是落后中国20年,当然我们中国也是和谐的比较厉害,这个我们还是需要承认的。

   到酒店一看,才知道原来这样的地方也敢叫hotel,真是人有多大胆地就有多大产!不服不行啊。从公路上来看india的话,小车和bus比较多,当然更多的是那个三轮摩托他们叫auto,想多的多,而且有一些还是2个人开,非常好奇的是难道一个车还要2个人合伙?更奇怪的是india的bus的门貌似都不关,不管是school bus还是company bus,都一样不关门,开的飞快。也不知道他们的车做门做啥。可惜的是,这次出来没有带照相机,要不照照给大家看看。

   吉隆坡还是一个非常漂亮的city,如果坐飞机去这个城市的话,晚上到,飞机回经过kul的上空,你可以看这个city的全景,可以看双子塔,当然和上海市没有的比。

   早上睡不着觉,就很早起来了,通过老板娘专线和老板娘通了电话叫车,就下楼等车去了,经过一下楼就发现一个出租车往外面跑,叫也叫不住。(这个hotel没有前台,我也搞不清楚老板娘在那个地方,只能通过电话call she)。没有办法就在外面等,经过等了1 hours才等到一个车,可怜吧,呵呵。在等的过程中我就在研究india的马路上的车,大部分小车都比较低端,貌似那款铃木(仿mini的)那款在这个城市还比较多。高端车就没有看到,唯一比较高端的是在那个hotel一楼停车场的丰田的私欲。 说起hotel的一楼,india人的思维也比较奇诡,我们那边的1楼都用来做商品(靠近马路),这边直接就做车库,估计是不愿意搞地下车库。

    office还是不错,非常的大,而且有tea room,非常的不错。中午去了一趟office的食堂,中午食堂:2个咖喱搞的汤(a little),一个鸡蛋,还有一些油炸食品。吃不下,同事介绍说附近有一个shanghai chef,打个auto跑过去(taxi就打不到)才发现,全是假冒的,一点也不是Chinese food。

    出差india,苦啊!

posted @ 2009-08-31 20:11 不需要解释 阅读(186) | 评论 (0)编辑 收藏

      真没想到,户籍制度和计划生育制度协同发力,已经到如此荒谬的地步了!超过了所有的政治讽刺剧和黑色幽默剧。某些公民在自己的国家,已经无法结婚了!(见2009年8月6日南方周末)他们的子女,则无权在自己上学的地方参加高考,必须得返回一个可能从来没有去过的地方参加考试。

  听上去这些人怎么都不像是公民,而更像是俄国农奴或者美国黑奴。

  外地大学生,在北京毕业以后,被单位录用,如果不能得到正式的户口,可以得到一个集体户口。这已经被认为是幸运的了。没想到,集体户口在结婚时遇到麻烦。如果结婚,就要把户口迁出去,变成家庭户口,迁出去就要买房。现在上百万的房价,当然不是人人都买得起,刚毕业没几年的学生,更是难以负担。没有自己的住房,就没有正式的户口卡,没有户口卡,民政局就不给你发结婚证。

  那么,就在集体户口那里登记结婚不行吗?不行,如果在那里结婚,集体户口的管理者就要确保你不超生,不多生孩子。万一不能确保,一票否决,人家的前程就完了。那么,放弃集体户口,回到老家呢?也不行,别以为农业户口就那么容易得到。户籍制度的限制是双向的。小城镇也一样,许出不许进。

  即使你想办法结了婚,你生下来的孩子也相当于印度的低级种姓。虽然不是不可接触者,但时候一到,就让你尝尝厉害。你的孩子在北京学校里高高兴兴地上学,和其他孩子没什么区别。天天在力争上游,或许成绩还很优秀。但到了高考的时候,就傻了。你的孩子必须回到你原来的户口所在地去参加考试。课程不一样,活该!环境不适应,活该!那里早已没有亲人,没人照顾孩子,活该!

  最让人憋闷的是,并不是哪个具体的人在和你过不去,你想发泄都不知道去找谁。大家都是善良人,都为了这个国家好,都没想坑你,但你就是被玩儿了。玩儿得你一点辙都没有。

  为什么要有这么多糟糕的规定?一个政府为什么要这么处心积虑地难为自己的公民?原因就在于,总是有人,包括那些被玩儿的很惨的人,都相信,如果没有限制,人们就会蜂拥进入北京这样的大城市,那么,北京户籍人口就会遭到不公平,就会面对更激烈的竞争,就有可能败下阵来。必须保护他们,必须保护北京户籍人口。

  呸!

  首先声明,我就是北京户籍人口的一员。这样声明,是免得那些脏心烂肺、理解力低下的人以为我仅仅是在泄私愤。前两年我写文章大骂难为小产权房的人,许多人就认为,我是因为买了小产权房才这么愤怒,但我其实没买。我还没那种领先的经济意识。

  不过,我这样说当然也和我的私利有关。我的实际收入和经济利益,当然受到身边人水平、干劲和创造力的直接影响。我不想生活在一个如此荒唐、狭隘的社会里。我想有机会和尽可能大范围的优秀人士共同居住在一个城市中,而不想身边的人都是那些不思进取、离开政府保护就不能生存的家伙。

  重要的是,这个世界上,没有任何正当的法律、道德、伦理、传统规定:一个人偶然出生在哪里,他就有权利、有资格一直在那里生活。如果他负担不起生活费用,政府就必须禁止别人和他竞争,或者从别人那里抢来钱给他,保证他能在出生地继续生活。这种规定太荒唐可笑了。人是人,不是保护区的动物。

  如果你出生在北京,如果你是北京户籍人口之一,那仅仅证明你偶然出生在这里,或者政府曾经批准你居住在这里,仅此而已。如果你自己无能或者不努力,无法竞争过那些并非出生在这里的人,那你只好卷铺盖走人,别再继续在北京生活了。你可以去那些你可以负担起生活费的地方生活。

  很多人来到北京打拼,要在北京买房。房价于是上涨。你买不起了。那你只好租房。如果租也租不起,你倒说说看,除了离开北京之外,还有什么办法?

  大家一起参加高考,你的分数不如人家,人家就更应该上大学。难道仅仅因为你出生在这里,这里的大学就应该优先对你开放吗?你以为自己是婆罗门或者刹帝利吗?

  北京不是你的城市。属于你的,仅仅是你花钱购买、或者别人送给你的房子。除此之外的城市的广大范围,在权利的意义上和你无关。你不要动不动就以城市的主人自居,那是无耻的僭越。

  在精神上,你可以认为自己是城市的主人,但这种精神上的主人,仅仅表现为你应该用自己的努力发扬光大这个城市的精神和原则。城市为所有人提供一个和他人自由合作的场所。城市的精神和原则天生就是自由。人们在城市中,可以更大限度地互相激发,创造力有更大发挥的空间。在这种精神中,丝毫也找不到自闭、限制、停滞、寄生之类的概念

  而且,作为北京户籍人口之一,我从来没有委托过任何官员,请他们帮助我排除外来竞争,禁止其他人在这个城市里比我表现得更加优秀。我也不认为,任何人有权利这样去做,不管他出生在哪里。

  我认为,相关官员这样想,这样做,是对包括我在内的北京户籍人口的侮辱,是在把我们看作毫无竞争力的废物,是对我们人格和尊严的蔑视。我不需要他们的这种保护,我自信可以参与竞争并在这个城市中争取到自己的位置。如果成功,我将享受自己的努力结果,如果不成功,我也不需要别人替我负责。我不是他们的奴隶,他们也不是我的主子。

  实际上,北京户籍人口这个词,引起我极大的嫌恶。如果说,集体户口让我联想到农奴,户籍人口则让我联想到圈养牲口。实际上,饲养者是在以貌似慈祥,实则傲慢的态度看待这些被饲养者。可憎的是,许多被饲养者还因此萌生出优越感,自以为高人一等。真是TMD天生的奴才!

  当然,除了奴才以外,更多的人是糊涂。他们多年受到片面性的宣传。不知不觉中,他们已经习惯从被饲养者的角度看世界,把所有其他人都看作和他抢食的被饲养者。他们已经不能想象还有无需饲养、可以自己创造世界的大写的人的存在。他们真心恐惧城市的开放,恐惧自由竞争,恐惧失去政府的保护。众多被饲养者的存在,是貌似慈祥、实则傲慢的官员的坚定靠山。就是凭借着这巨大的靠山,官员们才弄出让公民甚至无法结婚的黑色闹剧。

  我个人当然无力改变这种闹剧,但我乐于看到所有想在北京凭借诚实劳动谋生存、谋发展的人积极地主张自己的权利。我建议他们的主张要和平和非暴力,要持之以恒和坚持到底。历史上无数的成功先例可以供他们借鉴。权利的获得从来都不是轻松的,但许多时候,权利是最后的赢家。

posted @ 2009-08-10 12:17 不需要解释 阅读(118) | 评论 (0)编辑 收藏

in windows, we can install weblogic as windows service.

(1)edit bea.home/wlserver_10.3/server/bin/installSvc.cmd

add :

rem 设置域的名字,这里是base_domain
set DOMAIN_NAME=wsc52
rem 服务名
set SERVER_NAME=AdminServer
rem 设置用户domain的home
set USERDOMAIN_HOME=D:\bea10\user_projects\domains\wsc52
rem 设置口令
set WLS_pw=weblogic
set JAVA_HOME=D:\bea10\jdk160_05

add in the final line, add

-log:"%USERDOMAIN_HOME%\stdout.log"

so , weblogic will print all wls log to this file.

 

(2)start this server, this server name is “beasvc wsc52_AdminServer”

you can start and stop this service with this command.

net start “beasvc wsc52_AdminServer” and net stop “beasvc wsc52_AdminServer”.

 

if you want do delete this service,use this:SC delete “beasvc wsc52_AdminServer”

posted @ 2009-07-18 08:32 不需要解释 阅读(323) | 评论 (0)编辑 收藏

 
真正的驴爸关键词列表流出,直接破解自安装目录.dat文件,让你感受毛骨悚然的监控

欢迎不署名不写出处转载。

首先分析驴爸的二进制文件。injlib32.exe, 偏移量 89e8H

000089e0h: F8 89 00 10 E8 89 00 10 65 64 69 74 70 6C 75 73 ; 鴫..鑹..editplus
000089f0h: 2E 65 78 65 00 00 00 00 75 65 64 69 74 33 32 2E ; .exe....uedit32.
00008a00h: 65 78 65 00 65 6D 65 64 69 74 6F 72 2E 65 78 65 ; exe.emeditor.exe
00008a10h: 00 00 00 00 77 6F 72 64 70 61 64 2E 65 78 65 00 ; ....wordpad.exe.
00008a20h: 6E 6F 74 65 70 61 64 2E 65 78 65 00 77 70 73 2E ; notepad.exe.wps.
00008a30h: 65 78 65 00 77 70 70 2E 65 78 65 00 65 74 2E 65 ; exe.wpp.exe.et.e
00008a40h: 78 65 00 00 70 6F 77 65 72 70 6E 74 2E 65 78 65 ; xe..powerpnt.exe
00008a50h: 00 00 00 00 66 72 6F 6E 74 70 67 2E 65 78 65 00 ; ....frontpg.exe.
00008a60h: 65 78 63 65 6C 2E 65 78 65 00 00 00 6D 73 61 63 ; excel.exe...msac
00008a70h: 63 65 73 73 2E 65 78 65 00 00 00 00 6F 75 74 6C ; cess.exe....outl
00008a80h: 6F 6F 6B 2E 65 78 65 00 77 69 6E 77 6F 72 64 2E ; ook.exe.winword.
00008a90h: 65 78 65 00 6D 61 69 6C 6D 61 67 69 63 2E 65 78 ; exe.mailmagic.ex
00008aa0h: 65 00 00 00 70 6F 70 6F 2E 65 78 65 00 00 00 00 ; e...popo.exe....
00008ab0h: 71 71 6D 61 69 6C 2E 65 78 65 00 00 61 69 78 6D ; qqmail.exe..aixm
00008ac0h: 61 69 6C 2E 65 78 65 00 69 6D 61 70 70 2E 65 78 ; ail.exe.imapp.ex
00008ad0h: 65 00 00 00 69 6E 63 6D 61 69 6C 2E 65 78 65 00 ; e...incmail.exe.
00008ae0h: 6D 73 69 6D 6E 2E 65 78 65 00 00 00 64 6D 32 30 ; msimn.exe...dm20
00008af0h: 30 35 2E 65 78 65 00 00 66 6F 78 6D 61 69 6C 2E ; 05.exe..foxmail.
00008b00h: 65 78 65 00 67 6F 6F 67 6C 65 74 61 6C 6B 2E 65 ; exe.googletalk.e
00008b10h: 78 65 00 00 6D 69 72 61 6E 64 61 33 32 2E 65 78 ; xe..miranda32.ex
00008b20h: 65 00 00 00 69 6D 75 2E 65 78 65 00 79 70 61 67 ; e...imu.exe.ypag
00008b30h: 65 72 2E 65 78 65 00 00 74 6D 73 68 65 6C 6C 2E ; er.exe..tmshell.
00008b40h: 65 78 65 00 73 74 61 72 74 2E 65 78 65 00 00 00 ; exe.start.exe...
00008b50h: 75 63 2E 65 78 65 00 00 69 63 71 63 68 61 74 72 ; uc.exe..icqchatr
00008b60h: 6F 62 6F 74 2E 65 78 65 00 00 00 00 71 71 2E 65 ; obot.exe....qq.e
00008b70h: 78 65 00 00 6D 73 6E 6D 73 67 72 2E 65 78 65 00 ; xe..msnmsgr.exe.
00008b80h: 67 73 66 62 77 73 72 2E 65 78 65 00 67 72 65 65 ; gsfbwsr.exe.gree
00008b90h: 6E 62 72 6F 77 73 65 72 2E 65 78 65 00 00 00 00 ; nbrowser.exe....
00008ba0h: 74 6F 75 63 68 6E 65 74 2E 65 78 65 00 00 00 00 ; touchnet.exe....
00008bb0h: 74 68 65 77 6F 72 6C 64 2E 65 78 65 00 00 00 00 ; theworld.exe....
00008bc0h: 6D 61 78 74 68 6F 6E 2E 65 78 65 00 74 74 72 61 ; maxthon.exe.ttra
00008bd0h: 76 65 6C 65 72 2E 65 78 65 00 00 00 6E 65 74 73 ; veler.exe...nets
00008be0h: 63 70 2E 65 78 65 00 00 67 65 2E 65 78 65 00 00 ; cp.exe..ge.exe..
00008bf0h: 66 69 72 65 66 6F 78 2E 65 78 65 00 6F 70 65 72 ; firefox.exe.oper
00008c00h: 61 2E 65 78 65 00 00 00 6E 65 74 63 61 70 74 6F ; a.exe...netcapto
00008c10h: 72 2E 65 78 65 00 00 00 6D 79 69 65 2E 65 78 65 ; r.exe...myie.exe
00008c20h: 00 00 00 00 69 65 78 70 6C 6F 72 65 2E 65 78 65 ; ....iexplore.exe
00008c30h: 00 00 00 00 6D 6D 63 2E 65 78 65 00 72 65 67 65 ; ....mmc.exe.rege
00008c40h: 64 69 74 2E 65 78 65 00 74 61 73 6B 6D 67 72 2E ; dit.exe.taskmgr.
00008c50h: 65 78 65 00 6D 70 73 76 63 63 2E 65 78 65 00 00 ; exe.mpsvcc.exe..

什么意思?驴爸软件将监控下列软件:
文本编辑软件:EdiPlus,UltraEdit,EmEditor, 写字板,记事本
办公软件:WPS的Word、Presentation、Spreadsheet,微软的Word、Powerpoint、FrontPage、Excel、Access、Outlook
电子邮件客户端:mailmagic.exe popo.exe qqmail.exe aixmail.exe imapp.exe incmail.exe msimn.exe dm2005.exe foxmail.exe
即时通讯工具:Google Talk,Miranda32,imu.exe,ypager.exe,腾讯QQ和TM,start.exe,新浪UC,ICQ,MSN
浏览器类:GoSuRF,GreenBrowser,TouchNet,TheWorld,MaxThone,腾讯套套浏览器,NetScape,Firefox(说明书里说只能监控到2.0版本),Opera,NetCaptor,MyIE,IE
系统工具类:mmc, regedit, taskmgr

在看看XNet2.exe,偏移量 68968h,看看驴爸将会监控那些程序

00068960h: B3 CC D0 F2 00 00 00 00 77 6F 77 2E 65 78 65 00 ; 程序....wow.exe.
00068970h: C4 A7 CA DE CA C0 BD E7 00 00 00 00 79 61 68 6F ; 魔兽世界....yaho
00068980h: 6F 6D 65 73 73 65 6E 67 65 72 2E 65 78 65 00 00 ; omessenger.exe..
00068990h: D1 C5 BB A2 CD A8 00 00 77 61 6E 67 77 61 6E 67 ; 雅虎通..wangwang
000689a0h: 2E 65 78 65 00 00 00 00 B0 A2 C0 EF CD FA CD FA ; .exe....阿里旺旺
000689b0h: 00 00 00 00 73 74 61 72 74 2E 65 78 65 00 00 00 ; ....start.exe...
000689c0h: CD F8 D2 D7 50 4F 50 4F 00 00 00 00 CD F8 D2 D7 ; 网易POPO....网易
000689d0h: 70 6F 70 6F 00 00 00 00 75 63 2E 65 78 65 00 00 ; popo....uc.exe..
000689e0h: D0 C2 C0 CB 55 43 00 00 D0 C2 C0 CB 75 63 00 00 ; 新浪UC..新浪uc..
000689f0h: 69 63 71 2E 65 78 65 00 49 43 51 36 00 00 00 00 ; icq.exe.ICQ6....
00068a00h: 69 63 71 36 00 00 00 00 73 6B 79 70 65 2E 65 78 ; icq6....skype.ex
00068a10h: 65 00 00 00 53 6B 79 70 65 00 00 00 73 6B 79 70 ; e...Skype...skyp
00068a20h: 65 00 00 00 65 70 68 2E 65 78 65 00 65 BB B0 CD ; e...eph.exe.e话?
00068a30h: A8 00 00 00 64 6F 73 68 6F 77 00 00 6D 73 6E 6D ; ?..doshow..msnm
00068a40h: 73 67 72 2E 65 78 65 00 4D 53 4E 00 6D 73 6E 20 ; sgr.exe.MSN.msn 
00068a50h: 6D 65 73 73 65 6E 67 65 72 00 00 00 71 71 67 61 ; messenger...qqga
00068a60h: 6D 65 2E 65 78 65 00 00 51 51 D3 CE CF B7 00 00 ; me.exe..QQ游戏..
00068a70h: 71 71 D3 CE CF B7 00 00 71 71 63 68 61 74 2E 65 ; qq游戏..qqchat.e
00068a80h: 78 65 00 00 51 51 C1 C4 CC EC CA D2 00 00 00 00 ; xe..QQ聊天室....
00068a90h: 71 71 C1 C4 CC EC CA D2 00 00 00 00 71 71 2E 65 ; qq聊天室....qq.e
00068aa0h: 78 65 00 00 51 51 00 00 71 71 32 00 62 69 74 62 ; xe..QQ..qq2.bitb
00068ab0h: 6F 6D 65 74 2E 65 78 65 00 00 00 00 42 69 74 43 ; omet.exe....BitC
00068ac0h: 6F 6D 65 74 00 00 00 00 62 69 74 63 6F 6D 65 74 ; omet....bitcomet
00068ad0h: 00 00 00 00 B7 D6 CE F6 CD EA B3 C9 A1 A3 00 00 ; ....分析完成。..

具体的我就懒得写了。凡是窗口标题栏有这些文字的统统会遭到监视。

搜索引擎监控,来自Surfgd.dll,偏移量16390h


00016390h: 2E 6D 73 6E 2E 63 6F 6D 00 00 00 00 2E 79 6F 6B ; .msn.com.....yok
000163a0h: 61 2E 63 6F 6D 00 00 00 2E 79 61 68 6F 6F 2E 63 ; a.com....yahoo.c
000163b0h: 6F 6D 00 00 2E 79 69 6D 67 2E 63 6F 6D 00 00 00 ; om...yimg.com...
000163c0h: 2E 62 61 69 64 75 2E 63 6F 6D 00 00 2E 63 6F 70 ; .baidu.com...cop
000163d0h: 79 73 6F 2E 63 6F 6D 00 2E 6D 61 70 62 61 72 2E ; yso.com..mapbar.
000163e0h: 63 6F 6D 00 2E 6E 65 74 73 75 6E 2E 63 6F 6D 00 ; com..netsun.com.
000163f0h: 2E 66 6F 6C 6F 64 61 2E 63 6F 6D 00 2E 6E 70 69 ; .foloda.com..npi
00016400h: 63 70 2E 63 6F 6D 00 00 2E 64 69 63 74 2E 63 6E ; cp.com...dict.cn
00016410h: 00 00 00 00 2E 79 6F 6B 2E 63 6F 6D 00 00 00 00 ; .....yok.com....
00016420h: 2E 7A 68 6F 6E 67 73 6F 75 2E 63 6F 6D 00 00 00 ; .zhongsou.com...
00016430h: 2E 73 6F 67 6F 75 2E 63 6F 6D 00 00 2E 79 61 68 ; .sogou.com...yah
00016440h: 6F 6F 2E 63 6F 6D 2E 63 6E 00 00 00 2E 73 6F 73 ; oo.com.cn....sos
00016450h: 6F 2E 63 6F 6D 00 00 00 2E 67 6F 6F 67 6C 65 2E ; o.com....google.
00016460h: 63 6E 00 00 2E 67 6F 6F 67 6C 65 2E 63 6F 6D 00 ; cn...google.com.

dbfilter.dll,这个是直接把你的Windows的winsock2给监听了,也就是说所有从你网卡经过的每一个字节都会被扫描和分析。

现放出来自直接解密安装路径下的 .dat 文件的关键字列表,并稍加解说

wfile.dat - http://privatepaste.com/450zZe32hn
这个文件说明了过滤文件类型


TrustUrl.dat - http://privatepaste.com/4c0Q3tzzb0
信任网址。这些网站毫无疑问都是老大哥信得过的。值得全球站长屏蔽这些网站。这是驴爸软件中最有价值的一份列表,这些网站都是XX喉舌


vgamfil.dat - http://privatepaste.com/1auoil5bP2
所谓“暴力”游戏类。都有屏蔽了什么游戏呢?Quake,Quake2,Quake3,PLA训练用的counter-strike.net,F22 Raptor,古墓丽影(这也算暴力类?),古墓丽影II,星际争霸(暴力类?我看是“封建迷信”吧?),暴雪母公司activision.com,duke4.com,万年跳票的dukeforever.com,ff8online.com,half-life.com,stormtroopers.com,unreal.org等等。建议大家以后只打清廉战士。

chtfil.dat - http://privatepaste.com/32hbY5XUgy
屏蔽了AOL,AIM,Yahoo,MSN

csnews.dat - http://privatepaste.com/bb1RyuqiVu
这个文件是最喜剧的,驴爸抄袭美国人的过滤库就算了,还很临时工的把cybersitter别人的readme文件一起抄过来了

entfil.dat - http://privatepaste.com/bd0qklsJuD
娱乐类过滤。这里屏蔽了BSG和Firefly的scifi.com,StarTrek.com,StarWars.com,这样Geek四大剧就被围剿得一个不剩了。另外southpark、pokemon、xfiles和BritneySpears也是监视关键字。blizzard.com暴雪公司官方网站被屏蔽

finfil.dat - http://privatepaste.com/b414bkBNPv
金融类过滤。包括华尔街时报www.wsj.com,www.ft.com,www.sec.gov等

fmfil.dat - http://privatepaste.com/3d114bf1mD
电子邮件监控。hotmail.com,gmail.com,甚至www.mail开头的都会受到特别关注。

fshrfil.dat - http://privatepaste.com/b8kPPu9ZiV
文件共享监控。监控市面上几乎所有的P2P客户端和软件。gnutella, bearshare, emule, wrapster, 
scourexchange, imesh, audiogalaxy, kazaa, filesharing, morpheus, limewire, 
javalimewire, gnutella, wrapster, scourexchange, shareaza, kazaalite, 
bittorrent, azureus


gdwfil.dat - http://privatepaste.com/49ftIfdRqJ
屏蔽了amazon.com,还有这款山寨软件的祖宗cybersitter*.com,download.windowsupdate.com,liveupdate.symantec.com,symantec.liveupdate.com,microsoft.com,symantec.com,windowsupdate.com,zdnet.com。也就是说安装了某软件,Windows的补丁和杀毒软件升级,要么被监控,要么就被直接屏蔽了。有人说这个文件是白名单,请问在同一个列表里的amnesty.org,virgin-boys,porno-free.net这些东西也可能是白名单吗? 


imgfil.dat - http://privatepaste.com/cehwHinyM0
这里屏蔽了很多图片类网站,只要URL包含下列字符就会像GFW一样被RST,例如google.ca/image,google.com/image,当然还有Yahoo的yahoo.com/image,还有视频搜索屏蔽searchcat=vid,video.search.yahoo。请问老大哥究竟有什么见不得人的东西要把图片和视频搜索统统屏蔽呢?

mp3fil.dat - http://privatepaste.com/f0uBTti5uh
mp3类。封杀了一些MP3共享软件,例如gnutella, bearshare, wrapster, scourexchange, imesh, audiogalaxy, kazaa, filesharing, morpheus, limewire, gnutella, wrapster, scourexchange


wrestfil.dat - http://privatepaste.com/eapAh32NC8
摔跤类。主要是WWE美摔之类的被屏蔽了。没有屏蔽K1,说明的确是抄袭cybersitter


pkmon.dat - http://privatepaste.com/580KvOFYV4 (POKEMON!)
文件名就很囧。Pokemon就是吃豆子游戏。这份名单貌似过滤了一些anime和manga

sporfil.dat - http://privatepaste.com/e20QeOlezv
体育类过滤。屏蔽了www.nba.com和wnba.com,还有其他的太多了。。。


--------------------分割线--------------------

下面的.dat文件内容,几乎都来自cybersitter,山寨程度可见一斑

wfileu.dat - http://privatepaste.com/9c0oaeS0i1
这个网址就是cybersitter的升级地址了,居然还保留了。你说驴爸这软件山寨不山寨?

wzfil.dat - http://privatepaste.com/170Epo2wTZ
游戏破解


adwapp.dat - http://privatepaste.com/aey5BIlkyx
adult类网站过滤(严格)

adwfil.dat - http://privatepaste.com/091MdBUyDv
adult类网站过滤


lgwfil.dat - http://privatepaste.com/a1ndIrVvEn
同志类网站,不熟悉,不评价。

iawfil.dat - http://privatepaste.com/951A0xSKW2
非法类。照抄cybersitter的名单

auctfil.dat - http://privatepaste.com/f20vFALQPl


bnrfil.dat - http://privatepaste.com/76uATdcCsN
屏蔽广告

bsnlst.dat - http://privatepaste.com/b6tJvZlQJN


cultfil.dat - http://privatepaste.com/dc1NtZn183
文化过滤,包括GeorgeKing,scientology,ChurchOfSatan一类的。还是抄袭cybersitter


gblfil.dat - http://privatepaste.com/53CXciru9I
貌似是赌博类。



gnfil.dat - http://privatepaste.com/c6lU71HHUT
枪支类。

hatfil.dat - http://privatepaste.com/1005oQLOJv
种族仇恨类。


jbfil.dat - http://privatepaste.com/7d1cmQ7bdW
招聘类。


movfil.dat - http://privatepaste.com/99cMT8Xjyr
电影类



nvgamfil.dat - http://privatepaste.com/9aYQOBgQoU
又一个游戏类过滤。nv game filter.dat?


perfil.dat - http://privatepaste.com/7driTj667b
sex类过滤

picsfil.dat - http://privatepaste.com/34TI4cSbZE



popfil.dat - http://privatepaste.com/c10gAsIEuq
广告弹窗类过滤

psyfil.dat - http://privatepaste.com/ae0GA79ZFm
封建迷信和超自然类过滤。



swfil.dat - http://privatepaste.com/aeSIsoDlKd
盗版软件过滤。

tafil.dat - http://privatepaste.com/26FTx1Dfjz
酒精类过滤。抄袭cybersitter的名单

tapfil.dat - http://privatepaste.com/ae0UoosGMk
纹身类过滤。


viofil.dat - http://privatepaste.com/f79OiqXC6J
暴力自杀类。


注意这些网址文件,结合以前网上流传出来的FalunWord.lib,我们可以得出一个很惊人的结论

  国内网站很少被屏蔽,.cn的网址很少出现。

为什么说这个结论很惊人

1. 为什么屏蔽对象仅仅局限于欧洲国家、美国的sex情暴力网站,甚至阿拉伯国家的极端宗教网站
1. 为什么这个耗资4170万的软件屏蔽对孩子有害的网站,都直接非法抄袭来自cybersitter的名单
3. 我知道的几个XX网站,名单里一个都没有!
4. 为什么几乎不怎么屏蔽国内垃圾站呢?国内的垃圾站还少了吗?

所以,绿坝根本不能算一个全功能的家长软件,只是国外同类软件的rip-off加上一个强大的合法木马监控每一台7月1日之后的新电脑。

一个很不情愿的猜测就是官老爷们压根不是认真做家长类软件的。这个软件压根就不是为了保护纳税人的孩子的。为是为了该软件的一些“附加功能”。例如汇报老大哥。比较善意的猜测就是一些利益集团想再度搜刮老百姓(特别是家电下乡的那些)利用国家手段强制搞的一个政策罢了。

最后要感谢http://scott.wolchok.org/greendam.html(解密源码的C算法在http://scott.wolchok.org/gddec.c,大家可以编译,自行解驴爸软件的.dat看看有那些网址),这些成果和你们的辛勤劳动是分不开的。

posted @ 2009-06-13 15:00 不需要解释 阅读(133) | 评论 (0)编辑 收藏

工信部,全称是工业和信息化部,名字莫名其妙,no three no four,不像个正经机构,做起事来果然也很不靠谱,很发飙。比如,最近,这个部忽然发布一个什么通知,要求所有新生产和销售的国产和进口计算机都安装“绿坝—花季护航”软件。
让所有计算机都安装自己的软件,这是无数软件工程师的梦想。年轻时的比尔·盖茨就曾这样幻想过——在每一台PC上都装有微软的操作系统。微软的梦想最终变成了现实。实现这个梦想的过程中有着令人叹为观止的天才、智慧、汗水、机遇和协作。这是计算机发展史上最振奋人心的奋斗历程之一。如今,工信部想凭两页自己弄出来的文件就美梦成真,做到同样的事情,这不是发飙是什么?
这个“绿坝—花季护航”软件是一个过滤软件,据文件说,可以过滤“互联网不良文字和图像内容”。工信部冠冕堂皇的理由是保护青少年,但地球人都知道,他们真正想要过滤的是成年人的头脑。道理很明显,如果真的想要保护青少年,那此软件只应该向家长推介,而不必向所有使用计算机的人强行推广。难道所有计算机使用者的年轻都尚处花季?再说,真正关心青少年身心健康的人当然是他们的家长,而不是某些坐在北京某办公楼内悠闲工作的公务员。为什么要由这些行为可疑、动辄发飙的公务员来代替家长决定如何教育孩子呢?
想要过滤成年人的头脑,这在当下的中国,并不稀奇。许多人都想做这件事。工信部也试图做这件事,这不是奇闻,也不算发飙,但工信部以如此笨拙荒唐的方式做这件事,就完全是奇闻了,不但是标准的发飙,简直可以称作没事找抽了。
发飙者的特征之一就是:做事不考虑后果。官方要求所有新生产销售的计算机都安装某种软件,这可不同于一般的商业软件上市。工信部考虑了这件事的所有后果吗?正常不发飙的人稍微一想就可以想出一大堆麻烦事:
首先,据说,该软件已经“综合测试和试点应用”,意思是,这个软件非常可靠,毫无问题。但稍知计算机的人都明白,新软件总会有问题,这是任何软件都无法彻底解决的问题。既然是强制安装,那消费者自然应该得到全额赔偿。具体来说,这个软件的安全性有保证吗?和系统软件和其他软件的兼容性如何?侵犯计算机使用者的隐私吗?如果有计算机因为这个软件而速度变慢,甚至系统崩溃,谁来负责维修和赔偿?由此而给财政造成的支出由谁来负责?工信部部长吗?
其次,既然是过滤软件,当然就会有过滤清单。工信部保证清单上的被过滤者都确实应该被过滤吗?这些被过滤者是经过什么程序,由哪些权威部门认定的?如果有冤假错案怎么办?如果某个网站其实很好,但被错误地列入过滤清单,由此导致其经济利益受损,工信部准备怎么赔偿?工信部部长个人的收入因此受影响吗?在工信部的文件中,我并没有找到被过滤者如何申辩的规定。死刑犯都可以上诉,但这些网站看来却毫无申辩的机会。或许,工信部假设自己绝不会犯错。这种假设不是发飙是什么?
第三,工信部花了4000万,只买断了一年的软件使用权。那么,一年以后怎么办?如果一年以后该软件企业利用这种行政垄断地位任意抬价,谁来负责?如果该软件企业日后未能及时升级,导致效用下降,谁来负责?如果该软件企业日后经营不善,破产倒闭,广大用户的权益谁来保护,由此造成的损失,谁来负责?
第四,类似的软件早就有了,这种东西的技术含量很低,弄几个软件人员就能搞出来。那么,请问,工信部为何偏偏选择“绿坝—花季护航”软件?这家软件公司并没有什么市场知名度,他们为什么这么幸运,一下子得到这样一个大单?此前召开过公开招标或者听证会吗?如果舆论质询,工信部部长准备怎么回答?
第五,工信部并不是执法机关,却发布这种带有强制性的文件。如果别人不遵守,你们怎么办?抓人?罚款?吊销营业执照?恐怕工信部都没有这种权力。那你们打算怎么办?发动公安工商城管联合执法吗?
中国的计算机行业是个高度灵活的行业,政府干预的力度并不大。这是一件好事,正因为这样,中国的计算机行业才发展迅速,商品品质不断提升,同时价格一降再降,消费者得到了非常大的利益。在这样一个高度灵活的行业中,某个笨拙的政府部门想要耍一把威风,基本上只能是自取其辱。他们会看到那些聪明的经营者是怎么像耍猴儿一样耍他们的。坐在办公室里悠哉游哉的公务员想和那些天天在市场中摸爬滚打的人比较智力和精力,胜算不会比面对美军的萨达姆更高。
当然,还有另一种解释,工信部的人并不是那么飙,他们也知道自己面临的种种困境,那他们为什么还要发布这种no three no four的文件呢?答案就在于那4000万的采购合同。现在的中国软件产业,凭着一个小软件,一年就可以得到4000万收入,这种好买卖,如果不是绝对没有,也是十分罕见的。工信部确定的这个明显过高的价格,其中大有可疑之处。
既有可疑之处,当然不希望人们大加关注。因此,工信部在文件中精心措辞,把强制性的措施架空成一纸空文。这样就可以把社会的关注或者反对降到最低程度。整篇通知都在用“应”,而不是“必须”。了解法律用语的人都知道,在法条中,“应该”和“必须”代表着两种执法力度。如果仅仅是“应该”,根本没有“必须”,那基本上等于没说。果然,在通知的最后,工信部也不得不承认,如果经营者对他们的这个通知不予理睬,当作废纸,不去装什么花季软件,工信部只能“责令改正”。也就是说,经营者即使被当面抓住,也不过是补装了事。工信部才不会傻乎乎去制定严厉的罚则。那种罚则不但无从执行,还会激起从业者的反抗。
对于工信部来说,最好的结果就是,发一个貌似强制的文件,给自己的4000万采购提供一个理由——全国都要强制安装,这么大的数量,自然需要花大笔钱买断软件。然后,由于只是“应该”,而不是“必须”,并且没有罚则,因此,所有人都不会认真执行这个文件,并很快忘掉这件事。这样一来,钱理由充分地花出去了,还不会真正触怒任何人。他们想“闷声发大财”。
但消息毕竟公布出去了。工信部的人还是蠢。你们以为自己真的能控制舆论、蒙混过关吗?那可是一项高难度的技术。许多专业人士都不见得能成功应付舆论。看,你们都成了网站头条了!没想到吧。因此,严重建议反应迟缓、未经过专业训练的公务员最好远离舆论,不要在刀口上舔血吃。
请问,那家软件公司的背景禁得住调查吗?工信部部长难道不知道人肉搜索这回事?这样在众目睽睽之下做事,如果一旦被人家查出不堪的事情来,工信部这不是没事找抽吗?4000万确实是一笔大钱,但能花的钱才是钱,如果钱没挣到,却被人查出腐败,还搭进去几个党的干部,那就太不值了。
请工信部的人记住:你们花的是纳税人的血汗钱。虽然你们口口声声说“政府出资”云云,好像在这个过程中,你们不但没占到便宜,还吃了大亏,但事实真相是,政府不能挣一分钱,政府只能花钱。根本没有什么政府的钱,有的只是纳税人的、被政府通过税收等各种手段强行拿走的血汗钱。
因此,作为一个纳税人,我呼吁,反贪局、纪委公开调查工信部“绿坝—花季护航”软件软件采购案,并将调查结果公布。调查重点是该软件公司和工信部有无关联?有无内部交易?有无私下密谋?该项采购案的程序是否合法?是否经过公开招标?其他同业软件商是否享有同等机会?4000万的定价依据是什么?该项款项的去处?审批人和经办人是谁?
我也呼吁所有有能力调查的媒体记者关注此事。纳税人的钱不应该这样被白白浪费和侵占,作为社会公器的媒体有责任揭露背后的真相。
既然工信部是没事找抽型,不抽他们几下也不对。

posted @ 2009-06-10 23:05 不需要解释 阅读(78) | 评论 (0)编辑 收藏

<html>
<head>
<style>
#test *{vertical-align:middle;}
</style>
<body>
    <div id="test">
        <img src="http://127.0.0.1:7001/wsc/images/message.png"/>
         <span>sdfhsdhfdksfjhtes:</span>
    </div>
</body>
</html>

请注意:#test *{vertical-align:middle;}

 

#test *表示了div里面所有元素,当然包含了span,input,img这些内联元素了。

 

vertical-align
初始值: baseline(缺省值)
可否继承:否
适用于: 内联元素
说明:vertical-align:baseline使元素的基线同父元素的基线对齐.
警告:vertical-align不能影响表格单元中的内容的对齐,对于块元素中的内容也一样.

  请注意,vertical-align只影响内联元素,比如span,img,em,input,a等这些元素,而对div,h3,p等这些块元素是无效的.

posted @ 2009-06-09 18:29 不需要解释 阅读(9603) | 评论 (1)编辑 收藏

Mave is good at jar management. so maven can help me to package the java application. with maven help, we can make the release application zip smaller.

for the smaller:we use the maven ant task to manager jars:

build.xml

<project basedir="." default="all" name="jars" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
<property name="build.compiler" value="modern"/>
     <path id="maven-ant-tasks.classpath" path="${basedir}/maven/maven-ant-tasks-2.0.10.jar" />
  <typeset resource="org/apache/maven/artifact/ant/antlib.xml"
           uri="antlib:org.apache.maven.artifact.ant"
           classpathref="maven-ant-tasks.classpath" />

    <target name="all">
          <antcall target="get_server_jars"/>
          <antcall target="get_orchis_jars"/>
    </target>

    <target name="get_server_jars">
        <artifact:dependencies pathId="dependency.classpath"  filesetId="maven.fileset">
        <dependency groupId="junit" artifactId="junit" version="3.8.2"/>  
        <dependency groupId="activation" artifactId="activation" version="1.1"/>    
        <dependency groupId="castor" artifactId="castor" version="1.1"/>    

        </artifact:dependencies>

    <copy todir="${basedir}/lib">
        <fileset refid="maven.fileset" />
        <!-- This mapped strips off all leading directory information -->
        <mapper type="flatten" />
    </copy>
</target>

    <target name="get_orchis_jars">
        <artifact:dependencies pathId="dependency.classpath"  filesetId="maven.fileset">
            <dependency groupId="junit" artifactId="junit" version="3.8.2"/>       
            <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.4"/>      
        </artifact:dependencies>

    <copy todir="${basedir}/webapps/ROOT/WEB-INF/lib">
        <fileset refid="maven.fileset" />
        <!-- This mapper strips off all leading directory information -->
        <mapper type="flatten" />
    </copy>
</target>

so we can use maven to update you application.

posted @ 2009-06-07 14:25 不需要解释 阅读(199) | 评论 (0)编辑 收藏

as we know maven can manager you jars, I am maven funs, Maven can give me lots of good idea. Compare with ant.

(1)no class path problem.

    Sometimes Many use of ant complained because of class path. They can not direct know which jars they used in project, almost version.

(2)lots of plug-in to use with maven.(maven-jetty-plug-in)

(3)maven report is usefully for improve you code.

(4)manager your jar of application.

(5)good for team.

(6)easy to use.

About this point, user of ant do not agree with me. but i think maven easy to use, you do not need to care class path, you can easily to get all report.

posted @ 2009-06-07 14:19 不需要解释 阅读(115) | 评论 (0)编辑 收藏

运行自己配置的web应用,往往只能看见weblogic编译之后的class文件。而看不见编译前的java的文件。为了调试方便,我们有时候是想看编译前的java文件。
在weblogic.xml中加入
<jsp-descriptor>
  <jsp-param>
    <param-name>keepgenerated</param-name>
    <param-value>true</param-value>
  </jsp-param>
</jsp-descriptor>

即可。
如果没有,在WEB-INF中建立一个weblogic.xml文件。
增加
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE weblogic-web-app
    PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"
    "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd" >
<weblogic-web-app>   
    <jsp-descriptor>
        <jsp-param>
            <param-name>keepgenerated</param-name>
            <param-value>true</param-value>
        </jsp-param>
    </jsp-descriptor>
</weblogic-web-app>

看看web应用在weblogic中生成临时文件中,有java文件了吧!!

posted @ 2009-06-03 18:09 不需要解释 阅读(748) | 评论 (0)编辑 收藏

    as we know, in weblogic 10. the weblogic.jar just has more than 30MB. so if you want use the client to invoke weblogic ejb method, you need the weblogic.jar. of course, if you use the weblogic9, it work well, but when you upgrade your weblogic server to weblogic10. the weblogic.jar does not work. the weblogic.jar of the weblogic10 is not enough.

you need do next:


     Use the following steps to create a wlfullclient.jar file for a client application:

      Change directories to the server/lib directory.
cd WL_HOME/server/lib
Use the following command to create wlfullclient.jar in the server/lib directory:
java -jar ../../../modules/com.bea.core.jarbuilder_X.X.X.X.jar
where X.X.X.X is the version number of the jarbuilder module in the WL_HOME/server/lib directory. For example:

      java -jar ../../../modules/com.bea.core.jarbuilder_1.0.1.0.jar
You can now copy and bundle the wlfullclient.jar with client applications.
Add the wlfullclient.jar to the client application’s classpath.

posted @ 2009-06-02 11:53 不需要解释 阅读(158) | 评论 (0)编辑 收藏

Based on the popular and very useful mod_rewrite for apache, UrlRewriteFilter is a Java Web Filter for any J2EE compliant web application server (such as Resin, Orion or Tomcat), which allows you to rewrite URLs before they get to your code. It is a very powerful tool just like Apache's mod_rewrite.

URL rewriting is very common with Apache Web Server (see mod_rewrite's rewriting guide) but has not been possible in most java web application servers. The main things it is used for are:

  • URL Tidyness / URL Abstraction - keep URLs tidy irrespective of the underlying technology or framework (JSP, Servlet, Struts etc).
  • Browser Detection - Allows you to rewrite URLs based on request HTTP headers (such as user-agent or charset).
  • Date based rewriting - Allows you to forward or redirect to other URL's based on the date/time (good for planned outages).
  • Moved content - enable a graceful move of content or even a change in CMS.
  • Tiny/Friendly URL's (i.e. blah.com/latest can be redirected to blah.com/download/ver1.2.46.2/setup.exe)
  • A Servlet mapping engine (see Method Invocation)

UrlRewriteFilter uses an xml file, called urlrewrite.xml (it goes into the WEB-INF directory), for configuration. Most parameters can be Perl5 style Regular Expressions or Wildcard Expressions. This makes it very powerful indeed.

 

example:

web.xml

  <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
urlrewrite.xml
<?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE urlrewrite
        PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

    <urlrewrite>
        <rule>
           <from>^/some/olddir/(.*)$</from>
           <to type="redirect">/very/newdir/$1</to>
        </rule>

        <rule match-type="wildcard">
           <from>/blog/archive/**</from>
           <to type="redirect">/roller/history/$1</to>
        </rule>
    </urlrewrite>

posted @ 2009-05-24 16:15 不需要解释 阅读(126) | 评论 (0)编辑 收藏

HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。HttpSessionBindingListener接口中共定义了两个方法:

valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。

所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。

// 把用户名放入在线列表

session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));

这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别: HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。 HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。

valueBound()方法的代码如下:

public void valueBound(HttpSessionBindingEvent event) {

HttpSession session = event.getSession();

ServletContext application = session.getServletContext();



// 把用户名放入在线列表

List onlineUserList = (List) application.getAttribute("onlineUserList");

// 第一次使用前,需要初始化

if (onlineUserList == null) {

onlineUserList = new ArrayList();

application.setAttribute("onlineUserList", onlineUserList);

}

onlineUserList.add(this.username);

}

username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。

与之对应的valueUnbound()方法,代码如下:

public void valueUnbound(HttpSessionBindingEvent event) {

HttpSession session = event.getSession();

ServletContext application = session.getServletContext();



// 从在线列表中删除用户名

List onlineUserList = (List) application.getAttribute("onlineUserList");

onlineUserList.remove(this.username);



System.out.println(this.username + "退出。");

}

这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。

valueUnbound的触发条件是以下三种情况:

  1. 执行session.invalidate()时。

  2. session超时,自动销毁时。

  3. 执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。

因此,只要不将listener从session中删除,就可以监听到session的销毁。

posted @ 2009-05-20 17:41 不需要解释 阅读(3502) | 评论 (0)编辑 收藏

1、关于文本编辑器;

文本编辑器有很多,比如图形模式的gedit、kwrite、OpenOffice ... ... ,文本模式下的编辑器有vi、vim(vi的增强版本)和nano ... ... vi和vim是我们在Linux中最常用的编辑器。我们有必要介绍一下vi(vim)最简单的用法,以让Linux入门级用户在最短的时间内学会使用它。

nano 工具和DOS操作系统下的edit操作相似,使用简单,我们不作介绍了,如果您有兴趣,不妨尝试一下;


2、vi 编辑器;

为什么要学会简单应用vi

vi或vim是Linux最基本的文本编辑工具,vi或vim虽然没有图形界面编辑器那样点鼠标的简单操作,但vi编辑器在系统管理、服务器管理中,永远不是图形界面的编辑器能比的。当您没有安装X-windows桌面环境或桌面环境崩溃时,我们仍需要字符模式下的编辑器vi;

vi或vim 编辑器在创建和编辑简单文档最高效的工具;


3、vi 编辑器的使用方法;


3.1 如何调用vi ;

[root@localhost ~]# vi  filename

~
~
~
~
~
~
~
~


3.2 vi 的三种命令模式;

Command(命令)模式,用于输入命令;
Insert(插入)模式,用于插入文本;
Visual(可视)模式,用于视化的的高亮并选定正文;


3.3 文件的保存和退出;

Command 模式是vi或vim的默认模式,如果我们处于其它命令模式时,要通过ESC键切换过来。

当我们按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令;

:w  保存;
:w  filename 另存为filename;
:wq! 保存退出;
:wq! filename 注:以filename为文件名保存后退出;
:q! 不保存退出;
:x 应该是保存并退出 ,功能和:wq!相同


3.4 光标移动;

当我们按ESC进入Command模式后,我们可以用下面的一些键位来移动光标;

j 向下移动一行;
k 向上移动一行;
h 向左移动一个字符;
l 向右移动一个字符;
ctrl+b  向上移动一屏;
ctrl+f  向下移动一屏;
向上箭头    向上移动;
向下箭头    向下移动;
向左箭头    向左移动;
向右箭头    向右移动;

我们编辑一个文件时,对于 j、k、l和h键,还能在这些动作命令的前面加上数字,比如 3j,表示向下移动3行。


3.5 插入模式(文本的插入);

i  在光标之前插入;
a  在光标之后插入;
I 在光标所在行的行首插入;
A  在光标所在行的行末插入;
o  在光标所在的行的上面插入一行;
O  在光标所在的行的下面插入一行;
s  删除光标后的一个字符,然后进入插入模式;
S  删除光标所在的行,然后进入插入模式;


3.6 文本内容的删除操作;

x 一个字符;
#x 删除几个字符,#表示数字,比如3x;
dw 删除一个单词;
#dw 删除几个单词,#用数字表示,比如3dw表示删除三个单词;
dd 删除一行;
#dd 删除多个行,#代表数字,比如3dd 表示删除光标行及光标的下两行;
d$ 删除光标到行尾的内容;
J 清除光标所处的行与上一行之间的空格,把光标行和上一行接在一起;


3.7 恢复修改及恢复删除操作;

u  撤消修改或删除操作;

按ESC键返回Command(命令)模式,然后按u键来撤消删除以前的删除或修改;如果您想撤消多个以前的修改或删除操作,请按多按几次u。这和Word的撤消操作没有太大的区别;


3.8 可视模式;

在最新的Linux发行版本中,vi提供了可视模式,因为这个功能是vim才有的。如果您用的vi没有这个功能,就换成vim就有了。打开可视模式,按ESC键,然后按v就进入可视模式;

可视模式为我们提供了极为友好的选取文本范围,以高亮显示;在屏幕的最下方显示有;

-- 可视 --  

--VISUAL--

如图:

进入可视模式,我们就可以用前面所说的命令行模式中的光标移动指令,可以进行文本范围的选取。

选取文本范围有何用?

我们可以对某部份删除作业,按d键就删除了我们选中的内容。
选中内容后,我们按y就表示复制;按d表示删除;

值得一提是的删除的同时,也表示复制。我们返回到命令模式,然后移动光标到某个位置,然后按shift+p键,就把刚才删除的内容贴上了。我们先在这里提一句,在后文,我们还得详细说说。

退出可视模式,还是用ESC键;


3.9 复制和粘帖的操作;

其实删除也带有剪切的意思,当我们删除文字时,可以把光标移动到某处,然后按shift+p键就把内容贴在原处,然后再移动光标到某处,然后再按p或shift+p又能贴上;

p 在光标之后粘帖;
shift+p 在光标之前粘帖

来举一例:

比如我们想把一个文档的第三行复制下来,然后帖到第五行的后面,我们应该怎么做呢?

有两种方法;

第一种方法:

先把第三行删除,把光标移动到第三行处,然后用dd动作,接着再按一下shift+p键。这样就把刚才删除的第三行帖在原处了。

接着我们再用k键移动光标到第五行,然后再按一下p键,这样就把第三行的内容又帖到第五行的后面了;

第二种方法;

进入可视模式,按ESC键,然后按v键。移动鼠标指针,选中第三行的内容,然后按y键复制;再移动指针到第五行,最后按p键;

所以复制和粘贴操作,是命令模式、插入模式及可视模式的综合运用;我们要学会各种模式之间的切换,要常用ESC键;更为重要的学会在命令模式下移动光标;


3.10 关于行号;

有时我们配置一个程序运行时,会出现配置文件X行出现错误 。这时我们要用到行号相关的操作;


为所有内容添加行号;

按ESC键,然后输入:

:set number

光标所处位置

在屏幕的右下角,有类似如下的;

         57,8          27%

在这之中,57表示第57行,8表示第8个字符;


3.11 查找和替换功能;


3.11.1 查找;

首先,我们要进入ESC键,进入命令模式;我们输入/或?就进入查找模式了;

/SEARCH  注:正向查找,按n键把光标移动到下一个符合条件的地方;
?SEARCH  注:反向查找,按shift+n 键,把光标移动到下一个符合条件的

举一例:比如我想在一个文件中找到swap单词,我应该如下做;

首先按ESC键,进入命令模式,然后输入;

/swap

?swap


3.11.2 替换;

按ESC键进入命令模式;

:s /SEARCH/REPLACE/g  注:把当前光标所处的行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示;
:%s /SEARCH/REPLACE  注:把文档中所有SEARCH替换成REPLACE;
:#,# s /SEARCH/REPLACE/g  注:#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;

注:在这之中,g表示全局查找;我们注意到,就是没有替换的地方,也会把SEARCH高亮显示;

举例说明:

比如我们有一篇文档要修改;

我们把光标所在的行,把所有单词the,替换成THE,应该是:

:s /the/THE/g

我们把整篇文档的所有的the都替换成THE,应该是:

:%s /the/THE

我们仅仅是把第1行到第10行中的the,替换成THE,应该是;

:1,10  s /the/THE/g


参考:man vi 和vi –help

posted @ 2009-05-20 15:57 不需要解释 阅读(88) | 评论 (0)编辑 收藏

      一个Maven项目发布版本号用version 编码,用来分组和排序发布。Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本号。一个版本中,这些部分对应如下的格式:

<major version>.<minor version>.<incremental version>-<qualifier>

例如:版本“1.3.5”由一个主版本1,一个次版本3,和一个增量版本5。而一个版本“5”只有主版本5,没有次版本和增量版本。限定版本用来标识里程碑构建:alpha和beta发布,限定版本通过连字符与主版本,次版本或增量版本隔离。例如,版本“1.3-beta-01”有一个主版本1,次版本3,和一个限定版本“beta-01”。

当你想要在你的POM中使用版本界限的时候,保持你的版本号与标准一致十分重要。在版本界限,允许你声明一个带有版本界限的依赖,只有你遵循标准的时候该功能才被支持。因为Maven根据本节中介绍的版本号格式来对版本进行排序。

如果你的版本号与格式<主版本>.<次版本>.<增量版本>-<限定版本>相匹配,它就能被正确的比较;“1.2.3”将被评价成是一个比“1.0.2”更新的构件,这种比较基于主版本,次版本,和增量版本的数值。如果你的版本发布号没有符合本节介绍的标准,那么你的版本号只会根据字符串被比较;“1.0.1b”和“1.2.0b”会使用字符串比较。

1. 版本构建号

       我们还需要对版本号的限定版本进行排序。以版本号“1.2.3-alpha-2”和“1.2.3-alpha-10”为例,这里“alpha-2”对应了第二次alpha构建,而“alpha-10”对应了第十次alpha构建。虽然“alpha-10”应该被认为是比“alpha-2”更新的构建,但Maven排序的结果是“alpha-10”比“alpha-2”更旧,问题的原因就是我们刚才讨论的Maven处理版本号的方式。

Maven会将限定版本后面的数字认作一个构建版本。换句话说,这里限定版本是“alpha”,而构建版本是2。虽然Maven被设计成将构建版本和限定版本分离,但目前这种解析还是失效的。因此,“alpha-2”和“alpha-10”是使用字符串进行比较的,而根据字母和数字“alpha-10”在“alpha-2”前面。要避开这种限制,你需要对你的限定版本使用一些技巧。如果你使用“alpha-02”和“alpha-10”,这个问题就消除了,一旦Maven能正确的解析版本构建号之后,这种工作方式也还是能用。

2. SNAPSHOT版本

       Maven版本可以包含一个字符串字面量来表示项目正处于活动的开发状态。如果一个版本包含字符串“SNAPSHOT”,Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC(协调世界时)。例如,如果你的项目有个版本为“1.0-SNAPSHOT”并且你将这个项目的构件部署到了一个Maven仓库,如果你在UTC2008年2月7号下午11:08部署了这个版本,Maven就会将这个版本展开成“1.0-20080207-230803-1”。换句话说,当你发布一个snapshot,你没有发布一个软件模块,你只是发布了一个特定时间的快照版本。

那么为什么要使用这种方式呢?SNAPSHOT版本在项目活动的开发过程中使用。如果你的项目依赖的一个组件正处于开发过程中,你可以依赖于一个SNAPSHOT版本,在你运行构建的时候Maven会定期的从仓库下载最新的snapshot。类似的,如果你系统的下一个发布版本是“1.4”你的项目需要拥有一个“1.4-SNAPSHOT”的版本,之后它被正式发布。

作为一个默认设置,Maven不会从远程仓库检查SNAPSHOT版本,要依赖于SNAPSHOT版本,用户必须在POM中使用repositorypluginRepository元素显式的开启下载snapshot的功能。

当发布一个项目的时候,你需要解析所有对SNAPSHOT版本的依赖至正式发布的版本。如果一个项目依赖于SNAPSHOT,那么这个依赖很不稳定,它随时可能变化。发布到非snapshot的Maven仓库(如http://repo1.maven.org/maven2)的构件不能依赖于任何SNAPSHOT版本,因为Maven的超级POM对于中央仓库关闭了snapshot。SNAPSHOT版本只用于开发过程。

3. LATEST 和 RELEASE 版本

      当你依赖于一个插件或一个依赖,你可以使用特殊的版本值LATEST或者RELEASE。LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件。RELEASE是指仓库中最后的一个非快照版本。总得来说,设计软件去依赖于一个构件的不明确的版本,并不是一个好的实践。如果你处于软件开发过程中,你可能想要使用RELEASE或者LATEST,这么做十分方便,你也不用为每次一个第三方类库新版本的发布而去更新你配置的版本号。但当你发布软件的时候,你总是应该确定你的项目依赖于某个特定的版本,以减少构建的不确定性,免得被其它不受你控制的软件版本影响。如果无论如何你都要使用LATEST和RELEASE,那么要小心使用。

Maven 2.0.9之后,Maven在超级POM中锁住了一些通用及核心Maven插件的版本号,以将某个特定版本Maven的核心Maven插件组标准化。这个变化在Maven 2.0.9中被引入,为Maven构建带来了稳定性和重现性。在Maven 2.0.9之前,Maven会自动将核心插件更新至LATEST版本。这种行为导致了很多奇怪现象,因为新版本的插件可能会有一些bug,甚至是行为变更,这往往使得原来的构建失败。当Maven自动更新核心插件的时候,我们就不能保证构建的重现性,因为插件随时都可能从中央仓库更新至一个新的版本。从Maven 2.0.9开始,Maven从根本上锁住了一组核心插件的版本。非核心插件,或者说没有在超级POM中指定版本的插件仍然会使用LATEST版本去从仓库获取构件。由于这个原因,你在构件中使用任何一个自定义非核心插件的时候,都应该显式的指定版本号。

posted @ 2009-05-14 10:00 不需要解释 阅读(3287) | 评论 (0)编辑 收藏

Often times you will have 3rd party JARs that you need to put in your local repository for use in your builds. The JARs must be placed in the local repository in the correct place in order for it to be correctly picked up by Maven. To make this easier, and less error prone, we have provide a goal in the install plug-in which should make this relatively painless. To install a JAR in the local repository use the following command:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
    -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

for example:

mvn install:install-file -Dfile=jazzy-core-0.5.2.jar -DgroupId=jazzy-core  -DartifactId=jazzy -Dversion=0.5.2 -Dpackaging=jar

posted @ 2009-05-06 11:06 不需要解释 阅读(62) | 评论 (0)编辑 收藏

ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。
对于获取方法,JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系。

注意: JDBC 驱动程序目前不支持 SQL Server sqlvariant 数据类型。如果使用查询从包含 sqlvariant 数据类型列的表中检索数据,则会发生异常。

Getter 方法转换

基于 SQL Server 2005 的数据类型,以下图表包含 SQLServerResultSet 类的 get<Type> 方法的 JDBC 驱动程序转换图,以及 SQLServerCallableStatement 类的 get<Type> 方法支持的转换。

JDBC 驱动程序的 getter 方法支持三种基本的转换类别:

  • Non-Lossy (x) :在 getter 类型等于或小于基础服务器类型的情况下执行转换。例如,对基础服务器的十进制数列调用 getBigDecimal 时,无需进行转换。
  • Converted (y) :从数字服务器类型到 Java 语言类型的转换,此时的转换为常规转换,并遵循 Java 语言转换规则。对于这些转换,总是直接截取有效位数(从不四舍五入),而溢出则按目标类型取模处理,以较小者为准。例如,对包含“1.9999”的基础十进制数列调用 getInt 将返回“1”;如果基础十进制数值为“3000000000”,则 int 值将溢出为“-1294967296”。
  • Data Dependent (z) :从基础字符类型转换到数字类型时,要求字符类型所包含的值可转换成数字类型。不执行其他转换。如果值对于 getter 类型过大,则该值无效。例如,如果对包含“53”的 varchar(50) 列调用 getInt ,则该值作为 int 返回;但如果基础值为“xyz”或“3000000000”,则发生错误。

posted @ 2009-05-05 16:07 不需要解释 阅读(270) | 评论 (0)编辑 收藏

最近研究了一下opencms的locale,总结如下:
(1)opencms 在启动的时候会设置locale为en。
(2)可以在folder上面设置locale,如果本级locale没有设置使用父级的,如果还是为空使用en。

posted @ 2008-03-17 22:25 不需要解释 阅读(271) | 评论 (1)编辑 收藏

 

本年度的学习主要围绕当前的工作主题和自己比较有兴趣的内容制定此计划。

2008-2

1opencms

进一步熟悉jsp170规范,比较opencms7比当前我们使用的opencms6.2.3的改进。熟悉opencms user manager,权限,模块开发,site development

2)整理,编写opencms的开发文档

2008-3

1sso,分析当前sso的现状。了解使用sso带来的好处。配置和使用cas做练习。

2weblogic ssl配置。

3openssl的使用。

2008-4

1jetspeed 学习jsr268规范,了解和jsr168的区别和改动。进一步分析jetspeedsso实现。porelet定制实现。

2)研究mvnforum的配置和使用。

3)企业门户研究,研究企业门户应该满足那些功能,怎么更好的实现。

2008-5

1webservice,分析和学习apachewebservice实现。

2etom模型的sid规范。

2008-6

1osgi,学习osgi的规范,在设计中应该怎么使用osgi思想。

2008-7

1jpa的使用和实现。


 

posted @ 2008-03-08 22:30 不需要解释 阅读(180) | 评论 (0)编辑 收藏

     摘要:  # # Based upon the NCSA server configuration files originally by Rob McCool. # # This is the main Apache server configuration file.  It contains the # configuration directives that give...  阅读全文

posted @ 2007-11-22 10:35 不需要解释 阅读(1203) | 评论 (0)编辑 收藏

通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。Servlet控制业务流转,JSP则负责业务处理结果的显示。此时,将大量用到重定向技术。

        重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。本文主要探讨服务器端重定向技术的实现。


服务器端的重定向相关类
        服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。
服务器端的重定向方式
        服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。下面对这两种方式进行介绍。

HttpServletResponse.sendRedirect()方法

HttpServletResponse接口定义了可用于转向的sendRedirect()方法。代码如下:

public void sendRedirect(java.lang.String location)throws java.io.IOException


        这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。

RequestDispatcher.forward()方法

        RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法,参见如下代码:

public interface RequestDispatcher {
void forward(ServletRequest request, ServletResponse response);
void include(ServletRequest request, ServletResponse response);
}

        forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。

        注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。


如何得到RequestDispatcher


        有三种方法可以得到Request Dispatcher对象。

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。

2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。

3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。

这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件web.xml:

<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/firstservlet/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet/secondservlet/</url-pattern>
</servlet-mapping>
</web-app>

 

        其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:

http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代码:

RequestDispatcher rd = request.getRequestDispatcher("secondservlet");
rd.forward(request, response);

 

此时控制权将转向到第二个Servlet了。

使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:

RequestDispatcher rd = getServletContext().getRequest
Dispatcher("/servlet/secondservlet");
rd.forward(request, response);

 

使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:

RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet");
rd.forward(request, response);

 

这样也可以重定向到SecondServlet了。


JSP页面中的重定向


        JSP在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代码,并且,JSP还提供了更便利的操作,如下:

<jsp:forward page= "nextpage.jsp"/>

 

        JSP页面执行到这儿,将终止当前的处理,将控制权交由nextpage.jsp。


如何选择


        RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法


posted @ 2007-11-16 10:40 不需要解释 阅读(741) | 评论 (0)编辑 收藏

Apache HTTP Server 插件概述

Apache HTTP Server 插件允许将请求从 Apache HTTP Server 代理到 WebLogic Server。该插件允许 WebLogic Server 处理要求使用 WebLogic Server 动态功能的请求,从而增强了 Apache 安装。

该插件专用于某种环境,在这样的环境中,Apache Server 提供静态页,而文档树的另一个部分(最好是由 HTTP Servlet 或 Java Server Page 生成的动态页)会委托给可以在不同的进程中(可能在不同的主机上)进行操作的 WebLogic Server。对于最终用户(浏览器),委托给 WebLogic Server 的 HTTP 请求看似仍然来自同一个来源。

HTTP 隧道是一种技术,它允许 HTTP 请求和响应通过公司的防火墙进行访问。它也可以通过插件操作,提供对 WebLogic Server 服务的非浏览器客户端访问。

Apache HTTP Server 插件充当 Apache HTTP Server 中的 Apache 模块。Apache 模块由 Apache Server 在启动时加载,然后某些 HTTP 请求会委托给它。Apache 模块类似于 HTTP Servlet(除了 Apache 模块是用平台本地代码编写的之外)。

有关支持 Apache HTTP Server 插件的配置的信息,请参阅 http://edocs.bea.com/platform/suppconfigs/configs92/92_over/add-ons.html

Apache 2.0 版中的保持活动连接

2.0 版的 Apache HTTP Server 插件通过使用从插件到 WebLogic Server 的可重用连接缓冲池提高了性能。该插件通过对来自同一客户端的后续请求重用缓冲池中的同一连接,在插件和 WebLogic Server 之间实现了 HTTP 1.1 保持活动连接。如果连接处于非活动状态的时间超过 30 秒(或用户定义的时间),则会关闭该连接并将其返回到缓冲池中。可以根据需要禁用此功能。有关详细信息,请参阅“KeepAliveEnabled”。

代理请求

插件根据指定的配置将请求代理到 WebLogic Server。可以根据请求的 URL(或 URL 的一个部分)代理请求。这称为按路径进行代理。还可以根据请求文件的 MIME 类型代理请求。或者可以使用这两种方法的组合。如果请求同时符合这两个条件,则按路径代理请求。同时,可以为每种类型的请求指定其他参数,来定义插件的其他行为。有关详细信息,请参阅配置 Apache HTTP Server 插件

Apache 2.2

尽管此文档讨论的是 Apache 2.0,您可应用同样的说明来使用具有表 3-2 中所示的库的 Apache 2.2。

证书

Linux、Solaris、Windows 和 HPUX11 平台支持 Apache HTTP Server 插件。有关对特定 Apache 版本的支持信息,请参阅 http://edocs.bea.com/platform/suppconfigs/configs92/92_over/add-ons.html

 


安装 Apache HTTP Server 插件

可将 Apache HTTP Server 插件作为 Apache HTTP Server 安装中的 Apache 模块进行安装,并将其作为动态共享对象(Dynamic Shared Object,简称 DSO)进行链接。

DSO 作为服务器在运行时动态加载的库进行编译,可以在不重新编译 Apache 的情况下安装。

将 Apache HTTP Server 插件作为动态共享对象安装

Apache 插件作为 Solaris、Linux、Windows 和 HPUX11 平台的共享对象 (.so) 分发。BEA WebLogic 提供因平台、是否要在客户端和 Apache 之间使用 SSL 以及 SSL 加密强度(常规或 128 位 - 只有在安装 128 位版本的 WebLogic Server 时才会安装 128 位版本)而异的共享对象文件版本。

表 3-1 显示包含各种平台的共享对象文件的 WebLogic Server 安装目录(其中 WL_HOME 是 WebLogic 平台的顶级安装目录)。

表 3-2 针对不同版本的 Apache HTTP Server 和不同加密强度来标识 WebLogic Server Apache 插件模块。

表 3-1 插件共享对象文件的位置
操作系统
共享对象位置
Solaris
WL_HOME/weblogic92/server/plugin/solaris/sparc
Linux
WL_HOME/weblogic92/server/plugin/linux/i686
WL_HOME/weblogic92/server/plugin/linux/ia64
WL_HOME/weblogic92/server/plugin/linux/s390
Windows(仅适用于 Apache 2.0)
WL_HOME\weblogic92\server\plugin\win\32
WL_HOME\weblogic92\server\plugin\win\64
HPUX11
WL_HOME/weblogic92/server/plugin/hpux11/IPF64
WL_HOME/weblogic92/server/plugin/hpux11/PA_RISC
警告: 如果在 HP-UX11 上运行 Apache 2.0.x Server,请在构建 Apache Server 之前设置下面紧邻的环境变量。由于 HP-UX 上加载链接库的顺序问题,如果在生成之前未将加载顺序预设为环境变量,则可能导致核心转储。设置下列环境变量,然后继续 Apache configure, makemake install 步骤(在 Apache HTTP Server 文档中描述了这些步骤,该文档位于 http://httpd.apache.org/docs-2.1/install.html#configure):
export EXTRA_LDFLAGS="-lstd -lstream -lCsup -lm -lcl -ldld -lpthread"

从下表中选择适当的插件共享对象版本:

表 3-2 Apache 插件共享对象文件版本
Apache 版本
常规强度的加密
128 位加密
标准 Apache 2.0.x 版
mod_wl_20.so
mod_wl28_20.so
标准 Apache 2.2.x 版
mod_wl_22.so
mod_wl28_22.so

要将 Apache HTTP Server 插件作为动态共享对象安装,请执行下列操作:

  1. 使用表 3-1 找到您的平台的共享对象目录。
  2. 表 3-2 中确定您的 Apache 版本的插件共享对象文件。
  3. 验证是否已启用 WebLogic Server Apache HTTP Server 插件 mod_so.c 模块。

    Apache HTTP Server 插件将作为动态共享对象 (DSO) 安装在 Apache HTTP Server 安装中。Apache 中的 DSO 支持是基于模块 mod_so.c 的,必须在加载 mod_wl_20.so 之前启用该模块。如果使用 Apache 提供的脚本安装 Apache HTTP Server,则 mod_so.c已被启用。通过执行以下命令,验证是否已启用 mod_so.c

    APACHE_HOME\bin\apache -l

    (其中 APACHE_HOME 是包含 Apache HTTP Server 安装的目录。)

    此命令会列出所有已启用的模块。如果未列出 mod_so.c,则必须重新生成 Apache HTTP Server,以确保配置下列选项:

    ...
    --enable-module=so
    --enable-rule=SHARED_CORE
    ...
    请参阅位于 
        http://httpd.apache.org/docs/2.0/dso.html 的“Apache 2.0 Shared Object (DSO) Support”。
  4. mod_wl_20.so 文件复制到 APACHE_HOME\modules 目录中,并将以下行手工添加到 APACHE_HOME/conf/httpd.conf 文件中,为 Apache 2.0.x 版安装 Apache HTTP Server 插件模块:
    LoadModule weblogic_module     modules/mod_wl_20.so
  5. 为 Apache HTTP Server 插件定义任何其他参数。

    Apache HTTP Server 插件可识别 Web 服务器插件的常规参数中列出的参数。要修改 Apache HTTP Server 插件的行为,请在以下块中定义这些参数:

    • Location 块中,定义适用于按路径进行的代理的参数
    • IfModule 块中,定义适用于按 MIME 类型进行的代理的参数
  6. 使用下列命令验证 APACHE_HOME\conf\httpd.conf 文件的语法:
    APACHE_HOME\bin\apachectl -t 

    此命令的输出将报告 httpd.conf 文件中的任何错误或返回:

    Syntax OK
  7. 重新启动 Weblogic Server。
  8. 启动(或重新启动,如果已更改配置)Apache HTTP Server。
  9. 通过打开浏览器并将 URL 设置为 Apache Server +“/weblogic/”(这将打开默认 WebLogic Server HTML 页、欢迎文件或默认 Servlet,如 WebLogic Server 上对默认 Web 应用程序的定义)来测试插件。例如:
    http://myApacheserver.com/weblogic/

 


配置 Apache HTTP Server 插件

在 Apache HTTP Server 中安装插件后,需要对 WebLogic Server Apache 插件进行配置并将服务器配置为使用该插件。本部分说明如何编辑 Apache httpd.conf 文件以指示 Apache 服务器为作为 Apache 模块的插件加载 WebLogic Server 库,并指定应由该模块处理的应用程序请求。

编辑 httpd.conf 文件

编辑 Apache HTTP Server 安装中的 httpd.conf 文件以配置 Apache HTTP Server 插件。

本部分说明如何查找和编辑 httpd.conf 文件以实现下列操作:配置服务器以使用 WebLogic Server Apache 插件、按路径或 MIME 类型代理请求、启用 HTTP 隧道,以及使用其他 WebLogic Server 插件参数。

  1. 打开 httpd.conf 文件。

    该文件位于 APACHE_HOME\conf\httpd.conf(其中 APACHE_HOME 是 Apache HTTP Server 安装的根目录)。请参阅设置边界身份验证中的示例 httpd.conf 文件。

  2. 确保 Apache 2.0.x 中包含 WebLogic Server 模块,手工将下面的行添加到 httpd.conf 文件中。
    LoadModule weblogic_module   modules\mod_wl_20.so
  3. 添加用于定义以下参数之一的 IfModule 块:

    对于非群集 WebLogic Server:

    WebLogicHost 和 WebLogicPort 参数。

    对于 WebLogic Server 群集:

    WebLogicCluster 参数。

    例如:

    <IfModule mod_weblogic.c>
      WebLogicHost myweblogic.server.com
      WebLogicPort 7001
    </IfModule>
  4. 要按 MIME 类型代理请求,请将 MatchExpression 行添加到 IfModule 块中。请注意,如果同时启用按 MIME 类型进行的代理和按路径进行的代理,则按路径进行的代理优先于按 MIME 类型进行的代理。

    例如,以下针对非群集 WebLogic Server 的 IfModule 块指定代理具有 MIME 类型 .jsp 的所有文件:

    <IfModule mod_weblogic.c>
      WebLogicHost myweblogic.server.com
      WebLogicPort 7001
      MatchExpression *.jsp
    </IfModule>

    也可以使用多个 MatchExpressions,例如:

    <IfModule mod_weblogic.c>
      WebLogicHost myweblogic.server.com
      WebLogicPort 7001
      MatchExpression *.jsp
      MatchExpression *.xyz
    </IfModule>

    如果要按 MIME 类型将请求代理到 WebLogic Server 群集,请使用 WebLogicCluster 参数,而不使用 WebLogicHostWebLogicPort 参数。例如:

    <IfModule mod_weblogic.c>
      WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
      MatchExpression *.jsp
      MatchExpression *.xyz
    </IfModule>
  5. 要按路径代理请求,请使用 Location 块和 SetHandler 语句。SetHandler 指定Apache HTTP Server 插件模块的处理程序。例如,以下位置块代理 URL 中包含 /weblogic 的所有请求:
    <Location /weblogic>
    SetHandler weblogic-handler
    PathTrim /weblogic
    </Location>

    PathTrim 参数指定在将请求传递到 WebLogic Server 实例之前从 URL 的开始部分剪切的字符串(请参阅 Web 服务器插件的常规参数)。

  6. (可选)对 t3 或 IIOP 启用 HTTP 隧道。
    1. 要在使用 t3 协议和 weblogic.jar 时启用 HTTP 隧道,请将以下 Location 块添加到 httpd.conf 文件中:
      <Location /HTTPClnt>
      SetHandler weblogic-handler
      </Location>
    2. 要在使用 IIOP(WebLogic Server 瘦客户端 wlclient.jar使用的唯一协议)时启用 HTTP 隧道,请将以下 Location 块添加到 httpd.conf 文件中:
      <Location /iiop>
      SetHandler weblogic-handler
      </Location>
  7. 为 Apache HTTP Server 插件定义任何其他参数。

    Apache HTTP Server 插件可识别 Web 服务器插件的常规参数中列出的参数要修改 Apache HTTP Server 插件的行为,请在以下块中定义这些参数:

    • Location 块中,定义适用于按路径进行的代理的参数
    • IfModule 块中,定义适用于按 MIME 类型进行的代理的参数

将 weblogic.conf 文件包括在 httpd.conf 文件中

如果希望保留几个单独的配置文件,则可通过在 httpd.conf文件的 IfModule 块中使用 Apache Include 指令,在名为 weblogic.conf 文件的单独配置文件中定义参数:

<IfModule mod_weblogic.c>
# Config file for WebLogic Server that defines the parameters
Include conf/weblogic.conf
</IfModule>

weblogic.conf 文件的语法与 httpd.conf 文件的语法相同。

本部分描述如何创建 weblogic.conf 文件,并包括示例 weblogic.conf 文件。

创建 weblogic.conf 文件

构造 weblogic.conf 文件时,请注意下列事项:

  • 如果要在 Apache HTTP Server 插件和 WebLogic Server 之间使用 SSL,则无法在通过 Apache Include 指令访问的文件(与 weblogic.conf文件一样)中定义参数。
  • 在新行上输入每一个参数。请不要在参数和参数值之间放置“=”。例如:
    PARAM_1 value1
    PARAM_2 value2
    PARAM_3 value3
  • 如果请求既与 IfModule 块中的 MatchExpression 中指定的 MIME 类型匹配,又与 Location 块中指定的路径匹配,则 Location 块指定的行为优先。
  • 如果要定义 CookieName 参数,则必须在 IfModule 块中定义它。
  • 如果使用 Apache HTTP Server <VirtualHost> 块,则必须在 <VirtualHost> 块中包括虚拟主机的所有配置参数(例如 MatchExpression)(请参阅 Apache Virtual Host documentation)。
  • 如果希望只为环境中的所有虚拟主机配置一个日志文件,则可以使用全局属性来实现。可以在 <IfModule> 标记中一次指定 Debug、WLLogFile 和 WLTempDir 属性,而不是在每个虚拟主机中指定相同的 Debug、WLLogFile 和 WLTempDir 属性。
  • 示例 httpd.conf 文件:
    <IfModule mod_weblogic.c>
      WebLogicCluster	agarwalp02:8005,agarwalp02:8006
      Debug 		ON
      WLLogFile             c:/tmp/global_proxy.log 
      WLTempDir             "c:/myTemp"
      DebugConfigInfo       On
      KeepAliveEnabled ON
      KeepAliveSecs  15
    </IfModule>
    <Location /jurl>
      SetHandler weblogic-handler
      WebLogicCluster agarwalp01:7001
    </Location>
    <Location /web>
      SetHandler weblogic-handler
      PathTrim		/web
      Debug 		OFF
      WLLogFile 		c:/tmp/web_log.log
    </Location>
    <Location /foo>
      SetHandler weblogic-handler
      PathTrim		/foo
      Debug 		ERR
      WLLogFile 		c:/tmp/foo_proxy.log
    </Location>
  • 与 /jurl/* 匹配的所有请求的“调试级别”都将设置为“ALL”,并会将日志消息记录到 c:/tmp/global_proxy.log 文件中。与 /web/* 匹配的所有请求的“调试级别”都将设置为“OFF”,并且不会记录任何日志消息。与 /foo/* 匹配的所有请求的“调试级别”都将设置为“ERR”,并会将日志消息记录到 c:/tmp/foo_proxy.log 文件中。
  • BEA 建议使用 MatchExpression 语句,而不使用 <files> 块。

示例 weblogic.conf 配置文件

以下示例 weblogic.conf 文件可以用作模板,您可以对其进行修改以满足您的环境和服务器的需要。以 # 开始的行是注释。

使用 WebLogic 群集的示例
# 这些参数对于定向到当前模块 
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。(WebLogicHost、
# WebLogicPort、 WebLogicCluster 和 CookieName 除外。)
<IfModule mod_weblogic.c>
  WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
  ErrorPage http://myerrorpage.mydomain.com
  MatchExpression *.jsp
</IfModule>
####################################################
使用多 WebLogic 群集的示例

在此示例中,用于表示文件名模式的 MatchExpression 参数语法、HTTP 请求应转发到的 WebLogic Server 主机以及各种其他参数如下所示:

MatchExpression [filename pattern] [WebLogicHost=host] | [paramName=value]

下面的第一个 MatchExpression 参数指定文件名模式 *.jsp,然后命名单个 WebLogicHost。管道符号后的 paramName=value 组合指定 WebLogic Server 用于监听连接请求的端口,同时激活“Debug”选项。第二个 MatchExpression 指定文件名模式 *.http 并标识 WebLogicCluster 主机及其端口。管道符号后的 paramName=value 组合指定群集的错误页。

# 这些参数对于定向到当前模块 
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。
#(WebLogicHost、WebLogicPort、WebLogicCluster 和 CookieName 除外)
<IfModule mod_weblogic.c>
  MatchExpression *.jsp WebLogicHost=myHost|WebLogicPort=7001|Debug=ON
  MatchExpression *.html WebLogicCluster=myHost1:7282,myHost2:7283|ErrorPage=
    http://www.xyz.com/error.html
</IfModule>
不使用 WebLogic 群集的示例
# 这些参数对于定向到当前模块 
# 的 URL 是常用的。如果要替换每个 URL 的这些参数,
# 可以在 <Location> 或 <Files> 模块中重新设置
# 它们。
#(WebLogicHost、WebLogicPort、WebLogicCluster 和 CookieName 除外)
<IfModule mod_weblogic.c>
  WebLogicHost myweblogic.server.com
  WebLogicPort 7001
  MatchExpression *.jsp
</IfModule>
配置多个基于名称的虚拟主机的示例
# VirtualHost1 = localhost:80
<VirtualHost 127.0.0.1:80>
DocumentRoot "C:/test/VirtualHost1"
ServerName localhost:80 <IfModule mod_weblogic.c>
#... WLS 参数 ...
WebLogicCluster localhost:7101,localhost:7201
# 示例:MatchExpression *.jsp <some additional parameter>
MatchExpression *.jsp PathPrepend=/test2
</IfModule>
</VirtualHost>
# VirtualHost2 = 127.0.0.2:80
<VirtualHost 127.0.0.2:80>
DocumentRoot "C:/test/VirtualHost1"
ServerName 127.0.0.2:80
<IfModule mod_weblogic.c>
#... WLS 参数 ...
WebLogicCluster localhost:7101,localhost:7201
# 示例:MatchExpression *.jsp <some additional parameter>
MatchExpression *.jsp PathPrepend=/test2
#... WLS 参数 ...
</IfModule>
</VirtualHost> <IfModule mod_weblogic.c>

必须为“ServerName”定义唯一值,否则某些插件参数将不能按预期工作。

Apache HTTP Server httpd.conf 文件的模板

本部分包含 Apache 2.0 的示例 httpd.conf 文件。您可将此示例用作模板,并对其进行修改以满足您的环境和服务器的需要。以 # 开始的行是注释。

请注意,Apache HTTP Server 不区分大小写。

####################################################
APACHE-HOME/conf/httpd.conf file
####################################################
LoadModule weblogic_module   libexec/mod_wl_20.so
<Location /weblogic>
SetHandler weblogic-handler
PathTrim /weblogic
ErrorPage http://myerrorpage1.mydomain.com
</Location>
<Location /servletimages>
SetHandler weblogic-handler
PathTrim /something
ErrorPage http://myerrorpage1.mydomain.com
</Location>
<IfModule mod_weblogic.c>
  MatchExpression *.jsp
  WebLogicCluster w1s1.com:7001,w1s2.com:7001,w1s3.com:7001
  ErrorPage http://myerrorpage.mydomain.com
</IfModule>

 


设置边界身份验证

使用边界身份验证可确保通过 Apache 插件访问的 WebLogic Server 应用程序的安全。

WebLogic 标识声明提供程序对来自访问 WebLogic Server 应用程序的外部系统的标记进行身份验证,包括对通过 Apache HTTP Server 插件访问 WebLogic Server 应用程序的用户进行身份验证。按照下列步骤,创建确保插件安全的标识声明提供程序:

  1. 在 WebLogic Server 应用程序上创建一个自定义标识声明提供程序。请参阅“开发 WebLogic Server 的安全提供程序”中的如何开发自定义标识声明提供程序
  2. 配置自定义标识声明提供程序以支持证书标记类型并使证书成为活动标记类型。请参阅“开发 WebLogic Server 的安全提供程序”中的如何创建新标记类型
  3. 在 Web 应用程序的 web.xml 部署描述符文件中将 clientCertProxy 设置为 True(如果使用群集,也可以选择在管理控制台中,依次选择“群集”-->“配置”-->“常规”选项卡,在该选项卡上对整个群集将 Client Cert Proxy Enabled 特性设置为 True)。clientCertProxy 特性可与第三方代理服务器(如负载平衡器或 SSL 加速器)一起使用以启用 2 向 SSL 身份验证。有关 clientCertProxy 特性的详细信息,请参阅“开发 WebLogic Server 的 Web 应用程序、Servlet 和 JSP”中的 context-param
  4. 设置了 clientCertProxy之后,请务必使用连接筛选器来确保 WebLogic Server 仅接受来自运行 Apache 插件的计算机的连接。请参阅“WebLogic 安全性编程”中的使用网络连接筛选器
  5. Web 服务器插件需要可信证书颁发机构文件才能在插件和 WebLogic Server 之间使用 SSL。使用 Sun Microsystems 的 Keytool 实用工具可从驻留在 BEA_HOME/weblogic92/server/lib 中的 DemoTrust.jks 密钥库文件中导出可信证书颁发机构文件。
    1. 例如,要解压缩 wlsdemoca 文件,可使用如下命令:
      keytool -export -file trustedcafile.der -keystore DemoTrust.jks -alias wlsdemoca

      更改别名以从密钥库中获得不同的可信 CA 文件。

      要查看密钥库中的所有可信 CA 文件,请使用如下命令:
      keytool -list -keystore DemoTrust.jks

      如果提示输入密码,请按 Enter 键。

    2. 要将证书颁发机构文件转换为 pem 格式,请使用如下命令:java utils.der2pem trustedcafile.der

请参阅“开发 WebLogic Server 的安全提供程序”中的标识声明提供程序

 


将 SSL 与 Apache 插件一起使用

可以使用安全套接口层(Secure Socket Layer,简称 SSL)协议保护 Apache HTTP Server 插件和 WebLogic Server 之间的连接。SSL 协议对 Apache HTTP Server 插件和 WebLogic Server 之间传递的数据提供机密性和完整性。

Apache HTTP Server 插件不使用 HTTP 请求中(通常由浏览器)指定的传输协议(httphttps)来确定是否使用 SSL 协议来保护 Apache HTTP Server 插件和 WebLogic Server 之间的连接。

虽然可以在 HTTP 客户端和 Apache HTTP Server 之间使用双向 SSL,但请注意,在 Apache HTTP Server 和 WebLogic Server 之间使用的是单向 SSL。

配置 Apache HTTP Server 插件和 WebLogic Server 之间的 SSL

要在 Apache HTTP Server 插件和 WebLogic Server 之间使用 SSL 协议,请执行下列操作:

  1. 针对 SSL 配置 WebLogic Server。有关详细信息,请参阅配置 SSL
  2. 配置 WebLogic Server SSL 监听端口。有关详细信息,请参阅配置 SSL
  3. 在 Apache Server 中,将 httpd.conf 文件中的 WebLogicPort 参数设置为步骤 2 中配置的 WebLogic Server SSL 监听端口。
  4. 在 Apache Server 中,将 httpd.conf 文件中的 SecureProxy 参数设置为 ON
  5. httpd.conf 文件中设置可定义有关 SSL 连接的信息的任何其他参数。有关可以为插件配置的 SSL 参数的完整列表,请参阅 Web 服务器插件的 SSL 参数

SSL-Apache 配置的相关问题

配置 Apache 插件以使用 SSL 时会出现以下已知问题:

  • 要准备插件配置,请双击锁以进入证书路径:

    * 选择根 CA(在顶部)

    * 显示它

    * 查看详细信息,然后使用编码的“基本

    64 X509”选项将此证书复制到文件中

    * 例如,将文件保存到 MyWeblogicCAToTrust.cer(此文件也是

    PEM 文件)

  • 参数 PathTrim(请参见 Web 服务器插件的常规参数)必须在 <Location> 标记内配置。

    以下配置不正确

    <Location /weblogic>
    SetHandler weblogic-handler
    </Location>
    <IfModule mod_weblogic.c>
    WebLogicHost localhost
    WebLogicPort 7001
    PathTrim /weblogic
    </IfModule>

    以下配置是正确设置:

    <Location /weblogic>
    SetHandler weblogic-handler
    PathTrim /weblogic
    </Location>
  • Include 指令不能与 Apache SSL 一起使用。必须在 httpd.conf 文件中直接配置所有参数。使用 SSL 时请不要使用以下配置:
    <IfModule mod_weblogic.c>
    MatchExpression *.jsp
    Include weblogic.conf
    </IfModule>
  • WebLogic Server Apache 插件的当前实现不支持对 Apache SSL 使用多个证书文件。

 


连接错误和群集故障转移

当 Apache HTTP Server 插件尝试连接到 WebLogic Server 时,插件使用几个配置参数确定等待连接到 WebLogic Server 主机的时间长度,以及建立连接后插件等待响应的时间长度。如果插件无法连接或未收到响应,则插件将尝试连接到群集中的其他 WebLogic Server 实例并向其发送请求。如果连接失败或者没有来自群集中任何 WebLogic Server 的响应,则会发送错误消息。

图 3-1 说明插件如何处理故障转移。

连接失败的可能原因

WebLogic Server 主机无法响应连接请求可能表明下列问题:

  • 主机计算机的物理问题
  • 网络问题
  • 其他服务器故障

所有 WebLogic Server 实例都无法响应可能表明下列问题:

  • WebLogic Server 未运行或不可用
  • 服务器挂起
  • 数据库问题
  • 应用程序特定故障

调整以减少 Connection_Refused 错误

在有负载时,Apache 插件可能收到来自后端 WebLogic Server 实例的 CONNECTION_REFUSED 错误。可根据以下调整提示减少 CONNECTION_REFUSED 错误:

  • 提高WebLogic Server 域配置中的 AcceptBackLog 设置。
  • 在 Apache 2.0.x 上,将 httpd.conf 文件中的 KeepAlive 指令设置为 On。例如:
    # KeepAlive: Whether or not to allow persistent connections (more than
    # one request per connection). Set to "Off" to deactivate.
    #
    KeepAlive On

    请参阅位于 http://httpd.apache.org/docs-project/ 的 Apache HTTP Server 2.0 文档。

  • 减少等待时间间隔。此设置因使用的操作系统而异。例如:
    • 在 Windows NT 上,将代理和 WebLogic Server 服务器上的 TcpTimedWaitDelay 设置为较低的值。通过编辑 HKEY_LOCAL_MACHINE 下的注册表项来设置 Windows NT 中的 TIME_WAIT 时间间隔。
      SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay 

      如果此项不存在,则可以将其作为 DWORD 值创建。数字值是要等待的秒数,可将其设置为介于 30 和 240 之间的任意值。如果未设置,默认情况下 Windows NT 会将 TIME_WAIT 设置为 240 秒。

    • 在 Windows 2000 上,通过编辑 HKEY_LOCAL_MACHINE 下的注册表项降低 TcpTimedWaitDelay的值:
      SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 
    • 在 Solaris 上,将设置 tcp_time_wait_interval 降低为一秒(如果可能,对 WebLogic Server 计算机和 Apache 计算机都进行此设置):
      $ndd /dev/tcp
         param name to set - tcp_time_wait_interval
         value=1000
  • 在您的计算机上提高打开文件描述符的限制。此限制因操作系统而异。使用 limit (.csh) 或 ulimit (.sh) 指令,可以制作一个脚本来提高此限制。例如:
    #!/bin/sh
    ulimit -S -n 100
    exec httpd 
  • 在 Solaris 上,提高 WebLogic Server 计算机上下列可调参数的值:
    • tcp_conn_req_max_q
    • tcp_conn_req_max_q0

单个非群集 WebLogic Server 的故障转移

如果仅运行一个 WebLogic Server 实例,则插件仅尝试连接到使用 WebLogicHost 参数定义的服务器。如果尝试失败,则会返回 HTTP 503 错误消息。插件继续尝试连接到该同一 WebLogic Server 实例,直到超出 ConnectTimeoutSecs。

动态服务器列表

使用 httpd.confweblogic.conf 文件中的 WebLogicCluster 参数指定 WebLogic Server 列表时,插件将该列表用作在群集成员之间进行负载平衡的起点。将第一个请求路由到这些服务器之一后,会返回一个动态服务器列表,其中包含群集中已更新的服务器列表。更新的列表添加群集中的任何新服务器并删除不再属于群集或无法响应请求的任何服务器。当群集中发生更改时,会使用 HTTP 响应自动更新此列表。

故障转移、Cookie 和 HTTP 会话

当请求包含存储在 Cookie 或 POST 数据中的会话信息或包含编码到 URL 中的会话信息时,会话 ID 会包含对最初建立会话的特定服务器实例(称为主服务器)的引用,并包含对复制原始会话的其他服务器(称为次级服务器)的引用。包含 Cookie 的请求会尝试连接到主服务器。如果该尝试失败,则会将该请求路由到次级服务器。如果主服务器和次级服务器均故障,则会话将丢失,插件将尝试与动态群集列表中的其他服务器建立新的连接。请参阅图 3-1 连接故障转移

注意: 如果 POST 数据大于 64K,插件将不会对 POST 数据进行解析以获取会话 ID。因此,如果您将会话 ID 存储在 POST 数据中,插件无法将请求路由到正确的主服务器或次级服务器,从而可能导致会话数据的丢失。
图 3-1 连接故障转移

连接故障转移

在上图中,红圈中允许的最大重试次数等于 ConnectTimeoutSecs 除以 ConnectRetrySecs


安装和配置 Apache HTTP Server 插件

posted @ 2007-11-13 13:08 不需要解释 阅读(2896) | 评论 (0)编辑 收藏

在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

  这段时间在做IP统计的程序设计,由于服务器作了集群,使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.xxx.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。这是什么原因呢?

  这是反向代理的原因。经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.xxx.com/index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

  于是可得出获得客户端真实IP地址的方法一:

1 public String getIpAddr(HttpServletRequest request) {
2      String ip = request.getHeader("x-forwarded-for");
3      if(ip == null || ip.length() == 0{
4            ip = request.getRemoteAddr();
5        }

6        return ip;
7    }

  可是当我访问http://www.xxx.com/index.jsp/时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp时,则能返回客户端的真实IP地址,写了个方法去验证。

  
 1<%@ page import="java.util.*" %>
 2<table border=1 cellspacing=0 cellpadding=0 align=center> 
 3<tr> 
 4<th>Name</th> 
 5<th>Value</th> 
 6</tr> 
 7<% 
 8Enumeration enumNames; 
 9String strName,strValue; 
10
11enumNames = request.getHeaderNames(); 
12while(enumNames.hasMoreElements()){ 
13    strName = (String)enumNames.nextElement(); 
14    strValue = request.getHeader(strName); 
15    
%> 
16    <tr> 
17    <td><%=strName%></td> 
18    <td><%=strValue%></td> 
19    </tr> 
20    <% 
21
22
%>
23<tr>
24</table>
25


  出来的结果:X-Forwarded-For: unknown 。X-Forwarded-For确实存在,但其值却为unknown,继续找原因。上网搜了搜,原因出在了Squid上。

squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:

X-Forwarded-For: unknown

一查,发现forwarded_for 项设为了off,原因找到了,把forwarded_for 项设为了on,重启后,访问http://www.xxx.com/index.jsp/ 获得的IP是客户端的真实IP。

  于是可得出获得客户端真实IP地址的方法二:

 1    public String getIpAddr(HttpServletRequest request) {
 2        String ip = request.getHeader("x-forwarded-for");
 3        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 4            ip = request.getHeader("Proxy-Client-IP");
 5        }

 6        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
 7            ip = request.getHeader("WL-Proxy-Client-IP");
 8        }

 9        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
10            ip = request.getRemoteAddr();
11        }

12        return ip;
13    }

14



  可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

  答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

  如:
  X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
  用户真实IP为: 192.168.1.110

posted @ 2007-11-13 12:52 不需要解释 阅读(533) | 评论 (0)编辑 收藏

High Performance Web Sites: The Importance of Front-End Performance

In 2004, I started the Exceptional Performance group at Yahoo!. We're a small team chartered to measure and improve the performance of Yahoo!'s products. Having worked as a back-end engineer most of my career, I approached this as I would a code optimization project - I profiled web performance to identify where there was the greatest opportunity for improvement. Since our goal is to improve the end-user experience, I measured response times in a browser over various bandwidth speeds. What I saw is illustrated in the following chart showing HTTP traffic for http://www.yahoo.com.

In the figure above, the first bar, labeled "html", is the initial request for the HTML document. In this case, only 5% of the end-user response time is spent fetching the HTML document. This result holds true for almost all web sites. In sampling the top ten U.S. websites, all but one spend less than 20% of the total response time getting the HTML document. The other 80+% of the time is spent dealing with what's in the HTML document, namely, the front-end. That's why the key to faster web sites is to focus on improving front-end performance.

There are three main reasons why front-end performance is the place to start.

  1. There is more potential for improvement by focusing on the front-end. Cutting it in half reduces response times by 40% or more, whereas cutting back-end performance in half results in less than a 10% reduction.
  2. Front-end improvements typically require less time and resources than back-end projects (redesigning application architecture and code, finding and optimizing critical code paths, adding or modifying hardware, distributing databases, etc.).
  3. Front-end performance tuning has been proven to work. Over fifty teams at Yahoo! have reduced their end-user response times by following our performance best practices, often by 25% or more.

Our performance golden rule is: optimize front-end performance first, that's where 80% or more of the end-user response time is spent.

Discuss the Importance of Front-End Performance

1: Minimize HTTP Requests

80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of HTTP requests required to render the page. This is the key to faster pages.

One way to reduce the number of components in the page is to simplify the page's design. But is there a way to build pages with richer content while also achieving fast response times? Here are some techniques for reducing the number of HTTP requests, while still supporting rich page designs.

Image maps combine multiple images into a single image. The overall size is about the same, but reducing the number of HTTP requests speeds up the page. Image maps only work if the images are contiguous in the page, such as a navigation bar. Defining the coordinates of image maps can be tedious and error prone.

CSS Sprites are the preferred method for reducing the number of image requests. Combine all the images in your page into a single image and use the CSS background-image and background-position properties to display the desired image segment.

Inline images use the data: URL scheme to embed the image data in the actual page. This can increase the size of your HTML document. Combining inline images into your (cached) stylesheets is a way to reduce HTTP requests and avoid increasing the size of your pages.

Combined files are a way to reduce the number of HTTP requests by combining all scripts into a single script, and similarly combining all stylesheets into a single stylesheet. It's a simple idea that hasn't seen wide adoption. The ten top U.S. web sites average 7 scripts and 2 stylesheets per page. Combining files is more challenging when the scripts and stylesheets vary from page to page, but making this part of your release process improves response times.

Reducing the number of HTTP requests in your page is the place to start. This is the most important guideline for improving performance for first time visitors. As described in Tenni Theurer's blog Browser Cache Usage - Exposed!, 40-60% of daily visitors to your site come in with an empty cache. Making your page fast for these first time visitors is key to a better user experience.

Discuss Rule 1

2: Use a Content Delivery Network

The user's proximity to your web server has an impact on response times. Deploying your content across multiple, geographically dispersed servers will make your pages load faster from the user's perspective. But where should you start?

As a first step to implementing geographically dispersed content, don't attempt to redesign your web application to work in a distributed architecture. Depending on the application, changing the architecture could include daunting tasks such as synchronizing session state and replicating database transactions across server locations. Attempts to reduce the distance between users and your content could be delayed by, or never pass, this application architecture step.

Remember that 80-90% of the end-user response time is spent downloading all the components in the page: images, stylesheets, scripts, Flash, etc. This is the Performance Golden Rule, as explained in The Importance of Front-End Performance. Rather than starting with the difficult task of redesigning your application architecture, it's better to first disperse your static content. This not only achieves a bigger reduction in response times, but it's easier thanks to content delivery networks.

A content delivery network (CDN) is a collection of web servers distributed across multiple locations to deliver content more efficiently to users. The server selected for delivering content to a specific user is typically based on a measure of network proximity. For example, the server with the fewest network hops or the server with the quickest response time is chosen.

Some large Internet companies own their own CDN, but it's cost-effective to use a CDN service provider, such as Akamai Technologies, Mirror Image Internet, or Limelight Networks. For start-up companies and private web sites, the cost of a CDN service can be prohibitive, but as your target audience grows larger and becomes more global, a CDN is necessary to achieve fast response times. At Yahoo!, properties that moved static content off their application web servers to a CDN improved end-user response times by 20% or more. Switching to a CDN is a relatively easy code change that will dramatically improve the speed of your web site.

Discuss Rule 2

3: Add an Expires Header

Web page designs are getting richer and richer, which means more scripts, stylesheets, images, and Flash in the page. A first-time visitor to your page may have to make several HTTP requests, but by using the Expires header you make those components cacheable. This avoids unnecessary HTTP requests on subsequent page views. Expires headers are most often used with images, but they should be used on all components including scripts, stylesheets, and Flash components.

Browsers (and proxies) use a cache to reduce the number and size of HTTP requests, making web pages load faster. A web server uses the Expires header in the HTTP response to tell the client how long a component can be cached. This is a far future Expires header, telling the browser that this response won't be stale until April 15, 2010.

      Expires: Thu, 15 Apr 2010 20:00:00 GMT

 

If your server is Apache, use the ExiresDefault directive to set an expiration date relative to the current date. This example of the ExpiresDefault directive sets the Expires date 10 years out from the time of the request.

      ExpiresDefault "access plus 10 years"

 

Keep in mind, if you use a far future Expires header you have to change the component's filename whenever the component changes. At Yahoo! we often make this step part of the build process: a version number is embedded in the component's filename, for example, yahoo_2.0.6.js.

Using a far future Expires header affects page views only after a user has already visited your site. It has no effect on the number of HTTP requests when a user visits your site for the first time and the browser's cache is empty. The impact of this performance improvement depends, therefore, on how often users hit your pages with a primed cache. (A "primed cache" already contains all of the components in the page.) We measured this at Yahoo! and found the number of page views with a primed cache is 75-85%. By using a far future Expires header, you increase the number of components that are cached by the browser and re-used on subsequent page views without sending a single byte over the user's Internet connection.

Discuss Rule 3

4: Gzip Components

The time it takes to transfer an HTTP request and response across the network can be significantly reduced by decisions made by front-end engineers. It's true that the end-user's bandwidth speed, Internet service provider, proximity to peering exchange points, etc. are beyond the control of the development team. But there are other variables that affect response times. Compression reduces response times by reducing the size of the HTTP response.

Starting with HTTP/1.1, web clients indicate support for compression with the Accept-Encoding header in the HTTP request.

      Accept-Encoding: gzip, deflate

If the web server sees this header in the request, it may compress the response using one of the methods listed by the client. The web server notifies the web client of this via the Content-Encoding header in the response.

      Content-Encoding: gzip

Gzip is the most popular and effective compression method at this time. It was developed by the GNU project and standardized by RFC 1952. The only other compression format you're likely to see is deflate, but it's less effective and less popular.

Gzipping generally reduces the response size by about 70%. Approximately 90% of today's Internet traffic travels through browsers that claim to support gzip. If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.

There are known issues with browsers and proxies that may cause a mismatch in what the browser expects and what it receives with regard to compressed content. Fortunately, these edge cases are dwindling as the use of older browsers drops off. The Apache modules help out by adding appropriate Vary response headers automatically.

Servers choose what to gzip based on file type, but are typically too limited in what they decide to compress. Most web sites gzip their HTML documents. It's also worthwhile to gzip your scripts and stylesheets, but many web sites miss this opportunity. In fact, it's worthwhile to compress any text response including XML and JSON. Image and PDF files should not be gzipped because they are already compressed. Trying to gzip them not only wastes CPU but can potentially increase file sizes.

Gzipping as many file types as possible is an easy way to reduce page weight and accelerate the user experience.

Discuss Rule 4

5: Put Stylesheets at the Top

While researching performance at Yahoo!, we discovered that moving stylesheets to the document HEAD makes pages load faster. This is because putting stylesheets in the HEAD allows the page to render progressively.

Front-end engineers that care about performance want a page to load progressively; that is, we want the browser to display whatever content it has as soon as possible. This is especially important for pages with a lot of content and for users on slower Internet connections. The importance of giving users visual feedback, such as progress indicators, has been well researched and documented. In our case the HTML page is the progress indicator! When the browser loads the page progressively the header, the navigation bar, the logo at the top, etc. all serve as visual feedback for the user who is waiting for the page. This improves the overall user experience.

The problem with putting stylesheets near the bottom of the document is that it prohibits progressive rendering in many browsers, including Internet Explorer. Browsers block rendering to avoid having to redraw elements of the page if their styles change. The user is stuck viewing a blank white page. Firefox doesn't block rendering, which means when the stylesheet is done loading it's possible elements in the page will have to be redrawn, resulting in the flash of unstyled content problem.

The HTML specification clearly states that stylesheets are to be included in the HEAD of the page: "Unlike A, [LINK] may only appear in the HEAD section of a document, although it may appear any number of times." Neither of the alternatives, the blank white screen or flash of unstyled content, are worth the risk. The optimal solution is to follow the HTML specification and load your stylesheets in the document HEAD.

Discuss Rule 5

6: Put Scripts at the Bottom

Rule 5 described how stylesheets near the bottom of the page prohibit progressive rendering, and how moving them to the document HEAD eliminates the problem. Scripts (external JavaScript files) pose a similar problem, but the solution is just the opposite: it's better to move scripts from the top to as low in the page as possible. One reason is to enable progressive rendering, but another is to achieve greater download parallelization.

With stylesheets, progressive rendering is blocked until all stylesheets have been downloaded. That's why it's best to move stylesheets to the document HEAD, so they get downloaded first and rendering isn't blocked. With scripts, progressive rendering is blocked for all content below the script. Moving scripts as low in the page as possible means there's more content above the script that is rendered sooner.

The second problem caused by scripts is blocking parallel downloads. The HTTP/1.1 specification suggests that browsers download no more than two components in parallel per hostname. If you serve your images from multiple hostnames, you can get more than two downloads to occur in parallel. (I've gotten Internet Explorer to download over 100 images in parallel.) While a script is downloading, however, the browser won't start any other downloads, even on different hostnames.

In some situations it's not easy to move scripts to the bottom. If, for example, the script uses document.write to insert part of the page's content, it can't be moved lower in the page. There might also be scoping issues. In many cases, there are ways to workaround these situations.

An alternative suggestion that often comes up is to use deferred scripts. The DEFER attribute indicates that the script does not contain document.write, and is a clue to browsers that they can continue rendering. Unfortunately, Firefox doesn't support the DEFER attribute. In Internet Explorer, the script may be deferred, but not as much as desired. If a script can be deferred, it can also be moved to the bottom of the page. That will make your web pages load faster.

Discuss Rule 6

7: Avoid CSS Expressions

CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They're supported in Internet Explorer, starting with version 5. As an example, the background color could be set to alternate every hour using CSS expressions.

      background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

 

As shown here, the expression method accepts a JavaScript expression. The CSS property is set to the result of evaluating the JavaScript expression. The expression method is ignored by other browsers, so it is useful for setting properties in Internet Explorer needed to create a consistent experience across browsers.

The problem with expressions is that they are evaluated more frequently than most people expect. Not only are they evaluated when the page is rendered and resized, but also when the page is scrolled and even when the user moves the mouse over the page. Adding a counter to the CSS expression allows us to keep track of when and how often a CSS expression is evaluated. Moving the mouse around the page can easily generate more than 10,000 evaluations.

One way to reduce the number of times your CSS expression is evaluated is to use one-time expressions, where the first time the expression is evaluated it sets the style property to an explicit value, which replaces the CSS expression. If the style property must be set dynamically throughout the life of the page, using event handlers instead of CSS expressions is an alternative approach. If you must use CSS expressions, remember that they may be evaluated thousands of times and could affect the performance of your page.

Discuss Rule 7

8: Make JavaScript and CSS External

Many of these performance rules deal with how external components are managed. However, before these considerations arise you should ask a more basic question: Should JavaScript and CSS be contained in external files, or inlined in the page itself?

Using external files in the real world generally produces faster pages because the JavaScript and CSS files are cached by the browser. JavaScript and CSS that are inlined in HTML documents get downloaded every time the HTML document is requested. This reduces the number of HTTP requests that are needed, but increases the size of the HTML document. On the other hand, if the JavaScript and CSS are in external files cached by the browser, the size of the HTML document is reduced without increasing the number of HTTP requests.

The key factor, then, is the frequency with which external JavaScript and CSS components are cached relative to the number of HTML documents requested. This factor, although difficult to quantify, can be gauged using various metrics. If users on your site have multiple page views per session and many of your pages re-use the same scripts and stylesheets, there is a greater potential benefit from cached external files.

Many web sites fall in the middle of these metrics. For these properties, the best solution generally is to deploy the JavaScript and CSS as external files. The only exception I've seen where inlining is preferable is with home pages, such as Yahoo!'s front page (http://www.yahoo.com) and My Yahoo! (http://my.yahoo.com). Home pages that have few (perhaps only one) page view per session may find that inlining JavaScript and CSS results in faster end-user response times.

For front pages that are typically the first of many page views, there are techniques that leverage the reduction of HTTP requests that inlining provides, as well as the caching benefits achieved through using external files. One such technique is to inline JavaScript and CSS in the front page, but dynamically download the external files after the page has finished loading. Subsequent pages would reference the external files that should already be in the browser's cache.

Discuss Rule 8

9: Reduce DNS Lookups

The Domain Name System (DNS) maps hostnames to IP addresses, just as phonebooks map people's names to their phone numbers. When you type www.yahoo.com into your browser, a DNS resolver contacted by the browser returns that server's IP address. DNS has a cost. It typically takes 20-120 milliseconds for DNS to lookup the IP address for a given hostname. The browser can't download anything from this hostname until the DNS lookup is completed.

DNS lookups are cached for better performance. This caching can occur on a special caching server, maintained by the user's ISP or local area network, but there is also caching that occurs on the individual user's computer. The DNS information remains in the operating system's DNS cache (the "DNS Client service" on Microsoft Windows). Most browsers have their own caches, separate from the operating system's cache. As long as the browser keeps a DNS record in its own cache, it doesn't bother the operating system with a request for the record.

Internet Explorer caches DNS lookups for 30 minutes by default, as specified by the DnsCacheTimeout registry setting. Firefox caches DNS lookups for 1 minute, controlled by the network.dnsCacheExpiration configuration setting. (Fasterfox changes this to 1 hour.)

When the client's DNS cache is empty (for both the browser and the operating system), the number of DNS lookups is equal to the number of unique hostnames in the web page. This includes the hostnames used in the page's URL, images, script files, stylesheets, Flash objects, etc. Reducing the number of unique hostnames reduces the number of DNS lookups.

Reducing the number of unique hostnames has the potential to reduce the amount of parallel downloading that takes place in the page. Avoiding DNS lookups cuts response times, but reducing parallel downloads may increase response times. My guideline is to split these components across at least two but no more than four hostnames. This results in a good compromise between reducing DNS lookups and allowing a high degree of parallel downloads.

Discuss Rule 9

10: Minify JavaScript

Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are JSMin and YUI Compressor.

Obfuscation is an alternative optimization that can be applied to source code. Like minification, it removes comments and white space, but it also munges the code. As part of munging, function and variable names are converted into smaller strings making the code more compact as well as harder to read. This is typically done to make it more difficult to reverse engineer the code. But munging can help performance because it reduces the code size beyond what is achieved by minification. The tool-of-choice is less clear in the area of JavaScript obfuscation. Dojo Compressor (ShrinkSafe) is the one I've seen used the most.

Minification is a safe, fairly straightforward process. Obfuscation, on the other hand, is more complex and thus more likely to generate bugs as a result of the obfuscation step itself. Obfuscation also requires modifying your code to indicate API functions and other symbols that should not be munged. It also makes it harder to debug your code in production. Although I've never seen problems introduced from minification, I have seen bugs caused by obfuscation. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, I recommend minifying JavaScript code because of the reduced risks and maintenance costs.

In addition to minifying external scripts, inlined script blocks can and should also be minified. Even if you gzip your scripts, as described in Rule 4, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript increases, so will the savings gained by minifying your JavaScript code.

Discuss Rule 10

11: Avoid Redirects

Redirects are accomplished using the 301 and 302 status codes. Here's an example of the HTTP headers in a 301 response:

      HTTP/1.1 301 Moved Permanently
Location: http://example.com/newuri
Content-Type: text/html

 

The browser automatically takes the user to the URL specified in the Location field. All the information necessary for a redirect is in the headers. The body of the response is typically empty. Despite their names, neither a 301 nor a 302 response is cached in practice unless additional headers, such as Expires or Cache-Control, indicate it should be. The meta refresh tag and JavaScript are other ways to direct users to a different URL, but if you must do a redirect, the preferred technique is to use the standard 3xx HTTP status codes, primarily to ensure the back button works correctly.

The main thing to remember is that redirects slow down the user experience. Inserting a redirect between the user and the HTML document delays everything in the page since nothing in the page can be rendered and no components can start being downloaded until the HTML document has arrived.

One of the most wasteful redirects happens frequently and web developers are generally not aware of it. It occurs when a trailing slash (/) is missing from a URL that should otherwise have one. For example, going to http://astrology.yahoo.com/astrology results in a 301 response containing a redirect to http://astrology.yahoo.com/astrology/ (notice the added trailing slash). This is fixed in Apache by using Alias or mod_rewrite, or the DirectorySlash directive if you're using Apache handlers.

Connecting an old web site to a new one is another common use for redirects. Others include connecting different parts of a website and directing the user based on certain conditions (type of browser, type of user account, etc.). Using a redirect to connect two web sites is simple and requires little additional coding. Although using redirects in these situations reduces the complexity for developers, it degrades the user experience. Alternatives for this use of redirects include using Alias and mod_rewrite if the two code paths are hosted on the same server. If a domain name change is the cause of using redirects, an alternative is to create a CNAME (a DNS record that creates an alias pointing from one domain name to another) in combination with Alias or mod_rewrite.

Discuss Rule 11

12: Remove Duplicate Scripts

It hurts performance to include the same JavaScript file twice in one page. This isn't as unusual as you might think. A review of the ten top U.S. web sites shows that two of them contain a duplicated script. Two main factors increase the odds of a script being duplicated in a single web page: team size and number of scripts. When it does happen, duplicate scripts hurt performance by creating unnecessary HTTP requests and wasted JavaScript execution.

Unnecessary HTTP requests happen in Internet Explorer, but not in Firefox. In Internet Explorer, if an external script is included twice and is not cacheable, it generates two HTTP requests during page loading. Even if the script is cacheable, extra HTTP requests occur when the user reloads the page.

In addition to generating wasteful HTTP requests, time is wasted evaluating the script multiple times. This redundant JavaScript execution happens in both Firefox and Internet Explorer, regardless of whether the script is cacheable.

One way to avoid accidentally including the same script twice is to implement a script management module in your templating system. The typical way to include a script is to use the SCRIPT tag in your HTML page.

      script type="text/javascript" src="menu_1.0.17.js"></script>

An alternative in PHP would be to create a function called insertScript.

      <?php insertScript("menu.js") ?>

In addition to preventing the same script from being inserted multiple times, this function could handle other issues with scripts, such as dependency checking and adding version numbers to script filenames to support far future Expires headers.

Discuss Rule 12

13: Configure ETags

Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser's cache matches the one on the origin server. (An "entity" is another word for what I've been calling a "component": images, scripts, stylesheets, etc.) ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date. An ETag is a string that uniquely identifies a specific version of a component. The only format constraints are that the string be quoted. The origin server specifies the component's ETag using the ETag response header.

      HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195

 

Later, if the browser has to validate a component, it uses the If-None-Match header to pass the ETag back to the origin server. If the ETags match, a 304 status code is returned reducing the response by 12195 bytes for this example.

      GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified

 

The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won't match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests. By default, both Apache and IIS embed data in the ETag that dramatically reduces the odds of the validity test succeeding on web sites with multiple servers.

The ETag format for Apache 1.3 and 2.x is inode-size-timestamp. Although a given file may reside in the same directory across multiple servers, and have the same file size, permissions, timestamp, etc., its inode is different from one server to the next.

IIS 5.0 and 6.0 have a similar issue with ETags. The format for ETags on IIS is Filetimestamp:ChangeNumber. A ChangeNumber is a counter used to track configuration changes to IIS. It's unlikely that the ChangeNumber is the same across all IIS servers behind a web site.

The end result is ETags generated by Apache and IIS for the exact same component won't match from one server to another. If the ETags don't match, the user doesn't receive the small, fast 304 response that ETags were designed for; instead, they'll get a normal 200 response along with all the data for the component. If you host your web site on just one server, this isn't a problem. But if you have multiple servers hosting your web site, and you're using Apache or IIS with the default ETag configuration, your users are getting slower pages, your servers have a higher load, you're consuming greater bandwidth, and proxies aren't caching your content efficiently. Even if your components have a far future Expires header, a conditional GET request is still made whenever the user hits Reload or Refresh.

If you're not taking advantage of the flexible validation model that ETags provide, it's better to just remove the ETag altogether. The Last-Modified header validates based on the component's timestamp. And removing the ETag reduces the size of the HTTP headers in both the response and subsequent requests. This Microsoft Support article describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:

      FileETag none

Discuss Rule 13

14: Make Ajax Cacheable

People ask whether these performance rules apply to Web 2.0 applications. They definitely do! This rule is the first rule that resulted from working with Web 2.0 applications at Yahoo!.

One of the cited benefits of Ajax is that it provides instantaneous feedback to the user because it requests information asynchronously from the backend web server. However, using Ajax is no guarantee that the user won't be twiddling his thumbs waiting for those asynchronous JavaScript and XML responses to return. In many applications, whether or not the user is kept waiting depends on how Ajax is used. For example, in a web-based email client the user will be kept waiting for the results of an Ajax request to find all the email messages that match their search criteria. It's important to remember that "asynchronous" does not imply "instantaneous".

To improve performance, it's important to optimize these Ajax responses. The most important way to improve the performance of Ajax is to make the responses cacheable, as discussed in Rule 3: Add an Expires Header. Some of the other rules also apply to Ajax:

 

However, Rule 3 is the most important for speeding up the user experience. Let's look at an example. A Web 2.0 email client might use Ajax to download the user's address book for autocompletion. If the user hasn't modified her address book since the last time she used the email web app, the previous address book response could be read from cache if that Ajax response was made cacheable with a future Expires header. The browser must be informed when to use a previously cached address book response versus requesting a new one. This could be done by adding a timestamp to the address book Ajax URL indicating the last time the user modified her address book, for example, &t=1190241612. If the address book hasn't been modified since the last download, the timestamp will be the same and the address book will be read from the browser's cache eliminating an extra HTTP roundtrip. If the user has modified her address book, the timestamp ensures the new URL doesn't match the cached response, and the browser will request the updated address book entries.

Even though your Ajax responses are created dynamically, and might only be applicable to a single user, they can still be cached. Doing so will make your Web 2.0 apps faster.

Discuss Rule 14

posted @ 2007-11-13 12:51 不需要解释 阅读(323) | 评论 (0)编辑 收藏

     摘要:   Jetspeed2.0最终release版本发布于2005年12月, 可以从以下网址下载源代码和捆绑tomcat的压缩文件: http://www.apache.org/dist/portals/jetspeed-2/   。 与Jetspeed1.x比较,Jetspeed2.0 (以下简称J2)的架构发生了很大变化, J1.x使用了Turbine,在J2中T...  阅读全文

posted @ 2007-11-13 11:10 不需要解释 阅读(5259) | 评论 (0)编辑 收藏

通常,软件的漏洞信息和特定版本是相关的,因此,版本号对黑客来说是最有价值的。
默认情况下,系统会把Apache版本模块都显示出来(http返回头)。如果列举目录的话,会显示域名信息(文件列表正文),去除Apache版本号的方法是修改配置文件/etc/httpd.conf。找到关键字ServerSignature,将其设定为:
ServerSignature Off
ServerTokens Prod

然后重新启动Apache服务器。
通过分析Web服务器的类型,大致可以推测出操作系统的类型,比如,Windows使用IIS来提供HTTP服务,而Linux中最常见的是Apache。
默认的Apache配置里没有任何信息保护机制,并且允许目录浏览。通过目录浏览,通常可以获得类似“Apache/1.3.27 Server at apache.linuxforum.net Port 80”或“Apache/2.0.49 (Unix) PHP/4.3.8”的信息。
通过修改配置文件中的ServerTokens参数,可以将Apache的相关信息隐藏起来。但是,Red Hat Linux运行的Apache是编译好的程序,提示信息被编译在程序里,要隐藏这些信息需要修改Apache的源代码,然后,重新编译安装程序,以替换里面的提示内容。
以Apache 2.0.50为例,编辑ap_release.h文件,修改“#define AP_SERVER_BASEPRODUCT \"Apache\"”为“#define AP_SERVER_BASEPRODUCT \"Microsoft-IIS/5.0\"”。编辑os/unix/os.h文件,修改“#define PLATFORM \"Unix\"”为“#define PLATFORM \"Win32\"”。修改完毕后,重新编译、安装Apache。
Apache安装完成后,修改httpd.conf配置文件,将“ServerTokens Full”改为“ServerTokens Prod”;将“ServerSignature On”改为“ServerSignature Off”,然后存盘退出。重新启动Apache后,用工具进行扫描,发现提示信息中已经显示操作系统为Windows。

posted @ 2007-11-13 10:50 不需要解释 阅读(229) | 评论 (0)编辑 收藏

Apache 2.XX中prefork.c模块和worker.c模块的比较

空闲子进程:是指没有正在处理请求的子进程。

1、prefork.c模块(一个非线程型的、预派生的MPM)
    prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。

<IfModule prefork.c>
ServerLimit  20000
StartServers  5
MinSpareServers  5
MaxSpareServers  10
MaxClients  1000
MaxRequestsPerChild 0
</IfModule>

ServerLimit     2000
//默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。
生效前提:必须放在其他指令的前面

StartServers  5
//指定服务器启动时建立的子进程数量,prefork默认为5。

MinSpareServers  5
//指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

MaxSpareServers  10
//设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。

MaxClients  256
//限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit 。

MaxRequestsPerChild 10000
//每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。

将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

工作方式:
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于设置子进程的低特权用户。运行子进程的用户必须要对它所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。


2、worker.c模块(支持混合的多线程多进程的多路处理模块)
    worker MPM 使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。

<IfModule worker.c>
ServerLimit  50
ThreadLimit  200
StartServers  5
MaxClients  5000
MinSpareThreads  25
MaxSpareThreads  500
ThreadsPerChild  100
MaxRequestsPerChild 0
</IfModule>

ServerLimit 16
//服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

ThreadLimit 64
//每个子进程可配置的线程数上限。这个指令设置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是"64".

StartServers 3
//服务器启动时建立的子进程数,默认值是"3"。

MinSpareThreads 75
//最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

MaxSpareThreads 250
//设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于MinSpareThreads加上ThreadsPerChild的和

MaxClients 400
//允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值是"400",16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值。

ThreadsPerChild 25
//每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。

MaxRequestsPerChild  0
//设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。

将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意
对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

工作方式:
每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix中,为了能够绑定80端口,父进程一般都是以root身份启动,随后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于设置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予它较少的特权。另外,除非使用了suexec ,否则,这些指令设置的权限将被CGI脚本所继承。


公式:
ThreadLimit >= ThreadsPerChild
MaxClients  <= ServerLimit * ThreadsPerChild  必须是ThreadsPerChild的倍数
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

硬限制:

ServerLimi和ThreadLimit这两个指令决定了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的)。

Apache在编译ServerLimit时内部有一个硬性的限制,你不能超越这个限制。
prefork MPM最大为"ServerLimit 200000"
其它MPM(包括work MPM)最大为"ServerLimit 20000

Apache在编译ThreadLimit时内部有一个硬性的限制,你不能超越这个限制。
mpm_winnt是"ThreadLimit 15000"
其它MPM(包括work prefork)为"ThreadLimit 20000

注意
使用ServerLimit和ThreadLimit时要特别当心。如果将ServerLimit和ThreadLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。当设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。

posted @ 2007-11-13 10:44 不需要解释 阅读(1580) | 评论 (0)编辑 收藏

我实话告诉你们,我可是身经百战了.bbs我见的多了,哪个版我没灌过?你们要知道, 一塌糊 涂的triangle,PIC,SEX版,那比你们不知道厉害到哪里去了,我在那谈笑风声.你 们有一好就是无论在哪个版,什么话题都灌,但是灌来灌去的问题,都too simple, sometimes naive!你 们懂不懂呀?啊?所以说灌水啊,关键是要提高自己的知识水平.你 们啊,不要总想着弄个大坑,然后灌上十大,再把我羞辱一番……你们啊,naive!你们这 样灌是不行地!~那你問我支持 不支持灌水,我說支持,我常來這裡灌,你說支持不支持?