环境:ubuntu10.04LTS

1、在终端中直接输入  sudo apt-get install subversion,选择安装即可
2、查看版本命令 svnserve --version(更多命令直接键入svnserve --help可查看到)
3、查看svnserver是否已启动: netstat -ntlp,可看到svn对应的端口3690(如果没有看见,则证明服务未启动,可使用svnserve -d启动svn服务,还可以通过svnserve -d -r /home/wwwwfw/mobile来指定启动目录)
4、建立项目:svnadmin create mobile(mobile为项目名称,位置在当前登录用户的主目录下,如我使用wwwwfw登录,则路径为/home/wwwwfw/mobile)
5、在mobile文件夹中可以看到conf文件夹,可针对conf文件夹中的authz、passwd、svnserve.conf进行设置,svnserve.conf主要设置整体的安全策略,passwd则设置用户名和密码,authz则是设置具体的用户有什么权限。
7、常用svn命令:
     checkout(co)命令:

      svn co url --username user --password password

               根据提示可以输入yes来保存帐号和密码;

       update(up)命令:

                进入到需要更新的目录,输入:svn up

      commit(ci)命令:

            进入需要提交的目录,输入:svn ci -m "修改信息"

    add命令:

         进入需要提交的目录,输入:svn add filename or path

       添加完之后需要用commit命令提交。

 

   另外,在vi中也可以不退出编辑的文件来提交文件,

    使用shell命令::! svn ci -m "commit information.."

 

更多详细安装步骤见:ubuntu下svn服务器安装

 

ubuntu下SVN服务器安装配置 一、SVN安装
1.安装包
$ sudo apt-get install subversion

2.添加svn管理用户及subversion组
$ sudo adduser svnuser
$ sudo addgroup subversion
$ sudo addgroup svnuser subversion

 

3.创建项目目录
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo mkdir fitness
$ sudo chown -R root:subversion fitness
$ sudo chmod -R g+rws fitness

4.创建SVN文件仓库
$ sudo svnadmin create /home/svn/fitness

