心动的瞬间

发布新日志

  • 防火墙相关知识(转)

    2008-08-23 19:16:02

    防火墙是个比较热的词,大家平时也肯定或多或少的接触到了这个词,我们力求在防火墙这个专题中给予大家更多的关于防火墙的知识,在这里我们所指的防火墙是Internet的防火墙。包括个人的和企业的。所谓“病毒防火墙”不是我们这次讨论的范畴,因为其本身只是杀毒软件的一个新功能。

       Firewall 防火墙一种确保网络安全的方法。防火墙可以被安全放置在一个单独的路由器中,用来过滤不想要的信息包,也可以被安装在路由器和主机中,发挥更大的网络安全保护作用。防火墙被广泛用来让用户在一个安全屏障后接入互联网,还被用来把一家企业的公共网络服务器和企业内部网络隔开。另外,防火墙还可以被用来保护企业内部网络某一个部分的安全。例如,一个研究或者会计子网可能很容易受到来自企业内部网络里面的窥探。

      简单说防火墙就是一个位于计算机和它所连接的网络之间的软件。该计算机流入流出的所有网络通信均要经过此防火墙。

        随着计算机网络技术的突飞猛进,网络安全的问题已经日益突出地摆在各类用户的面前。仅从笔者掌握的资料表明,目前在互联网上大约有将近20%以上的用户曾经遭受过黑客的困扰。尽管黑客如此猖獗,但网络安全问题至今仍没有能够引起足够的重视,更多的用户认为网络安全问题离自己尚远,这一点从大约有40%以上的用户特别是企业级用户没有安装防火墙(Firewall)便可以窥见一斑,而所有的问题都在向大家证明一个事实,大多数的黑客入侵事件都是由于未能正确安装防火墙而引发的。

      防火墙的概念及作用

      防火墙的本义原是指古代人们房屋之间修建的那道墙,这道墙可以防止火灾发生的时候蔓延到别的房屋。而这里所说的防火墙当然不是指物理上的防火墙,而是指隔离在本地网络与外界网络之间的一道防御系统,是这一类防范措施的总称。应该说,在互联网上防火墙是一种非常有效的网络安全模型,通过它可以隔离风险区域(即Internet或有一定风险的网络)与安全区域(局域网)的连接,同时不会妨碍人们对风险区域的访问。防火墙可以监控进出网络的通信量,从而完成看似不可能的任务;仅让安全、核准了的信息进入,同时又抵制对企业构成威胁的数据。随着安全性问题上的失误和缺陷越来越普遍,对网络的入侵不仅来自高超的攻击手段,也有可能来自配置上的低级错误或不合适的口令选择。因此,防火墙的作用是防止不希望的、未授权的通信进出被保护的网络,迫使单位强化自己的网络安全政策。一般的防火墙都可以达到以下目的:一是可以限制他人进入内部网络,过滤掉不安全服务和非法用户;二是防止入侵者接近你的防御设施;三是限定用户访问特殊站点;四是为监视Internet安全提供方便。由于防火墙假设了网络边界和服务,因此更适合于相对独立的网络,例如Intranet等种类相对集中的网络。防火墙正在成为控制对网络系统访问的非常流行的方法。事实上,在Internet上的Web网站中,超过三分之一的Web网站都是由某种形式的防火墙加以保护,这是对黑客防范最严,安全性较强的一种方式,任何关键性的服务器,都建议放在防火墙之后。

      防火墙的架构与工作方式

      防火墙可以使用户的网络划规划更加清晰明了,全面防止跨越权限的数据访问(因为有些人登录后的第一件事就是试图超越权限限制)。如果没有防火墙的话,你可能会接到许许多多类似的报告,比如单位内部的财政报告刚刚被数万个Email邮件炸烂,或者用户的个人主页被人恶意连接向了Playboy,而报告链接上却指定了另一家色情网站......一套完整的防火墙系统通常是由屏蔽路由器和代理服务器组成。屏蔽路由器是一个多端口的IP路由器,它通过对每一个到来的IP包依据组规则进行检查来判断是否对之进行转发。屏蔽路由器从包头取得信息,例如协议号、收发报文的IP地址和端口号、连接标志以至另外一些IP选项,对IP包进行过滤。代理服务器是防火墙中的一个服务器进程,它能够代替网络用户完成特定的TCP/TP功能。一个代理服务器本质上是一个应用层的网关,一个为特定网络应用而连接两个网络的网关。用户就一项TCP/TP应用,比如Telnet或者FTP,同代理服务器打交道,代理服务器要求用户提供其要访问的远程主机名。当用户答复并提供了正确的用户身份及认证信息后,代理服务器连通远程主机,为两个通信点充当中继。整个过程可以对胜户完全透明。用户提供的用户身份及认证信息可用于用户级的认证。最简单的情况是:它只由用户标识和口令构成。但是,如果防火墙是通过Internet可访问的,应推荐用户使用更强的认证机制,例如一次性口令或回应式系统等。

    屏蔽路由器的最大优点就是架构简单且硬件成本较低,而缺点则是建立包过滤规则比较困难,加之屏蔽路由器的管理成本及用户级身份认证的缺乏等。好在路由器生产商们已经认识到并开始着手解决这些问题,他们正在开发编辑包过滤规则的图形用户界面,制订标准的用户级身份认证协议,以提供远程身份认证拨入用户服务(REDIUS)。

      代理服务器的优点在于用户级的身份认证、日志记录和帐号管理。其缺点关系到这样一个事实;要想提供全面的安全保证,就要对每一项服务都建立对应的应用层网关。这个事实严重地限制了新应用的采纲。

      屏蔽路由器和代理服务器通常组合在一起构成混合系统,其中屏蔽路由器主要用来防止IP欺骗攻击。目前采用最广泛的配置是Dualhomed防火墙、被屏蔽主机型防火墙以及被屏蔽子网型防火墙。

      通常架设防火墙需要数千甚至上万美元的投入,而且防火墙需要运行于一台独立的计算机上,因此只用一台计算机连入互联网的用户是不必要架设防火墙的,况且这样做即使从成本方面讲也太不划算。目前观之,防火墙的重点还是用来保护由许多台计算机组成的大型网络,这也是黑客高手们真正感兴趣的地方。防火墙可以是非常简单的过滤器,也可能是精心配置的网关,但它们的原理是一样,都是监测并过滤所有通向外部网和从外部网传来的信息,防火墙保护着内部敏感的数据不被偷窃和破坏,并记下来通讯发生的时间和操作等等,新一代的防火墙甚至可以阻止内部人员故意将敏感数据传输到外界。当用户将单位内部的局部网连入互联网时,大家肯定不愿意让全世界的人随意翻阅你单位内部人员的工资单、各种文件资料或者是数据库,但即使在单位内部也存在数据攻击的可能性。例如一些心怀叵测的电脑高手可能会修改工资表和财务报告。而通过设置防火墙后,管理员就可以限定单位内部员工使用Email、浏览WWW以及文件传输,但不允许外界任意访问单位内部的计算机,同时管理员也可以禁止单位中不同部门之间互相访问。将局部网络放置防火墙之后可以阻止来自外界的攻击。而防火墙通常是运行在一台单独的计算机之上的一个特别的软件,它可以识别并屏蔽非法的请求。例如一台WWW代理服务器,所有的请求都间接地由代理服务器处理,这台服务器不同于普通的代理服务器,它不会直接地处理请求,它会验证请求发出者的身份、请求的目的地和请求内容。如果一切符合要求的话,这个请求会被批准送到真正的WWW服务器上。当真正的WWW服务器处理完这个请求后并不会直接把结果发送给请求者,它会把结果送到代理服务器,代理服务器会按照事先的规定检查这个结果是否违反了安全规定,当这一切都通过后,返回结果才会真正地送到请求者的手里。

      防火墙的体系结构

      1、屏蔽路由器(ScreeningRouter)

      屏蔽路由器可以由厂家专门生产的路由器实现,也可以用主机来实现。屏蔽路由器作为内外连接的惟一通道,要求所有的报文都必须在此通过检查。路由器上可以安装基于IP层的报文过滤软件,实现报文过滤功能。许多路由器本身带有报文过滤配置选项,但一般比较简单。单纯由屏蔽路由器构成的防火墙的危险包括路由器本身及路由器允许访问的主机。屏蔽路由器的缺点是一旦被攻隐后很难发现,而且不能识别不同的用户。

      2、双穴主机网关(DualHomedGateway)

      双穴主机网关是用一台装有两块网卡的堡垒主机的做防火墙。两块网卡各自与受保护网和外部网相连。堡垒主机上运行着防火墙软件,可以转发应用程序,提供服务等。与屏蔽路由器相比,双穴主机网关堡垒主机的系统软件可用于维护护系统日志、硬件拷贝日志或远程日志。但弱点也比较突出,一旦黑客侵入堡垒主机并使其只具有路由功能,任何网上用户均可以随便访问内部网。

    3、被屏蔽主机网关(ScreenedGatewy)

      屏蔽主机网关易于实现也最为安全。一个堡垒主机安装在内部网络上,通常在路由器上设立过滤规则,并使这个堡垒主机成为从外部网络惟一可直接到达的主机,这确保了内部网络不受未被授权的外部用户的攻击。如果受保护网是一个虚拟扩展的本地网,即没有子网和路由器,那么内部网的变化不影响堡垒主机和屏蔽路由器的配置。危险带限制在堡垒主机和屏蔽路由器。网关的基本控制策略由安装在上面的软件决定。如果攻击者没法登录到它上面,内网中的其余主机就会受到很大威胁。这与双穴主机网关受攻击时的情形差不多。

      4、被屏蔽子网(ScreenedSubnet)

      被屏蔽子网就是在内部网络和外部网络之间建立一个被隔离的子网,用两台分组过滤路由器将这一子网分别与内部网络和外部网络分开。在很多实现中,两个分组过滤路由器放在子网的两端,在子网内构成一个DNS,内部网络和外部网络均可访问被屏蔽子网,但禁止它们穿过被屏蔽子网通信。有的屏蔽子网中还设有一堡垒主机作为惟一可访问点,支持终端交互或作为应用网关代理。这种配置的危险仅包括堡垒主机、子网主机及所有连接内网、外网和屏蔽子网的路由器。如果攻击者试图完全破坏防火墙,他必须重新配置连接三个网的路由器,既不切断连接又不要把自己锁在外面,同时又不使自己被发现,这样也还是可能的。但若禁止网络访问路由器或只允许内网中的某些主机访问它,则攻击会变得很困难。在这种情况下,攻击者得先侵入堡垒主机,然后进入内网主机,再返回来破坏屏蔽路由器,并且整个过程中不能引发警报。


      防火墙的基本类型

      如今市场上的防火墙林林总总,形式多样。有以软件形式运行在普通计算机之上的,也有以固件形式设计在路由器之中的。总的来说可以分为三种:包过滤防火墙、代理服务器和状态监视器。

      包过滤防火墙(IPFiltingFirewall):

      包过滤(PacketFilter)是在网络层中对数据包实施有选择的通过,依据系统事先设定好的过滤逻辑,检查数据据流中的每个数据包,根据数据包的源地址、目标地址、以及包所使用端口确定是否允许该类数据包通过。在互联网这样的信息包交换网络上,所有往来的信息都被分割成许许多多一定长度的信息包,包中包括发送者的IP地址和接收者的IP地址。当这些包被送上互联网时,路由器会读取接收者的IP并选择一条物理上的线路发送出去,信息包可能以不同的路线抵达目的地,当所有的包抵达后会在目的地重新组装还原。包过滤式的防火墙会检查所有通过信息包里的IP地址,并按照系统管理员所给定的过滤规则过滤信息包。如果防火墙设定某一IP为危险的话,从这个地址而来的所有信息都会被防火墙屏蔽掉。这种防火墙的用法很多,比如国家有关部门可以通过包过滤防火墙来禁止国内用户去访问那些违反我国有关规定或者"有问题"的国外站点,例如www.playboy.com、www.cnn.com等等。包过滤路由器的最大的优点就是它对于用户来说是透明的,也就是说不需要用户名和密码来登录。这种防火墙速度快而且易于维护,通常做为第一道防线。包过滤路由器的弊端也是很明显的,通常它没有用户的使用记录,这样我们就不能从访问记录中发现黑客的攻击记录。而攻击一个单纯的包过滤式的防炎墙对黑客来说是比较容易的,他们在这一方面已经积了大量的经验。"信息包冲击"是黑客比较常用的一种攻击手段,黑客们对包过滤式防火墙发出一系列信息包,不过这些包中的IP地址已经被替换掉了(FakeIP),取而代之的是一串顺序的IP地址。一旦有一个包通过了防火墙,黑客便可以用这个IP地十来伪装他们发出的信息。在另一些情况下黑客们使用一种他们自己编制的路由器攻击程序,这种程序使用路由器协议(RoutingInformationProtcol)来发送伪造的路由信息,这样所有的包都会被重新路由到一个入侵者所指定的特别地址。对付这种路由器的另一种技术被称之为"同步淹没",这实际上是一种网络炸弹。攻击者向被攻击的计算机发出许许多多个虚假的"同步请求"信号包,当服务器响应了这种信号包后会等待请求发出者的回答,而攻击者不做任何的响应。如果服务器在45秒钟里没有收到反应信号的话就会取消掉这次请求。但是当服务器在处理成知上万个虚假请求时,它便没有时间来处理正常的用户请求,处于这种攻击下的服务器和死锁没什么两样。此种防火墙的缺点是很明显的,通常它没有用户的使用记录,这样我们就不能从访问记录中发现黑客的攻击记录。此外,配置繁琐也是包过滤防火墙的一个缺点。它阻挡别人进入内部网络,但也不告诉你何人进入你的系统,或者何人从内部进入网际网路。它可以阻止外部对私有网络的访问,却不能记录内部的访问。包过滤另一个关键的弱点就是不能在用户级别上进行过滤,即不能鉴别不同的用户和防止IP地址盗用。包过滤型防火墙是某种意义上的绝对安全的系统。

    代理服务器(ProxyServer):

      代理服务器通常也称作应用级防火墙。包过滤防火墙可以按照IP地址来禁止未授权者的访问。但是它不适合单位用来控制内部人员访问外界的网络,对于这样的企业来说应用级防火墙是更好的选择。所谓代理服务,即防火墙内外的计算机系统应用层的链接是在两个终止于代理服务的链接来实现的,这样便成功地实现了防火墙内外计算机系统的隔离。代理服务是设置在Internet防火墙网关上的应用,是在网管员允许下或拒绝的特定的应用程度或者特定服务,同时,还可应用于实施较强的数据流监控、过滤、记录和报告等功能。一般情况下可应用于特定的互联网服务,如超文本传输(HTTP)、远程文件传输(FTP)等。代理服务器通常拥有高速缓存,缓存中存有用户经常访问站点的内容,在下一个用户要访问同样的站点时,服务器就用不着重复地去抓同样的内容,既节约了时间也节约了网络资源。

      下面笔者向网友们简单介绍几种代理服务器的设计实现方式:

      1、应用代理服务器(ApplicationGatewayProxy)

      应用代理服务器可以在网络应用层提供授权检查及代理服务。当外部某台主机试图访问(如Telnet)受保护网时,它必须先在防火墙上经过身份认证。通过身份认证后,防火墙运行一个专门为Telnet设计的程序,把外部主机与内部主机连接。在这个过程中,防火墙可以限制用户访问的主机、访问的时间及访问的方式。同样,受保护网络内部用户访问外部网时也需先登录到防火墙上,通过验证后才可使用Telnet或FTP等有效命令。应用网关代理的优点是既可以隐藏内部IP地址,也可以给单个用户授权,即使攻击者盗用了一个合法的IP地址。他也通不过严格的身份认证。因特网关比报文过滤具有更高的安全性。但是这种认证使得应用网关不透明,用户每次连接都要受到"盘问",这给用户带来许多不便。而且这种代理技术需要为每个应用网关写专门的程序。

      2、回路级代理服务器

      回路级代理服务器也称一般代理服务器,它适用于多个协议,但无法解释应用协议,需要通过其他方式来获得信息。所以,回路级代理服务器通常要求修改过的用户程序。其中,套接字服务器(SocketsServer)就是回路级代理服务器。套接字(Sockets)是一种网络应用层的国际标准。当受保护网络客户机需要与外部网交互信息时,在防火墙上的套接字服务器检查客户的UserID、IP源地址和IP目的地址,经过确认后,套服务器才与外部的段服务器建立连接。对用户来说,受保护网与外部网的信息交换是透明的,感觉不到防火墙的存在,那是因为因特网络用户不需要登录到防火墙上。但是客户端的应用软件必须支持"SocketsifideAPI"受保护网络用户访问公共网所使用的IP地址也都是防火墙的IP地址。

      3、代管服务器

      代管服务器技术换言之就是把不安全的服务,诸如FTP、Telnet等放到防火墙上,使它同时充当服务器,对外部的请求作出回答。与应用层代理实现相比,代管服务器技术不必为每种服务专门写程序。而且,受保护网内部用户想对外部网访问时,也需先登录到防火墙上,再向外提出请求,这样从外部网向内就只能看到防火墙,从而隐藏了内部地址,提高了安全性。

      4、IP通道(IPTunnels)

      如果某公司下属的两个子公司相隔较远,通过Internet进行通信时,可以采用IPTunnels来防止Internet上的黑客截取信息,从而在Internet上形成一个虚构的企业网。

      5、网地址转换器(NetworkAddressTranslate)

      当受保护网连到Internet上时,受保护网用户若要访问Internet,必须使用一个合法的IP地址。但由于合法InternetIP地址有限,而且受保护网络往往有自己的一套IP地址规划。网络地址转换器就是在防火墙上装一个合法IP地址集。当内部某一用户要访问Internet时,防火墙态地从地址集中选一个未分配的地址分配给该用户,该用户即可使用这个合法地址进行通信。同时,对于内部的某些服务器如Web服务器,网络地址转换器允许为其分配一个固定的合法地址。外部网络的用户就可通过防火墙来访问内部的服务器。这种技术既缓解了少量的IP地址和大量的主机之间的矛盾,又对外隐藏了内部主机的IP地址,提高了安全性。

    6、隔离域名服务器(SplitDomainNameSever)

      这种技术是通过防火墙将受保护网络的域名服务器与外部网的域名服务器隔离,使外部网的域名服务器只能看到防火墙的IP地址,无法了解受保护网络的具体情况,这样可以保证受保护网络的IP地址不被外部网络知悉。

      7、邮件转发技术(Mailforwarding)

      当防火墙采用上面所提到的几种技术使得外部网络只知道防火墙的IP地址和域名时,从外部网络发来的邮件,就只能送到防火墙上。这时防火墙对邮件进行检查,只有当发送邮件的源主机是被允许通过的,防火墙才对邮件的目的地址进行转换,送到内部的邮件服务器,由其进行转发。

      代理服务器像真的墙一样挡在内部用户和外界之间,特别是从外面来的访问者只能看到代理服务器而看不见到任何的内部资源,诸如用户的IP等。而内部客户根本感觉不到它的存在,可以自由访问外部站点。代理可以提供极好的访问控制、登录能力以及地址转换功能,对进出防火墙的信息进行记录,便于管理员监视和管理系统。但代理服务器同时也存在一些不足,特别是它会使网络的访问速度变慢,因为它不允许用户直接访问网络,而代理又要处理入和出的通信量,因此每增加一种新的媒体应用,则必须对代理进行设置。笔者在一套办公应用软件的设计方面,就因为代理服务器的原因折腾了很长时间,结果还是由于设置与容错方面的问题暂时搁浅了。

      状态监视器(StatefulInspection):

      状态监视器作为防火墙技术其安全特性最佳,它采用了一个在网关上执行网络安全策略的软件引擎,称之为检测模块。检测模块在不影响网络正常工作的前提下,采用抽取相关数据的方法对网络通信的各层实施监测,抽取部分数据,即状态信息,并动态地保存起来作为以后制定安全决策的参考。检测模块支持多种协议和应用程序,并可以很容易地实现应用和服务的扩充。与其它安全方案不同,当用户访问到达网关的操作系统前,状态监视器要抽取有关数据进行分析,结合网络配置和安全规定作出接纳、拒绝、鉴定或给该通信加密等决定。一旦某个访问违反安全规定,安全报警器就会拒绝该访问,并作下记录向系统管理器报告网络状态。状态监视器的另一个优点就是可以监测RemoteProcedureCall和User DatagrqamProtocol类的端口信息。问题当然也有,即状态监视器的配置非常复杂,而且会降低网络的速度。

      目前防火墙已经在Internet上得到了广泛的应用,而且由于防火墙不限于TCP/IP协议的特点,也使其逐步在Internet之外更具生命力。客观的讲,防火墙并不是解决网络安全问题的万能药方,而只是网络安全政策和策略中的一个组成部分,但了解防火墙技术并学会在实际操作中应用防火墙技术,相信会在新世纪的网络生活中让每一位网友都受益菲浅。

  • 如何学习J2EE【转帖】

    2008-08-23 19:16:02

    Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE。这三块相互补充,应用范围不同。
    J2SE就是Java2的标准版,主要用于桌面应用软件的编程;
    J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;
    J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

    先学习j2se
    要学习j2ee就要先学习j2se,刚开始学习j2se先建议不要使用IDE,然后渐渐的过渡到使用IDE开发,毕竟用它方便嘛。学习j2se推荐两本书,《java2核心技术一二卷》,《java编程思想》,《java模式》。其中《java编程思想》要研读,精读。这一段时间是基本功学习,时间会很长,也可能很短,这要看学习者自身水平而定。

    不要被IDE纠缠
    在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学JAVA的时候,要学语言本身的东西,不要太在意IDE的附加功能,JAVA编程在不同IDE之间的转换是很容易的,过于的在意IDE的功能反而容易耽误对语言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加强版WSAD。用好其中一个就可以了,推荐从eclipse入手j2ee。因为Jbuilder更适合于写j2se程序。

    选择和学习服务器使用配置
    当你有了j2se和IDE的经验时,可以开始j2ee的学习了,web服务器:tomcat,勿庸置疑,tomcat为学习web服务首选。而应用服务器目前主要有三个:jboss、weblogic、websphere。有很多项目开始采用jboss,并且有大量的公司开始做websphere或weblogic向jboss应用服务器的移植(节省成本),这里要说的是,学习tomcat和jboss我认为是首选,也是最容易上手的。学习服务器使用配置最好去询问有经验的人(有条件的话),因为他们或许一句话就能解决问题,你自己上网摸索可能要一两天(我就干过这种傻事),我们应该把主要时间放在学习原理和理论上,一项特定技术的使用永远代替不了一个人的知识和学问。

    学习web知识
    如果你是在做电子商务网站等时,你可能要充当几个角色,这是你还要学习:
    html,可能要用到dreamwave等IDE。
    Javascrīpt,学会简单的数据校验,数据联动显示等等

    J2eeAPI学习
    学习j2eeAPI和学习服务器应该是一个迭代的过程。
    先学习jsp和servlet编程,这方面的书很多,我建立看oreilly公司的两本《jsp设计》和《java servlet编程》,oreilly出的书总是那本优秀,不得不佩服。
    学习jdbc数据库编程,j2ee项目大多都是MIS系统,访问数据库是核心。这本应属于j2se学习中,这里拿出来强调一下。
    学习jndi api,它和学习ejb可以结合起来。
    学习ejb api,推荐书《精通ejb》
    经过上面的这些的学习,大概可以对付一般的应用了。
    有人说跟着sun公司的《j2ee tutorial》一路学下来,当然也可以。

    学习ejb设计模式和看代码(最重要)
    设计模式是练内功,其重要性可以这么说吧,如果你不会用设计模式的话,你将写出一堆使用了ejb的垃圾,有慢又是一堆bug,其结果不如不用ejb实现(ejb不等于j2ee)
    无论学习什么语言,都应该看大量代码,你看的代码量不到一定数量,是学不好j2ee的
    目前有很多开源的工程可以作为教材:
    jive论坛
    petstore sun公司
    dune sun公司
    等等,研读一个,并把它用到自己的工程中来。

    J2ee其他学习
    当你渐渐对j2ee了解到一定深度时,你要开始关注当前领域中的一些技术变化,J2ee是一块百家争鸣的领域,大家都在这里提出自己的解决方案,例如structs,hiberate,ofbiz等等,学习这些东西要你的项目和目标而定,预先补充一下未尝不可,但不用涉及太深,毕竟学习原理和理论是最最重要的事。

    目前常见j2eeAPI
    JavaServer Pages(JSP)技术1.2
    Java Servlet技术2.3
    JDBC API 2.0
    Java XML处理API(JAXP)1.1
    Enterprise JavaBeans技术2.0
    Java消息服务(JMS)1.0
    Java命名目录接口(JNDI)1.2
    Java事务API(JTA) 1.0
    JavaMail API 1.2
    JavaBeans激活架构(JAF)1.0
    J2EE连接器体系结构(JCA)1.0
    Java认证和授权服务(JAAS)1.0
    学习上面的某些API要以你的项目而定,了解所有他们总之是有好处的
    上面印证了大家说的一句话,java语言本身不难学,但是技术太多,所以学java很费劲。回想一下,基本上每个初学者,在刚学习java的时候可能都会问别人这么一句话,你怎么知道的哪个方法(api)在哪个包里的?呵呵,无他,唯手熟尔
  • JDK安装

    2008-08-23 19:16:02

    一。JDK1.4下载及安装

    1。点击下面网址进入JDK1.4下载页面:

      
    http://Java.sun.com/J2SE/1.4.2/download.html
    2。点击“Download J2SE SDK”

    3。“Accept”,Continue

    4。下面列出了各个平台下的JDK版本,其中Windows版有两种安装方式,一种是完全下载后再安装,一种是在线安装,我们选择第一种:

    5。下载完成后,双击图标进行安装,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\jdk1.4。

    二。配置JDK环境变量

    1。右击“我的电脑”,点击“属性”:
    2。选择“高级”选项卡,点击“环境变量”

    3。在“系统变量”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击“编辑”,不存在则点击“新建”

    4。JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\jdk1.4,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,Eclipse等都需要依靠此变量);Path使得系统可以在任何路径下识别java命令,设为:

    %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

      CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别,设为:

    .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (要加.表示当前路径)

      %JAVA_HOME%就是引用前面指定的JAVA_HOME。
    5。“开始”->“运行”,键入“cmd”

    6。键入命令“java -version”,查看是否安装成功。

    更详细的图片解释:http://dev.21tx.com/2005/01/24/11287.html

  • Eclipse安装

    2008-08-23 19:16:02

    配置好JDK后,下一步便是安装Eclipse 3.0,可以从Eclipse的官方站点http://www.eclipse.org上下载

    Eclipse SDK包括了Eclipse开发环境,Java开发环境,Plug-in开发环境,所有源代码和文档,如果你需要所有的功能,可以下载这个版本。

    勿需安装,直接找到目录下的eclipse.exe运行,出现启动画面

  • java中this&super的用法[转]

    2008-08-23 19:16:02

    在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。

    在一般方法中

      最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:

    public class DemoThis{
      private String name;
      private int age;
      DemoThis(String name,int age){
        setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
        setAge(age);
        this.print();
      }  
      public void setName(String name){
        this.name=name;//此处必须指明你要引用成员变量
      }
      public void setAge(int age){
        this.age=age;
      }
      public void print(){
        System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西
      }
      public static void main(String[] args){
        DemoThis dt=new DemoThis("Kevin","22");
      }
    }

      这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。

    class Person{
      public int c;
      private String name;
      private int age;
      protected void setName(String name){
        this.name=name;
      }
      protected void setAge(int age){
        this.age=age;
      }
      protected void print(){
        System.out.println("Name="+name+" Age="+age);
      }
    }
    public class DemoSuper extends Person{
      public void print(){
        System.out.println("DemoSuper:");
        super.print();
      }
      public static void main(String[] args){
        DemoSuper ds=new DemoSuper();
        ds.setName("kevin");
        ds.setAge(22);
        ds.print();
      }
    }

      在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。输出结果说明了这一点:

    DemoSuper:
    Name=kevin Age=22

      这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。

    在构造函数中

      构造函数是一种特殊的方法,在对象初始化的时候自动调用。在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:

    class Person{
      public static void prt(String s){
        System.out.println(s);
      }
      Person(){
        prt("A Person.");
      }
      Person(String name){
        prt("A person name is:"+name);
      }
    }
    public class Chinese extends Person{
      Chinese(){
        super();  //调用父类构造函数(1)
        prt("A chinese.");//(4)
      }
      Chinese(String name){
        super(name);//调用父类具有相同形参的构造函数(2)
        prt("his name is:"+name);
      }
      Chinese(String name,int age){
        this(name);//调用当前具有相同形参的构造函数(3)
        prt("his age is:"+age);
      }
      public static void main(String[] args){
        Chinese cn=new Chinese();
        cn=new Chinese("kevin");
        cn=new Chinese("kevin",22);
      }
    }

      在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道了

  • java中finalize的使用(转)

    2008-08-23 19:16:02

    JAVA编程思想》:

    java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()

              (1).对象不一定会被回收。

           (2).垃圾回收不是析构函数。

           (3).垃圾回收只与内存有关。

           (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

    有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。

    要给一个类增加收尾(finalizer ),你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。

    finalize()方法的通用格式如下:

    protected void finalize( )
    {
    // finalization code here
    }

    其中,关键字protected是防止在该类之外定义的代码访问finalize()标识符。该标识符和其他标识符将在第7章中解释。

    理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。

    注意:如果你熟悉C ,那你知道C 允许你为一个类定义一个撤消函数(destructor ),它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。

    理解finalize()-析构函数的替代者

    by Tim Gooch

    在许多方面,Java 类似于 C++。Java 的语法非常类似于 C++,Java 有类、方法和数据成员;Java 的类有构造函数; Java 有异常处理。

    但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数,Java 支持finalize() 方法。

    在本文中,我们将描述 finalize() 与 C++ 析构函数的区别。另外,我们将创建一个简单的 Applet 来演示 finalize() 是如何工作的。

    最终的界限

    与 Java 不同,C++ 支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持,C++ 也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。

    在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。结果,Java 的设计者觉得不需要析构函数(象 C++ 中所实现的)。

    取而代之,Java 定义了一个特殊的方法叫做finalize() ,它提供了 C++ 析构函数的一些功能。但是,finalize() 并不完全与 C++ 的析构函数一样,并可以假设它会导致一系列的问题。finalize() 方法作用的一个关键元素是 Java 的垃圾回收器。

    垃圾回收器

    在 C/C++、Pascal和其他几种多种用途的编程语言中,开发者有责任在内存管理上发挥积极的作用。例如,如果你为一个对象或数据结构分配了内存,那么当你不再使用它时必须释放掉该内存。

    在 Java 中,当你创建一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标记为释放状态。

    当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize() 方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)

    在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。

    其次,除非垃圾回收器认为你的 Applet 或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,这是完全可能的:一个 Applet 给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。

    显然,如果你为某个对象定义了finalize() 方法,JVM 可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用System.gc() 也不会起作用,因为它仅仅是给 JVM 一个建议而不是命令。

    finalize() 有什么优点呢?

    如果finalize() 不是析构函数,JVM 不一定会调用它,你可能会疑惑它是否在任何情况下都有好处。事实上,在 Java 1.0 中它并没有太多的优点。

    根据 Java 文档,finalize() 是一个用于释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法,因此很难证明使用该方法释放资源是有效的。

    Java 1.1 通过提供一个System.runFinalizersOnExit() 方法部分地解决了这个问题。(不要将这个方法与 Java 1.0 中的System.runFinalizations() 方法相混淆。)不象System.gc() 方法那样,System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize() 方法。

    正如你可能猜测的那样,通过调用System.runFinalizersOnExit() 方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。现在建立一个示例 Applet 来演示 Java 垃圾回收器和finalize() 方法是如何相互作用的。

    回收垃圾

    通过使用Java Applet Wizard 创建一个新的 Applet 开始。当提示这样做时,输入 final_things 作为 Applet 名,并选择不要生成源文件注释。

    接下来,在Java Applet Wizard 进行第三步,不要选择多线程选项。在第五步之前,根据需要修改 Applet 的描述。

    当你单击Finish 后,Applet Wizard 将生成一个新的工作空间,并为该项目创建缺省的 Java 文件。从列表 A 中选择适当的代码输入(我们已经突出显示了你需要输入的代码)。

    当你完成代码的输入后,配置Internet 浏览器将System.out 的输出信息写到Javalog.txt 文件中。(在IE 选项对话框的高级页面中选择起用 Java Logging。)

    编译并运行该 Applet。然后,等待 Applet 运行(你将在状态栏中看到 Applet 已启动的信息),退出浏览器,并打开Javalog.txt 文件。你将会发现类似于下列行的信息:

            1000 things constructed

            0 things finalized

    正如你能够看到的那样,建立了1,000个对象仍然没有迫使垃圾回收器开始回收空间,即使在 Applet 退出时也没有对象被使用。

    现在,删除在stop() 方法第一行中的注释符以起用System.gc() 方法。再次编译并运行该 Applet ,等待 Applet 完成运行,并退出浏览器。当你再次打开Javalog.txt 文件,你将看到下列行:

            1000 things constructed

            963 things finalized

    这次,垃圾回收器认为大多数对象未被使用,并将它们回收。按顺序,当垃圾回收器开始释放这些对象的内存时,JVM 调用它们的finalize() 方法。

    继承finalize()?

    顺便,如果你在类中定义了finalize() ,它将不会自动调用基类中的方法。在我们讨论了finalize() 与 C++ 的析构函数的不同点后,对这个结论不会惊讶,因为为某个类定制的清除代码另一个类不一定会需要。

    如果你决定要通过派生一个类的finalize() 方法来调用基类中的finalize() 方法,你可以象其他继承方法一样处理。

            protected void finalize()

            {

              super.finalize();

              // other finalization code...

            }

    除了允许你控制是否执行清除操作外,这个技术还使你可以控制当前类的finalize() 方法何时执行。

    结论

    然而有益的是,Java 的自动垃圾回收器不会失去平衡。作为便利的代价,你不得不放弃对系统资源释放的控制。不象 C++ 中的析构函数,Java Applet 不会自动执行你的类中的finalize() 方法。事实上,如果你正在使用 Java 1.0,即使你试图强制它调用finalize() 方法,也不能确保将调用它。

    因此,你不应当依靠finalize() 来执行你的 Applet 和应用程序的资源清除工作。取而代之,你应当明确的清除那些资源或创建一个try...finally 块(或类似的机制)来实现。


  • 5月20日学习计划

    2008-08-23 19:16:02

       今天有个想法,虽然之前是很想学java,但是更多的是以前在公司开发的系统也是使用java.但是其实好像自己是对php有兴趣多点,那么我应该是去学哪个呢?

       决定了,还是兴趣决定效率,决定改变方向:PHP!

       Let's goooo!

       看来有必要去找些php的相关文章,再制定计划去学习.

  • 5月20日学习计划

    2008-08-23 19:16:02

    学习计划:

    1.软件工程第一章

    2.Effective software testing,第一章

    3.Java编程思想第一章

     

    学习日志:

    1.未完成

    2.未完成

    3.看了两个要点

  • 5月19日学习计划

    2008-08-23 19:16:02

      由于还有学习的任务.所以计划是三方面的学习.(每方面一章,试实行一周)

    一.本科的学习(实用软件工程/微计算机技术/C++高级编程)

    二.测试技术的学习(Effective software testing)

    三.开发技术的学习(JAVA编程思想(经典之书)/ JAVA讲义(呵呵,一位朋友推荐给我的)/JDK)

    实用软件工程,共13章,每天一章,预计两周完成

    微计算机技术,共9章,每天一章,预计9天完成

    C++高级编程,共13章,每天一章,预计两周完成

    Effective software testing,共10章,每天一章,预计10天完成

    Java编程思想第三版,共16章,每天一章,预计16天完成

    JAVA讲义(北京大学),共9章,每天一章,预计9天完成

    JDK(暂时没找到文档)

     

  • 5月19日学习计划

    2008-08-23 19:16:02

         模仿,我觉得若想去开始做一件从来未接触或没经验的事,可以通过模仿去熟悉,当累积到一定的经验,将可以通过自己的判断与经验去完成.计划要做得好,当然最主要的就是要坚持去完成;其次要设计得合理,书很多很多,知识点也很多很多,确定了自己的目标这样才可以很好地设计.

    格式:学习计划---学习日志

     

  • 第一章

    2007-05-19 16:31:58

          俗话说:好记性不如烂笔头.每年每月每天每时每分每秒,事情都在不断地变化.积累,有挑战!

数据统计

  • 访问量: 4851
  • 日志数: 11
  • 建立时间: 2007-05-19
  • 更新时间: 2007-06-09

RSS订阅

Open Toolbar