5.访问方式及项目导入:
$ svn co file:///home/svn/fitness
或者
$ svn co file://localhost/home/svn/fitness
* 注意:
如果您并不确定主机的名称,您必须使用三个斜杠(///),而如果您指定了主机的名称,则您必须使用两个斜杠(//).
//--
下面的命令用于将项目导入到SVN 文件仓库:
$ svn import -m "New import" /home/svn/fitness file:///home/svnuser/src/fitness
一定要注明导入信息

 

//--------------------------//
6.访问权限设置
修改 /home/svn/fitness目录下:
svnserve.conf 、passwd 、authz三个文件,行最前端不允许有空格
//--
编辑svnserve.conf文件,把如下两行取消注释
password-db = password
authz-db = authz 

//补充说明
# [general]
anon-access = read
auth-access = write
password-db = passwd
其中 anon-access 和 auth-access 分别为匿名和有权限用户的权限,默认给匿名用户只读的权限,但如果想拒绝匿

 

名用户的访问,只需把 read 改成 none 就能达到目的。

//--
编辑/home/svnuser/etc/passwd 如下:
[users]
mirze = 123456
test1 = 123456
test2 = 123456
//--
编辑/home/svnuser/etc/authz如下
[groups]
admin = mirze,test1
test = test2
[/]
@admin=rw
*=r
这里设置了三个用户mirze,test1,test2密码都是123456
其中mirze和test1属于admin组,有读和写的权限,test2属于test组只有读的权限

7.启动SVN服务
svnserve -d -r /home/svn
描述说明:
-d 表示svnserver以“守护”进程模式运行
-r 指定文件系统的根位置(版本库的根目录),这样客户端不用输入全路径,就可以访问版本库
如: svn://192.168.12.118/fitness

这时SVN安装就完成了.
局域网访问方式:
例如:svn checkout svn://192.168.12.118/fitness --username mirze --password 123456 /var/www/fitness

 

posted @ 2012-02-12 02:56 Dream_c 阅读(1513) 评论(0) 编辑

虽然客户仍然很关心您为他们构建的应用程序的可伸缩性和可用性,但他们可能变得也很关心安全性,而且要求特别严格。应用程序可能容易受到两类安全性威胁的攻击:静态和动态。虽然开发人员不能完全控制动态威胁,但在开发应用程序时,您可以采取一些预防措施来消除静态威胁。本文概括并解释了 13 种类型的静态暴露 ― 它们是系统中的缺陷,它使系统暴露在想要篡夺该系统的特权的攻击者面前。您将学会如何处理这些暴露,以及如何发现(如果不处理这些暴露)这些暴露可能造成的影响。

在开发 Java Web 应用程序时,您需要确保应用程序拥有完善的安全性特征补充。这里在谈到 Java 安全性时,我们并不谈及 Java 语言提供的安全性 API,也不涉及使用 Java 代码来保护应用程序。本文将着重讨论可能潜伏在您的 Java 应用程序中的 安全性暴露。安全性暴露是系统中的缺陷,它使系统无法 ― 即使系统被正常使用 ― 防止攻击者篡夺对系统的特权、控制系统的运行、危及系统上的数据安全或者假冒未经授权的信任。相对于安全性暴露,许多开发人员更加关心网站的感官效果。

毫无疑问,客户现在既严格地关注性能、可伸缩性和可用性也严格地关注安全性。应用程序可能容易受到两类安全性威胁的攻击: 动态和 静态。动态威胁是那些同未经授权进入系统有关的威胁,或那些同跨越网络传输的数据的完整性、隐私和机密性有关的威胁。这些威胁同应用程序的功能代码没有多大关系;使用加密、加密术和认证技术来消除这些威胁。相比之下,静态威胁却同应用程序的功能代码 有关;它们同进入系统的授权用户所做的事情有关。未知用户闯入系统是动态威胁的一个示例;授权用户以未授权方式操作系统内的代码或数据是静态威胁的示例。应用程序开发人员并不能完全控制动态威胁;但开发人员在构建应用程序时却可以采取预防措施来消除静态威胁。

在本文中,我们讨论了对付 13 种不同静态暴露的技巧。对于每种暴露,我们解释了不处理这些安全性问题所造成的影响。我们还为您推荐了一些准则,要开发不受这些静态安全性暴露威胁的、健壮且安全的 Java 应用程序,您应该遵循这些准则。一有合适的时机,我们就提供代码样本(既有暴露的代码也有无暴露的代码)。

对付高严重性暴露的技巧

请遵循下列建议以避免高严重性静态安全性暴露:

  • 限制对变量的访问
  • 让每个类和方法都成为 final,除非有足够的理由不这样做
  • 不要依赖包作用域
  • 使类不可克隆
  • 使类不可序列化
  • 使类不可逆序列化
  • 避免硬编码敏感数据
  • 查找恶意代码

限制对变量的访问

如果将变量声明为 public,那么外部代码就可以操作该变量。这可能会导致安全性暴露。

影响

如果实例变量为 public ,那么就可以在类实例上直接访问和操作该实例变量。将实例变量声明为 protected 并不一定能解决这一问题:虽然不可能直接在类实例基础上访问这样的变量,但仍然可以从派生类访问这个变量。

清单 1 演示了带有 public 变量的代码,因为变量为 public 的,所以它暴露了。

清单 1. 带有 public 变量的代码

Java代码

class Test {

    public int id;

    protected String name;

    Test(){

        id = 1;

        name = "hello world";

    }

    //code

}

public class MyClass extends Test{

    public void methodIllegalSet(String name){

        this.name = name; // this should not be allowed

    }

    public static void main(String[] args){

        Test obj = new Test();

        obj.id = 123; // this should not be allowed

        MyClass mc = new MyClass();

        mc.methodIllegalSet("Illegal Set Value");

    }

}

建议

一般来说,应该使用取值方法而不是 public 变量。按照具体问题具体对待的原则,在确定哪些变量特别重要因而应该声明为 private 时,请将编码的方便程度及成本同安全性需要加以比较。清单 2 演示了以下列方式来使之安全的代码:

清单 2. 不带有 public 变量的代码

Java代码

class Test {

     private int id;

     private String name;

     Test(){

         id = 1;

         name = "hello world";

     }

     public void setId(int id){

     this.id = id;

}

public void setName(String name){

     this.name = name;

}

public int getId(){

     return id;

}

public String getName(){

    return name;

   }

}

让每个类和方法都为 final

不允许扩展的类和方法应该声明为 final 。这样做防止了系统外的代码扩展类并修改类的行为。

影响

仅仅将类声明为非 public 并不能防止攻击者扩展类,因为仍然可以从它自己的包内访问该类。

建议

让每个类和方法都成为 final,除非有足够的理由不这样做。按此建议,我们要求您放弃可扩展性,虽然它是使用诸如 Java 语言之类的面向对象语言的主要优点之一。在试图提供安全性时,可扩展性却成了您的敌人;可扩展性只会为攻击者提供更多给您带来麻烦的方法。

不要依赖包作用域

没有显式地标注为 public 、 private 或 protected 的类、方法和变量在它们自己的包内是可访问的。

影响

如果 Java 包不是封闭的,那么攻击者就可以向包内引入新类并使用该新类来访问您想保护的内容。诸如 java.lang 之类的一些包缺省是封闭的,一些 JVM 也让您封闭自己的包。然而,您最好假定包是不封闭的。

建议

从软件工程观点来看,包作用域具有重要意义,因为它可以阻止对您想隐藏的内容进行偶然的、无意中的访问。但不要依靠它来获取安全性。应该将类、方法和变量显式标注为 public 、 private 或 protected 中适合您特定需求的那种。

使类不可克隆

克隆允许绕过构造器而轻易地复制类实例。

影响

即使您没有有意使类可克隆,外部源仍然可以定义您的类的子类,并使该子类实现 java.lang.Cloneable 。这就让攻击者创建了您的类的新实例。拷贝现有对象的内存映象生成了新的实例;虽然这样做有时候是生成新对象的可接受方法,但是大多数时候是不可接受的。清单 3 说明了因为可克隆而暴露的代码:

清单 3. 可克隆代码

Java代码

class MyClass{

    private int id;

    private String name;

    public MyClass(){

        id=1;

         name="HaryPorter";

     }

    public MyClass(int id,String name){

        this.id=id;

        this.name=name;

    }

    public void display(){

        System.out.println("Id ="+id+"\n"+"Name="+name);

    }

}

// hackers code to clone the user class

public class Hacker extends MyClass implements Cloneable {

    public static void main(String[] args){

        Hacker hack=new Hacker();

             try{

             MyClass o=(MyClass)hack.clone();

            o.display();

        }

        catch(CloneNotSupportedException e){

            e.printStackTrace();

        }

     }

}

建议

要防止类被克隆,可以将清单 4 中所示的方法添加到您的类中:

清单 4. 使您的代码不可克隆

Java代码

public final Object clone()

throws java.lang.CloneNotSupportedException{

    throw new java.lang.CloneNotSupportedException();

}

如果想让您的类可克隆并且您已经考虑了这一选择的后果,那么您仍然可以保护您的类。要做到这一点,请在您的类中定义一个为 final 的克隆方法,并让它依赖于您的一个超类中的一个非 final 克隆方法,如清单 5 中所示:

清单 5. 以安全的方式使您的代码可克隆

Java代码

public final Object clone()

throws java.lang.CloneNotSupportedException {

     super.clone();

}

类中出现 clone() 方法防止攻击者重新定义您的 clone 方法。

使类不可序列化

序列化允许将类实例中的数据保存在外部文件中。闯入代码可以克隆或复制实例,然后对它进行序列化。

影响

序列化是令人担忧的,因为它允许外部源获取对您的对象的内部状态的控制。这一外部源可以将您的对象之一序列化成攻击者随后可以读取的字节数组,这使得攻击者可以完全审查您的对象的内部状态,包括您标记为 private 的任何字段。它也允许攻击者访问您引用的任何对象的内部状态。

建议

要防止类中的对象被序列化,请在类中定义清单 6 中的 writeObject() 方法:

清单 6. 防止对象序列化

Java代码

private final void writeObject(ObjectOutputStream out)

throws java.io.NotSerializableException {

    throw new java.io.NotSerializableException("This object cannot be serialized");

}

通过将 writeObject() 方法声明为 final,防止了攻击者覆盖该方法。

使类不可逆序列化

通过使用逆序列化,攻击者可以用外部数据或字节流来实例化类。

影响

不管类是否可以序列化,都可以对它进行逆序列化。外部源可以创建逆序列化成类实例的字节序列。这种可能为您带来了大量风险,因为您不能控制逆序列化对象的状态。请将逆序列化作为您的对象的另一种公共构造器 ― 一种您无法控制的构造器。

建议

要防止对对象的逆序列化,应该在您的类中定义清单 7 中的 readObject() 方法:

清单 7. 防止对象逆序列化

Java代码

private final void readObject(ObjectInputStream in)

throws java.io.NotSerializableException {

     throw new java.io.NotSerializableException("This object cannot be deserialized");

}

通过将该方法声明为 final ,防止了攻击者覆盖该方法。

避免硬编码敏感数据

您可能会尝试将诸如加密密钥之类的秘密存放在您的应用程序或库的代码。对于你们开发人员来说,这样做通常会把事情变得更简单。

影响

任何运行您的代码的人都可以完全访问以这种方法存储的秘密。没有什么东西可以防止心怀叵测的程序员或虚拟机窥探您的代码并了解其秘密。

建议

可以以一种只可被您解密的方式将秘密存储在您代码中。在这种情形下,秘密只在于您的代码所使用的算法。这样做没有多大坏处,但不要洋洋得意,认为这样做提供了牢固的保护。您可以 遮掩您的源代码或字节码 ― 也就是,以一种为了解密必须知道加密格式的方法对源代码或字节码进行加密 ― 但攻击者极有可能能够推断出加密格式,对遮掩的代码进行逆向工程从而揭露其秘密。

这一问题的一种可能解决方案是:将敏感数据保存在属性文件中,无论什么时候需要这些数据,都可以从该文件读取。如果数据极其敏感,那么在访问属性文件时,您的应用程序应该使用一些加密/解密技术。

查找恶意代码

从事某个项目的某个心怀叵测的开发人员可能故意引入易受攻击的代码,打算日后利用它。这样的代码在初始化时可能会启动一个后台进程,该进程可以为闯入者开后门。它也可以更改一些敏感数据。

这样的恶意代码有三类:

  • 类中的 main 方法
  • 定义过且未使用的方法
  • 注释中的死代码

影响

入口点程序可能很危险而且有恶意。通常,Java 开发人员往往在其类中编写 main() 方法,这有助于测试单个类的功能。当类从测试转移到生产环境时,带有 main() 方法的类就成为了对应用程序的潜在威胁,因为闯入者将它们用作入口点。

请检查代码中是否有未使用的方法出现。这些方法在测试期间将会通过所有的安全检查,因为在代码中不调用它们 ― 但它们可能含有硬编码在它们内部的敏感数据(虽然是测试数据)。引入一小段代码的攻击者随后可能调用这样的方法。

避免最终应用程序中的死代码(注释内的代码)。如果闯入者去掉了对这样的代码的注释,那么代码可能会影响系统的功能性。

可以在清单 8 中看到所有三种类型的恶意代码的示例:

清单 8. 潜在恶意的 Java 代码

Java代码

public void unusedMethod(){

    // code written to harm the system

}

public void usedMethod(){

     //unusedMethod(); //code in comment put with bad intentions,

     //might affect the system if uncommented

     // int x = 100;

     // x=x+10; //Code in comment, might affect the

     //functionality of the system if uncommented

}

建议

应该将(除启动应用程序的 main() 方法之外的) main() 方法、未使用的方法以及死代码从应用程序代码中除去。在软件交付使用之前,主要开发人员应该对敏感应用程序进行一次全面的代码评审。应该使用“Stub”或“dummy”类代替 main() 方法以测试应用程序的功能。

对付中等严重性暴露的技巧

请遵循下列建议以避免中等严重性静态安全性暴露:

  • 不要依赖初始化
  • 不要通过名称来比较类
  • 不要使用内部类
  • 不要依赖初始化

您可以不运行构造器而分配对象。这些对象使用起来不安全,因为它们不是通过构造器初始化的。

影响

在初始化时验证对象确保了数据的完整性。

例如,请想象为客户创建新帐户的 Account 对象。只有在 Account 期初余额大于 0 时,才可以开设新帐户。可以在构造器里执行这样的验证。有些人未执行构造器而创建 Account 对象,他可能创建了一个具有一些负值的新帐户,这样会使系统不一致,容易受到进一步的干预。

建议

在使用对象之前,请检查对象的初始化过程。要做到这一点,每个类都应该有一个在构造器中设置的私有布尔标志,如清单 9 中的类所示。在每个非 static 方法中,代码在任何进一步执行之前都应该检查该标志的值。如果该标志的值为 true ,那么控制应该进一步继续;否则,控制应该抛出一个例外并停止执行。那些从构造器调用的方法将不会检查初始化的变量,因为在调用方法时没有设置标志。因为这些方法并不检查标志,所以应该将它们声明为 private 以防止用户直接访问它们。

清单 9. 使用布尔标志以检查初始化过程

Java代码

public class MyClass{

    private boolean initialized = false;

     //Other variables

     public MyClass (){

        //variable initialization

         method1();

        initialized = true;

    }

     private void method1(){ //no need to check for initialization variable

    //code

}

public void method2(){

    try{

        if(initialized==true){

             //proceed with the business logic

         }

         else{

            throw new Exception("Illegal State Of the object");

    }

}catch(Exception e){

         e.printStackTrace();

    }

  }

}

如果对象由逆序列化进行初始化,那么上面讨论的验证机制将难以奏效,因为在该过程中并不调用构造器。在这种情况下,类应该实现 ObjectInputValidation 接口:

清单 10. 实现 ObjectInputValidation

Java代码

interface java.io.ObjectInputValidation {

    public void validateObject() throws InvalidObjectException;

}

所有验证都应该在 validateObject() 方法中执行。对象还必须调用 ObjectInputStream.RegisterValidation() 方法以为逆序列化对象之后的验证进行注册。 RegisterValidation() 的第一个参数是实现 validateObject() 的对象,通常是对对象自身的引用。注:任何实现 validateObject() 的对象都可能充当对象验证器,但对象通常验证它自己对其它对象的引用。 RegisterValidation() 的第二个参数是一个确定回调顺序的整数优先级,优先级数字大的比优先级数字小的先回调。同一优先级内的回调顺序则不确定。

当对象已逆序列化时, ObjectInputStream 按照从高到低的优先级顺序调用每个已注册对象上的 validateObject() 。

不要通过名称来比较类

有时候,您可能需要比较两个对象的类,以确定它们是否相同;或者,您可能想看看某个对象是否是某个特定类的实例。因为 JVM 可能包括多个具有相同名称的类(具有相同名称但却在不同包内的类),所以您不应该根据名称来比较类。

影响

如果根据名称来比较类,您可能无意中将您不希望授予别人的权利授予了闯入者的类,因为闯入者可以定义与您的类同名的类。

例如,请假设您想确定某个对象是否是类 com.bar.Foo 的实例。清单 11 演示了完成这一任务的错误方法:

清单 11. 比较类的错误方法

Java代码

if(obj.getClass().getName().equals("Foo")) // Wrong!

// objects class is named Foo

}else{

    // object's class has some other name

}

建议

在那些非得根据名称来比较类的情况下,您必须格外小心,必须确保使用了当前类的 ClassLoader 的当前名称空间,如清单 12 中所示:

清单 12. 比较类的更好方法

Java代码

if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){

     // object's class is equal to

     //the class that this class calls "com.bar.Foo"

     }else{

        // object's class is not equal to the class that

         // this class calls "com.bar.Foo"

    }

然而,比较类的更好方法是直接比较类对象看它们是否相等。例如,如果您想确定两个对象 a 和 b 是否属同一个类,那么您就应该使用清单 13 中的代码:

清单 13. 直接比较对象来看它们是否相等

Java代码

if(a.getClass() == b.getClass()){

     // objects have the same class

     }else{

        // objects have different classes

}

尽可能少用直接名称比较。

不要使用内部类

Java 字节码没有内部类的概念,因为编译器将内部类转换成了普通类,而如果没有将内部类声明为 private ,则同一个包内的任何代码恰好能访问该普通类。

影响

因为有这一特性,所以包内的恶意代码可以访问这些内部类。如果内部类能够访问括起外部类的字段,那么情况会变得更糟。可能已经将这些字段声明为 private ,这样内部类就被转换成了独立类,但当内部类访问外部类的字段时,编译器就将这些字段从专用(private)的变为在包(package)的作用域内有效的。内部类暴露了已经够糟糕的了,但更糟糕的是编译器使您将某些字段成为 private 的举动成为徒劳。

建议

如果能够不使用内部类就不要使用内部类。

对付低严重性暴露的技巧

请遵循下列建议以避免低严重性静态安全性暴露:

  • 避免返回可变对象
  • 检查本机方法

避免返回可变对象

Java 方法返回对象引用的副本。如果实际对象是可改变的,那么使用这样一个引用调用程序可能会改变它的内容,通常这是我们所不希望见到的。

影响

请考虑这个示例:某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。即使数组对象本身是不可改变的,也可以在数组对象以外操作数组的 内容,这种操作将反映在返回该数组的对象中。如果该方法返回可改变的对象,那么事情会变得更糟;外部实体可以改变在那个类中声明的 public 变量,这种改变将反映在实际对象中。

清单 14 演示了脆弱性。 getExposedObj() 方法返回了 Exposed 对象的 引用副本,该对象是可变的:

清单 14. 返回可变对象的引用副本

Java代码

class Exposed{

     private int id;

     private String name;

     public Exposed(){

    }

public Exposed(int id, String name){

    this.id = id;

    this.name = name;

}

public int getId(){

    return id;

}

public String getName(){

     return name;

}

public void setId(int id){

    this.id=id;

}

public void setName(String name){

    this.name = name;

}

public void display(){

        System.out.println("Id = "+ id + " Name = "+ name);

     }

}

public class Exp12{

    private Exposed exposedObj = new Exposed(1,"Harry Porter");

     public Exposed getExposedObj(){

     return exposedObj; //returns a reference to the object.

    }

    public static void main(String[] args){

        Exp12 exp12 = new Exp12();

         exp12.getExposedObj().display();

         Exposed exposed = exp12.getExposedObj();

        exposed.setId(10);

         exposed.setName("Hacker");

         exp12.getExposedObj().display();

     }

}

建议

如果方法返回可改变的对象,但又不希望调用程序改变该对象,请修改该方法使之不返回实际对象而是返回它的副本或克隆。要改正清单 14 中的代码,请让它返回 Exposed 对象的 副本,如清单 15 中所示:

清单 15. 返回可变对象的副本

Java代码

public Exposed getExposedObj(){

    return new Exposed(exposedObj.getId(),exposedObj.getName());

}

或者,您的代码也可以返回 Exposed 对象的克隆。

检查本机方法

本机方法是一种 Java 方法,其实现是用另一种编程语言编写的,如 C 或 C++。有些开发人员实现本机方法,这是因为 Java 语言即使使用即时(just-in-time)编译器也比许多编译过的语言要慢。其它人需要使用本机代码是为了在 JVM 以外实现特定于平台的功能。

影响

使用本机代码时,请小心,因为对这些代码进行验证是不可能的,而且本机代码可能潜在地允许 applet 绕过通常的安全性管理器(Security Manager)和 Java 对设备访问的控制。

建议

如果非得使用本机方法,那么请检查这些方法以确定:

  • 它们返回什么
  • 它们获取什么作为参数
  • 它们是否绕过安全性检查
  • 它们是否是 public 、 private 等等
  • 它们是否含有绕过包边界从而绕过包保护的方法调用

结束语

编写安全 Java 代码是十分困难的,但本文描述了一些可行的实践来帮您编写安全 Java 代码。这些建议并不能解决您的所有安全性问题,但它们将减少暴露数目。最佳软件安全性实践可以帮助确保软件正常运行。安全至关重要和高可靠系统设计者总是花费大量精力来分析和跟踪软件行为。只有通过将安全性作为至关紧要的系统特性来对待 ― 并且从一开始就将它构建到应用程序中,我们才可以避免亡羊补牢似的、修修补补的安全性方法。

posted @ 2012-02-08 16:57 Dream_c 阅读(41) 评论(0) 编辑

java code:

package com.commpim.performance;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
* Servlet implementation class for Servlet: UploadFile2Servlet
*
*/
public class UploadFilet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
//用于存放上传文件的目录
private String uploadPath="E:\\upFile\\";
private File tempPath=new File("E:\\upFile\\temp");

/**
* 初始化Servlet,确保需要使用的目录都被建立<br>
*
@throws javax.servlet.ServletException
*/

@Override
public void init() throws ServletException{
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdir();
if(!tempPath.isDirectory())
tempPath.mkdir();
}
/**
* 销毁Servelt
*/
public void destory(){
super.destroy();
}

/**
*
@param request
*
@param response
*
@throws javax.servlet.ServletException
*
@throws java.io.IOException
*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//创建一个上传项目工厂,并设置其缓存数据大小和临时文件保存位置
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setSizeThreshold(4096);
factory.setRepository(tempPath);

//使用项目工厂创建一个ServletFileUpload对象,用于解析文件上传请求
//并设置可以上传的文件的最大字节数,超过会抛出异常
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setSizeMax(1000000);
upload.setHeaderEncoding("utf-8");

List fileItems=null;
try{
//开始读取上传信息
fileItems=upload.parseRequest(request);
//依次处理每一个上传的文件
Iterator itor=fileItems.iterator();
//正则匹配,过滤路径取文件名
String regExp=".+\\\\(.+)$";
//过滤文件类型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p=Pattern.compile(regExp);
while(itor.hasNext()){
FileItem item=(FileItem)itor.next();

//忽略其他不是文件域的所有其他表单信息
if(!item.isFormField()){
String name=item.getName();
long size=item.getSize();
if((name==null||name.equals(""))&&size==0)
continue;
Matcher m=p.matcher(name);
boolean result=m.find();
//如果是允许上传的文件类型就执行上传操作
if(result){
for(int temp=0;temp<errorType.length;temp++){
if(m.group(1).endsWith(errorType[temp])){
throw new IOException(name+":wrong type");
}
}
try{
//保存文件到指定的目录,如果是保存到数据库,改写这里
item.write(new File(uploadPath,m.group(1)));

}catch(Exception e){
}
}else{
throw new IOException("fail to upload");
}
}
}
}catch(IOException e){
e.printStackTrace();
}catch(FileUploadException e1){
e1.printStackTrace();
}

}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
@param request servlet request
*
@param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
*
@param request servlet request
*
@param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "cliff";
}
// </editor-fold>
}

html code:

<html>
<body>
<form name="fileform" method="post" action="UploadFilet"
style
="display: none; font-weight: bold;"
enctype
="multipart/form-data">
<div align="center">
<table width="421" border="1" bordercolor="#C5D6FC"
id
="urltable">
<tr>
<td width="421">
<div align="center">Upload Files</div>
</td>
</tr>
<tr>
<td><input type="file" name="url_1" size="62" /></td>
</tr>
<tr>
<td><input name="url_2" type="file" size="62" /></td>
</tr>
</table>
</div>
<p align="center"><input type="submit" name="Submit"
value
="Submit" /></p>
</form>
</body>
</html>




posted @ 2012-02-01 16:15 Dream_c 阅读(53) 评论(0) 编辑
摘要: 1.创建工作簿 (WORKBOOK)1 HSSFWorkbook wb = new HSSFWorkbook();2 FileOutputStream fileOut = new FileOutputStream("workbook.xls");3 wb.write(fileOut);4 fileOut.close();2.创建工作表(SHEET)1 HSSFWorkbook wb = new HSSFWorkbook();2 HSSFSheet sheet1 = wb.createSheet("new sheet");3 HSSFShe...阅读全文
posted @ 2011-12-20 10:43 Dream_c 阅读(247) 评论(0) 编辑

压缩软件WinRAR并不是免费软件,用了40天后,每次解压文件时都会弹出一提示,问你是否购买(但不影响功能),下面说下最新版的WinRAR v3.71(现在有更新版了,一样可以破解!)的破解注册方法,很简单的!

注册方法:

新建记事本文件(txt文件),把以下代码复制进去,然后将文件另存为以 rarreg.key 为文件名的文件(当然由于设置的不同,可能出现你保存后的文件为 rarreg.key.txt 没关系,将其重命名,删掉.txt 会提示“改扩展名可能导致文件不可用”时点“确定”)将文件放到你的WinRAR安装目录就可以了!(默认安装的目录是C:\Program Files\WinRAR)

现在再双击一个解压包看看,它不会提示你注册了!

 

3.7版注册码


RAR registration data
cafevn
Single PC usage license
UID=bff246844b5c5708595a
6412212250595aa9dfb5db06ca5c5b29cb38d3c346df871e689fcd
26d40cd6724c7fea7a256035c6ab9048e2c5c62f0238f183d28519
aa87488bf38f5b634cf28190bdf438ac593b1857cdb55a7fcb0eb0
c3e4c2736090b3dfa45384e08e9de05c58601faaa5bf2fd204421a
0af4a66c04f5f95c750b942c262c8defc92d51753d37c41772b696
179d2401468afd8cdf6b526bd713b62d9d1c8b39f8f5c862600bd1
6f2be0ead43d89dc20da9c292bbc37165bb690729a430802790431

 


万一上面的不行,再用同样的方法试下这个:

RAR registration data
Roland Geister
2 PC usage license
UID=35d377df3f9109c0cf98
6412212250cf98ba909aa421df59c2d9bfc2c56fe441d634efdebd
b34590837e4f735ccf2160ad3921ca0a4618e1028035530675182a
9455738d54a57e0ab2d29c2cf0c09f37ac90929aab3444e12e34a2
36753ff101333ca3b035205e5fe287ab57600a54c3dee94d01de64
c598977c4565bc9cfce96f7199d75c1fd8170352555cf8d930f52b
4ccfcc9995943805965eeb92f6adb9fd9d032c1e77e51ffc60e607
4fed6a1f6e6cc09f1a5773bbc9c878366f5a20ffcae94083722782

 


3.8版注册码

RAR registration data
Federal Agency for Education
1000000 PC usage license
UID=b621cca9a84bc5deffbf
6412612250ffbf533df6db2dfe8ccc3aae5362c06d54762105357d
5e3b1489e751c76bf6e0640001014be50a52303fed29664b074145
7e567d04159ad8defc3fb6edf32831fd1966f72c21c0c53c02fbbb
2f91cfca671d9c482b11b8ac3281cb21378e85606494da349941fa
e9ee328f12dc73e90b6356b921fbfb8522d6562a6a4b97e8ef6c9f
fb866be1e3826b5aa126a4d2bfe9336ad63003fc0e71c307fc2c60
64416495d4c55a0cc82d402110498da970812063934815d81470829275

 


 

3.9版注册码

我之前装的3.8版使用的上面的注册文件,升级3.9时是覆盖安装的,结果3.9版也是注册了的。所有极有可能3.8版的那个注册码可以用于3.9版。

再发个(32、64位系统都可以用)

RAR registration data
Federal Agency for Education
1000000 PC usage license
UID=b621cca9a84bc5deffbf
6412612250ffbf533df6db2dfe8ccc3aae5362c06d54762105357d
5e3b1489e751c76bf6e0640001014be50a52303fed29664b074145
7e567d04159ad8defc3fb6edf32831fd1966f72c21c0c53c02fbbb
2f91cfca671d9c482b11b8ac3281cb21378e85606494da349941fa
e9ee328f12dc73e90b6356b921fbfb8522d6562a6a4b97e8ef6c9f
fb866be1e3826b5aa126a4d2bfe9336ad63003fc0e71c307fc2c60
64416495d4c55a0cc82d402110498da970812063934815d81470829275

 

posted @ 2011-11-17 09:58 Dream_c 阅读(45) 评论(0) 编辑
摘要: 使用jspsmart上传文件很方便,但是如果使用UTF-8编码,会出现乱码。对于使用 UTF-8编码的项目很不方便。GB2312编码格式不会出现乱码。 今天看了一下,只需要修改一个地方就可以解决问题。 首先反编译SmartUpload类,只需要修改一个私有方法,方法修改如下:private String getDataHeader() { int i = m_currentIndex; int j = 0; for (boolean flag1 = false; !flag1;) if (m_binArray[m_currentIndex] == 13 ...阅读全文
posted @ 2011-10-20 09:19 Dream_c 阅读(234) 评论(0) 编辑
摘要: 在使用excel表格时,有些列是不希望用户可以修改的,诸如审计日志里面确定的部分,而审计人,审计时间等则是需要审计员进行修改的。所以就涉及到不同表格是否可以修改的情况。1在excel中方法如下:先选中希望别人填写或修改的部分,然后鼠标右键:设置单元格格式----保护--把锁定前面的对号清除--确定然后选 工具--保护--保护工作表 (密码自己掌握,怕忘就空) --确定2先在要设置锁定的单元格属性中设置,“单元格格式”——“保护”——“锁定”,然后把开放的单元格属性中的“锁定”取消。然后点菜单“工具”——“保护”——“保护工作表”——“保护工作表及锁定的单元格内容”,将“允许次工作表的所有用户进阅读全文
posted @ 2011-10-11 17:19 Dream_c 阅读(185) 评论(0) 编辑
摘要: 要往xls文件里面写入数据的时候需要注意的是第一要新建一个xls文件OutputStream os=new FileOutputStream("c:\\excel2.xls");再建完这个文件的时候再建立工作文件jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(os));如果这个文件已经存在,那么我们可以在这个文件里面加入一个sheet为了和以前的数据进行分开;jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1&quo阅读全文
posted @ 2011-10-11 17:13 Dream_c 阅读(48) 评论(0) 编辑
摘要: 前面说了关于axis2服务的开发,今天也说说关于axis2客户端的开发。因为axis2以AXIOM为通信模型,所以基本的客户端的开发也是基于这个完成的,也就是说开发axis2的客户端也需要引入axiom-dom包,同时axis2的核心包也是必不可少的。因为客户端在发送请求过程中,会涉及到编、解码,数据传输、本地化等一系列操作,因此需要较多的包依赖。还好我们可以在开放测试的时候,通过运行根据抛出的异常判断还缺少哪些jar包。我这里列出了在简单使用时候的时候用到的jar包,如下pom文件所示:<project xmlns="http://maven.apache.org/POM/4阅读全文
posted @ 2011-08-30 13:09 Dream_c 阅读(1113) 评论(0) 编辑
摘要: 经过前面两部分的学习,我们对axis2的安装及axis2的消息处理有了一定的了解,今天我开始着手定义自己的axis2服务,并打包成axis2可识别的.aar服务包并部署到axis2服务器中,以提供给axis2 client的调用。axis2 client的开发会在后面介绍。 axis2提供了很多方式来创建服务,例如: 创建一个服务并从通过脚本进行打包。通过这种方式,你把你的服务类构建到特定的可读取的AXIOM OMElement对象中,然后创建services.xml文件,最后一并打包成可部署的.aar文件把POJO对象作为服务部署通过WSDL生成服务。你可以通过WSDL生成client,同时阅读全文
posted @ 2011-08-30 13:06 Dream_c 阅读(462) 评论(2) 编辑