<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java堂</title>
	<atom:link href="http://www.javatang.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javatang.com</link>
	<description>Java Tang</description>
	<lastBuildDate>Tue, 27 Mar 2012 08:58:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CentOS安装之后的系统安全配置</title>
		<link>http://www.javatang.com/archives/2012/02/28/4601581.html</link>
		<comments>http://www.javatang.com/archives/2012/02/28/4601581.html#comments</comments>
		<pubDate>Tue, 28 Feb 2012 08:46:01 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[OS]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=581</guid>
		<description><![CDATA[本文以CentOS 5.4为例进行说明，对于5.x版本应该都是适用的，其他版本的话主要是命令的路径不同，思路是一致的。 第一步、账户安全管理 1. 修改密码长度 #vi /etc/login.defs PASS_MIN_LEN 18 2. 创建一个普通用户账号并设置密码，这样所有的操作都使用该普通账号进行 #useradd ru #passwd ru 3. Linux默认提供了很多账号，账号越多，系统就越容易受到攻击，所以应该禁止所有默认的被操作系统本身启动的并且不必要的账号。 可以使用 vi /etc/passwd 查看系统账号，使用 vi /etc/group 查看系统的用户组。 #userdel adm #userdel lp #userdel sync #userdel shutdown #userdel halt #userdel news #userdel uucp #userdel operator #userdel games #userdel gopher #userdel ftp &#160; #groupdel adm #groupdel lp #groupdel news #groupdel uucp [...]]]></description>
			<content:encoded><![CDATA[<p>本文以CentOS 5.4为例进行说明，对于5.x版本应该都是适用的，其他版本的话主要是命令的路径不同，思路是一致的。</p>
<p><strong>第一步、账户安全管理</strong><br />
1. 修改密码长度</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#vi /etc/login.defs</li>
<li>PASS_MIN_LEN 18</li></ol></div>
<p>2. 创建一个普通用户账号并设置密码，这样所有的操作都使用该普通账号进行</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#useradd ru</li>
<li>#passwd ru</li></ol></div>
<p>3. Linux默认提供了很多账号，账号越多，系统就越容易受到攻击，所以应该禁止所有默认的被操作系统本身启动的并且不必要的账号。<br />
可以使用 <em>vi /etc/passwd</em> 查看系统账号，使用 <em>vi /etc/group</em> 查看系统的用户组。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#userdel adm</li>
<li>#userdel lp</li>
<li>#userdel sync</li>
<li>#userdel shutdown</li>
<li>#userdel halt</li>
<li>#userdel news</li>
<li>#userdel uucp</li>
<li>#userdel operator</li>
<li>#userdel games</li>
<li>#userdel gopher</li>
<li>#userdel ftp </li>
<li>&nbsp;</li>
<li>#groupdel adm</li>
<li>#groupdel lp</li>
<li>#groupdel news</li>
<li>#groupdel uucp</li>
<li>#groupdel games</li>
<li>#groupdel dip</li>
<li>#groupdel pppusers</li></ol></div>
<p>4. 使用chattr命令将下面的文件加上不可更改属性，从而防止非授权用户获得权限。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#chattr +i /etc/passwd</li>
<li>#chattr +i /etc/shadow</li>
<li>#chattr +i /etc/group</li>
<li>#chattr +i /etc/gshadow</li></ol></div>
<p>这样操作之后也无法创建账号和修改密码，后面可以使用chattr -i命令恢复之后再进行操作。</p>
<p>5. 禁止Ctrl+Alt+Delete重启命令<br />
修改 /etc/inittab 文件，将下面一行注释掉</p>
<blockquote><p>
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
</p></blockquote>
<p>然后重新设置 /etc/rc.d/init.d/ 目录下所有文件的许可权限，仅root账号可以读、写和执行其中的所有脚本文件：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#chmod -R 700 /etc/rc.d/init.d/*</li></ol></div>
<p>6. 限制su命令<br />
限制只有特定用户组的用户才能使用su命令作为root权限，可以编辑 /etc/pam.d/su 文件，修改或增加下面的内容</p>
<blockquote><p>
# 这一行默认是有的<br />
auth sufficient pam_rootok.so<br />
# 确认wheel用户组是存在的<br />
auth required pam_wheel.so group=wheel
</p></blockquote>
<p>这样设置之后只有wheel用户组的用户可以使用su切换为root。如果系统用户ru能够su切换为root，可以运行如下命令：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#usermod -G10 ru</li></ol></div>
<p>这里注意，使用 <span style="color:red">su -</span> 命令可以切换为root用户并将root的环境变量信息进行切换，而 su 命令仅仅是切换角色但还是原来用户的环境变量。</p>
<p><strong>第二步、SSH安全配置</strong><br />
SSH作为系统登录的入口，其安全性好比城楼的城门，重要性不言而喻。<br />
首先查看系统中是否安装了SSH：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#chkconfig --list |grep sshd</li></ol></div>
<p>如果出现内容则说明安装了sshd服务，否则使用 <em>yum install ssh</em> 命令进行安装。</p>
<p>接下来先备份原来的配置文件</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak</li></ol></div>
<p>然后修改 /etc/ssh/sshd_config 文件：</p>
<blockquote><p>
# 修改SSH的端口，默认为22<br />
Port 5028<br />
# 将#protocol 2,1改为<br />
protocol 2<br />
# 不允许root用户直接登录<br />
PermitRootLogin no<br />
# 不允许空密码登录<br />
PermitEmptyPasswords no<br />
# 不适用DNS<br />
UseDns no
</p></blockquote>
<p>最后使用 <em>service sshd restart</em> 重启SSH服务</p>
<p><strong>第三步、关闭系统中不需要的服务和端口</strong><br />
1. 系统中少开一个服务就少一个危险，以下仅列出需要启动的服务，未列出的服务一律关闭，如果没有下面的服务则直接忽略：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#setup</li>
<li>acpid</li>
<li>anacron</li>
<li>cpuspeed</li>
<li>crond</li>
<li>iptables</li>
<li>irqbalance \\仅当服务器CPU为S.M.P架构或支持双核心、HT技术时，才需开启，否则关闭。</li>
<li>microcode_ctl</li>
<li>network</li>
<li>random</li>
<li>sendmail</li>
<li>sshd</li>
<li>syslog</li>
<li>yum-updatesd</li></ol></div>
<p>2. 使用iptables防火墙只打开指定的端口<br />
首先创建如下的sh文件：</p>
<div class="hl-title">&#19979;&#36733;: <a href="http://www.javatang.com/wp-content/plugins/coolcode/coolcode.php?p=581&amp;download=closeports.sh">closeports.sh</a></div><div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#!/bin/bash</li>
<li>iptables -F INPUT</li>
<li>iptables -P INPUT DROP</li>
<li># 打开80端口</li>
<li>/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT</li>
<li># 打开SSH端口，这一点很重要，否则无法使用SSH了，注意将5028修改为你的SSH端口</li>
<li>/sbin/iptables -A INPUT -p tcp --dport 5028 -j ACCEPT</li></ol></div>
<p>然后保存为closeports.sh文件，使用下面的命令执行该文件：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#chmod +x closeports.sh</li>
<li>#./closeports.sh</li></ol></div>
<p>详细的iptables配置信息存放在 <em>/etc/sysconfig/iptables</em> 文件中。</p>
<p><strong>第四步、防止攻击</strong><br />
1. 阻止ping<br />
将 /proc/sys/net/ipv4/icmp_echo_ignore_all 文件的内容修改为1，不过这样的话如果服务器重启之后就会恢复为0了。<br />
可以将下面的内容加入到 <em>/etc/rc.d/rc.local</em> 文件中：</p>
<blockquote><p>
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
</p></blockquote>
<p>2. 防止IP欺骗攻击<br />
编辑 /etc/host.conf 文件，在下面增加如下几行：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#vi /etc/host.conf</li>
<li>order bind，hosts</li>
<li>multi off</li>
<li>nospoof on</li></ol></div>
<p>3. 防止DoS攻击<br />
对系统所有的用户设置资源限制可以防止DoS类型攻击。如最大进程数和内存使用数量等。对 /etc/security/limits.conf 文件添加如下内容：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"># 禁止调试文件</li>
<li>* hard core 0</li>
<li># 限制内存使用为5MB</li>
<li>* hard rss 5000</li>
<li># 限制进程数为20</li>
<li>* hard nproc 20</li></ol></div>
<p>接下来必须编辑 /etc/pam.d/login 文件确认下面一行是否存在，如果不存在的话添加上：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">session required /lib/security/pam_limits.so</li></ol></div>
<p>对于DDos攻击可以使用<a href="http://deflate.medialayer.com/" target="_blank">DDoS deflate</a>脚本，详细介绍见下面的参考资料。</p>
<p><strong>第五步、系统配置及性能调优</strong><br />
1. 修改系统默认字符集<br />
如果使用英文安装系统之后，如果系统中有中文会显示乱码，这个时候需要修改系统默认的字符集：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#vi /etc/sysconfig/i18n</li>
<li>LANG=&quot;zh_CN.UTF-8&quot;</li>
<li>&nbsp;</li>
<li>#source /etc/sysconfig/i18n</li></ol></div>
<p>将系统的编码修改为zh_CN.UTF-8，后面一句命令是让修改立即生效。</p>
<p>2. 使用ntp服务更新服务器时间<br />
首先检查系统中是否安装了ntp服务：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#chkconfig --list |grep ntp</li></ol></div>
<p>如果没有安装的话使用yum进行安装并更新时间</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#yum install ntp</li>
<li>#ntpdate time.windows.com</li></ol></div>
<p>也可以将更新命令加入到cron中进行自动更新时间：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#crontab -e</li>
<li>* */12 * * * ntpdate time.windows.com</li>
<li>&nbsp;</li>
<li>#service crond restart</li></ol></div>
<p>以上操作是每隔12小时自动更新一次时间，可以通过 crontab -l 命令进行查看。</p>
<p>3. 加大服务器文件描述符<br />
当系统服务开启后，访问量变大，会使用到更多的文件描述符。使用 <em>ulimit –n</em> 命令显示当前的文件描述符数(需要使用 su &#8211; 命令切换到root账号)。可以使用如下方法加大文件描述符数：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#vi /etc/security/limits.conf</li>
<li>*&nbsp; &nbsp;-&nbsp; &nbsp;nofile&nbsp; 65536&nbsp; &nbsp;#在文本的最后一行添加</li></ol></div>
<p>重新登录之后，可以使用 ulimit –n 命令再次查看文件描述符会看的已经发生了变化。</p>
<p>4. 调整内核参数</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#cp /etc/sysctl.conf /etc/sysctl.conf.bak</li>
<li>#vi /etc/sysctl.conf</li>
<li>&nbsp;</li>
<li>net.ipv4.tcp_fin_timeout = 2</li>
<li>net.ipv4.tcp_tw_reuse = 1</li>
<li>net.ipv4.tcp_tw_recycle = 1</li>
<li>net.ipv4.tcp_syncookies = 1</li>
<li>net.ipv4.tcp_keepalive_time = 600</li>
<li>net.ipv4.ip_local_port_range = 4000&nbsp; &nbsp; 65000</li>
<li>net.ipv4.tcp_max_syn_backlog = 16384</li>
<li>net.ipv4.tcp_max_tw_buckets = 36000</li>
<li>net.ipv4.route.gc_timeout = 100</li>
<li>net.ipv4.tcp_syn_retries = 1</li>
<li>net.ipv4.tcp_synack_retries = 1</li>
<li>net.ipv4.ip_conntrack_max = 25000000</li>
<li>net.ipv4.netfilter.ip_conntrack_max=25000000</li>
<li>net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180</li>
<li>net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120</li>
<li>net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60</li>
<li>net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120</li></ol></div>
<p>最后，使用 sysctl –p 命令让上述设置立即生效。</p>
<p>参考资料：<br />
<a href="http://wenku.baidu.com/view/9399894d767f5acfa1c7cd96.html" target="_blank">centos 安全配置</a><br />
<a href="http://www.opsers.org/linux-home/base/centos.html" target="_blank">centos最小化安装系统后的基本调优及安全设置</a><br />
<a href="http://www.linuxsir.org/bbs/thread177551.html" target="_blank">简单的防火墙设置，只要求开放80端口！</a><br />
<a href="http://www.2cto.com/Article/201109/103089.html" target="_blank">利用iptables来配置linux禁止所有端口登陆和开放指定端口</a><br />
<a href="http://www.akii.org/linux-ban-ping-and-open-way.html" target="_blank">linux 禁ping和开启ping方法</a><br />
<a href="http://www.vpser.net/security/ddos-deflate.html" target="_blank">DDoS deflate &#8211; Linux下防御/减轻DDOS攻击</a><br />
<a href="http://blog.csdn.net/21aspnet/article/details/6826545" target="_blank">Linux的cron和crontab</a><br />
<a href="http://blog.csdn.net/radkitty/article/details/3009522" target="_blank">linux 内核参数调整说明</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/08/21/010658.html" rel="bookmark" class="crp_title">Resin 3.0.x 经验总结</a></li><li><a href="http://www.javatang.com/archives/2007/03/30/1025157.html" rel="bookmark" class="crp_title">Windows下安装zip包版本的MySQL</a></li><li><a href="http://www.javatang.com/archives/2007/10/30/2016233.html" rel="bookmark" class="crp_title">C++基础之字符串处理函数</a></li><li><a href="http://www.javatang.com/archives/2007/06/20/1513177.html" rel="bookmark" class="crp_title">Apache和Resin产生大容量日志的解决办法</a></li><li><a href="http://www.javatang.com/archives/2011/09/20/2831546.html" rel="bookmark" class="crp_title">Apache+Resin发布程序时一直出现403错误的解决办法</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2012/02/28/4601581.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows2003下简单预防DDos攻击的注册表设置</title>
		<link>http://www.javatang.com/archives/2012/02/24/3926570.html</link>
		<comments>http://www.javatang.com/archives/2012/02/24/3926570.html#comments</comments>
		<pubDate>Fri, 24 Feb 2012 03:39:26 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[OS]]></category>
		<category><![CDATA[Web&Server]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=570</guid>
		<description><![CDATA[DDos攻击无法从根本上防御，其基本思路就是拥有足够大的带宽来抵御，常用的方法有：DNS轮询，负载均衡等，也即用分布式的架构来抵御分布式的攻击。对于单个服务器来说，适当的对其进行调增也可以增强单台抗攻击的能力。 &#19979;&#36733;: antidos.regWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] ;启动SYN攻击保护 ================= ;缺省项值为0，表示不开启攻击保护，项值为1和2表示启动syn攻击保护，设成2之后安全级别更高。 ;对何种状况下认为是攻击，则需要根据下面的TcpMaxHalfOpen和TcpMaxHalfOpenRetried值设定的条件来触发启动了。 ;这里需要注意的是，NT4.0必须设为1，设为2后在某种特殊数据包下会导致系统重启。 &#34;SynAttackProtect&#34;=dword:00000002 ;同时允许打开的半连接数量 ;所谓半连接，表示未完整建立的TCP会话，用netstat命令可以看到呈SYN_RCVD状态的就是。 ;这里使用微软建议值，服务器设为100，高级服务器设为500。 TcpMaxHalfOpen=dword:00000064 ;判断是否存在攻击的触发点。这里使用微软建议值，服务器为80，高级服务器为400。 TcpMaxHalfOpenRetried=dword:00000050 ;设置等待SYN-ACK时间。缺省项值为3，缺省这一过程消耗时间45秒。 ;项值为2，消耗时间为21秒。项值为1，消耗时间为9秒。最低可以设为0，表示不等待，消耗时间为3秒。 ;这个值可以根据遭受攻击规模修改。微软站点安全推荐为2。 TcpMaxConnectResponseRetransmissions=dword:00000001 ;设置TCP重传单个数据段的次数。 ;缺省项值为5，缺省这一过程消耗时间240秒。微软站点安全推荐为3。 TcpMaxDataRetransmissions=dword:00000003 ;设置syn攻击保护的临界点。 ;当可用的backlog变为0时，此参数用于控制syn攻击保护的开启，微软站点安全推荐为5。 TCPMaxPortsExhausted=dword:00000005 &#160; ;网关相关设置 ================= ;关闭无效网关的检查。 ;当服务器设置了多个网关，这样在网络不通畅的时候系统会尝试连接第二个网关，通过关闭它可以优化网络。 EnableDeadGWDetect=dword:00000000 ;禁止响应ICMP重定向报文。此类报文有可能用以攻击，所以系统应该拒绝接受ICMP重定向报文。 EnableICMPRedirects=dword:00000000 ;不允许释放NETBIOS名。 ;当攻击者发出查询服务器NETBIOS名的请求时，可以使服务器禁止响应。注意系统必须安装SP2以上! NoNameReleaseOnDemand=dword:00000001 ;发送验证保持活动数据包。该选项决定TCP间隔多少时间来确定当前连接还处于连接状态 ;不设该值，则系统每隔2小时对TCP是否有闲置连接进行检查，这里设置时间为5分钟。 KeepAliveTime=dword:000493e0 ;禁止进行最大包长度路径检测。 ;该项值为1时，将自动检测出可以传输的数据包的大小，可以用来提高传输效率。 ;如出现故障或安全起见，设项值为0，表示使用固定MTU值576bytes。 EnablePMTUDiscovery=dword:00000000 ;禁止IP源路由。缺省项值为1，表示不转发源路由包。 ;项值设为0，表示全部转发，设置为2，表示丢弃所有接受的源路由包，微软站点安全推荐为2。 DisableIPSourceRouting=dword:0000002 ;限制处于TIME_WAIT状态的最长时间。 ;缺省为240秒，最低为30秒，最高为300秒。建议设为30秒。 TcpTimedWaitDelay=dword:0000001e &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>DDos攻击无法从根本上防御，其基本思路就是拥有足够大的带宽来抵御，常用的方法有：DNS轮询，负载均衡等，也即用分布式的架构来抵御分布式的攻击。对于单个服务器来说，适当的对其进行调增也可以增强单台抗攻击的能力。</p>
<div class="hl-title">&#19979;&#36733;: <a href="http://www.javatang.com/wp-content/plugins/coolcode/coolcode.php?p=570&amp;download=antidos.reg">antidos.reg</a></div><div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">Windows Registry Editor Version 5.00</li>
<li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]</li>
<li>;启动SYN攻击保护 =================</li>
<li>;缺省项值为0，表示不开启攻击保护，项值为1和2表示启动syn攻击保护，设成2之后安全级别更高。</li>
<li>;对何种状况下认为是攻击，则需要根据下面的TcpMaxHalfOpen和TcpMaxHalfOpenRetried值设定的条件来触发启动了。</li>
<li>;这里需要注意的是，NT4.0必须设为1，设为2后在某种特殊数据包下会导致系统重启。</li>
<li>&quot;SynAttackProtect&quot;=dword:00000002</li>
<li>;同时允许打开的半连接数量</li>
<li>;所谓半连接，表示未完整建立的TCP会话，用netstat命令可以看到呈SYN_RCVD状态的就是。</li>
<li>;这里使用微软建议值，服务器设为100，高级服务器设为500。</li>
<li>TcpMaxHalfOpen=dword:00000064</li>
<li>;判断是否存在攻击的触发点。这里使用微软建议值，服务器为80，高级服务器为400。</li>
<li>TcpMaxHalfOpenRetried=dword:00000050</li>
<li>;设置等待SYN-ACK时间。缺省项值为3，缺省这一过程消耗时间45秒。</li>
<li>;项值为2，消耗时间为21秒。项值为1，消耗时间为9秒。最低可以设为0，表示不等待，消耗时间为3秒。</li>
<li>;这个值可以根据遭受攻击规模修改。微软站点安全推荐为2。</li>
<li>TcpMaxConnectResponseRetransmissions=dword:00000001</li>
<li>;设置TCP重传单个数据段的次数。</li>
<li>;缺省项值为5，缺省这一过程消耗时间240秒。微软站点安全推荐为3。</li>
<li>TcpMaxDataRetransmissions=dword:00000003</li>
<li>;设置syn攻击保护的临界点。</li>
<li>;当可用的backlog变为0时，此参数用于控制syn攻击保护的开启，微软站点安全推荐为5。</li>
<li>TCPMaxPortsExhausted=dword:00000005</li>
<li>&nbsp;</li>
<li>;网关相关设置 =================</li>
<li>;关闭无效网关的检查。</li>
<li>;当服务器设置了多个网关，这样在网络不通畅的时候系统会尝试连接第二个网关，通过关闭它可以优化网络。</li>
<li>EnableDeadGWDetect=dword:00000000</li>
<li>;禁止响应ICMP重定向报文。此类报文有可能用以攻击，所以系统应该拒绝接受ICMP重定向报文。</li>
<li>EnableICMPRedirects=dword:00000000</li>
<li>;不允许释放NETBIOS名。</li>
<li>;当攻击者发出查询服务器NETBIOS名的请求时，可以使服务器禁止响应。注意系统必须安装SP2以上!</li>
<li>NoNameReleaseOnDemand=dword:00000001</li>
<li>;发送验证保持活动数据包。该选项决定TCP间隔多少时间来确定当前连接还处于连接状态</li>
<li>;不设该值，则系统每隔2小时对TCP是否有闲置连接进行检查，这里设置时间为5分钟。</li>
<li>KeepAliveTime=dword:000493e0</li>
<li>;禁止进行最大包长度路径检测。</li>
<li>;该项值为1时，将自动检测出可以传输的数据包的大小，可以用来提高传输效率。</li>
<li>;如出现故障或安全起见，设项值为0，表示使用固定MTU值576bytes。</li>
<li>EnablePMTUDiscovery=dword:00000000</li>
<li>;禁止IP源路由。缺省项值为1，表示不转发源路由包。</li>
<li>;项值设为0，表示全部转发，设置为2，表示丢弃所有接受的源路由包，微软站点安全推荐为2。</li>
<li>DisableIPSourceRouting=dword:0000002</li>
<li>;限制处于TIME_WAIT状态的最长时间。</li>
<li>;缺省为240秒，最低为30秒，最高为300秒。建议设为30秒。</li>
<li>TcpTimedWaitDelay=dword:0000001e</li>
<li>&nbsp;</li>
<li>;NetBT相关设置 =================</li>
<li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters]</li>
<li>;增大NetBT的连接块增加幅度。</li>
<li>;缺省为3，范围1-20，数值越大在连接越多时提升性能。每个连接块消耗87个字节。</li>
<li>BacklogIncrement=dword:00000003</li>
<li>;最大NetBT的连接快的数目。</li>
<li>;范围1-40000，这里设置为1000，数值越大在连接越多时允许更多连接。</li>
<li>MaxConnBackLog=dword:000003e8</li>
<li>&nbsp;</li>
<li>;Backlog相关设置 =================</li>
<li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Afd\Parameters]</li>
<li>;配置激活动态Backlog。对于网络繁忙或者易遭受SYN攻击的系统，建议设置为1，表示允许动态Backlog。</li>
<li>EnableDynamicBacklog=dword:00000001</li>
<li>;配置最小动态Backlog。默认项值为0，表示动态Backlog分配的自由连接的最小数目。</li>
<li>;当自由连接数目低于此数目时，将自动的分配自由连接。默认值为0，对于网络繁忙或者易遭受SYN攻击的系统，建议设置为20。</li>
<li>MinimumDynamicBacklog=dword:00000014</li>
<li>;最大动态Backlog。表示定义最大准连接的数目，主要看内存大小</li>
<li>;理论每32M内存最大可以增加5000个，这里设为20000。</li>
<li>MaximumDynamicBacklog=dword:00002e20</li>
<li>;每次增加的自由连接数据。默认项值为5，表示定义每次增加的自由连接数目。</li>
<li>;对于网络繁忙或者易遭受SYN攻击的系统，建议设置为10。</li>
<li>DynamicBacklogGrowthDelta=dword:0000000a</li></ol></div>
<p>以下部分需要根据实际情况手动修改，<strong>请不要直接执行下面的reg文件</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">Windows Registry Editor Version 5.00</li>
<li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]</li>
<li>;启用网卡上的安全过滤</li>
<li>EnableSecurityFilters=dword:00000001</li>
<li>;同时打开的TCP连接数，这里可以根据情况进行控制。</li>
<li>&quot;TcpNumConnections&quot;=dword:000f4240</li>
<li>;该参数控制 TCP 报头表的大小限制。在有大量 RAM 的机器上，增加该设置可以提高 SYN 攻击期间的响应性能。</li>
<li>TcpMaxSendFree=</li>
<li>&nbsp;</li>
<li>;下面注意换成自己的网卡接口，查看哪个是当前使用的接口，一般通过配置的IP就知道了。</li>
<li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{修改成自己的网卡接口}]</li>
<li>;禁止路由发现功能。ICMP路由通告报文可以被用来增加路由表纪录，可以导致攻击，所以禁止路由发现。</li>
<li>&quot;PerformRouterDiscovery&quot;=dword:00000000</li></ol></div>
<p>当然，最好的情况下还是使用Linux系统，这样除了系统自身的因素因为，可以选择的方案也比较多。有一篇文章也可以参考下：<a href="http://www.80sec.com/ddos-attack-defend.html" target="_blank">http://www.80sec.com/ddos-attack-defend.html</a></p>
<p>参考资料：</p>
<p><a href="http://support.microsoft.com/kb/324270/zh-cn" target="_blank">如何在 Windows Server 2003 中加固 TCP/IP 堆栈以抵御拒绝服务攻击</a><br />
<a href="http://blog.asheng.net/archives/318" target="_blank">windows2003防DDOS攻击设置-修改注册表</a><br />
<a href="http://www.weidun.com.cn/support/tech/49.htm" target="_blank">强化TCP/IP 堆栈安全</a><br />
<a href="http://www.bingdun.com/solution/website.htm" target="_blank">Web网站服务器DDOS安全解决方案</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/06/18/204746.html" rel="bookmark" class="crp_title">安装SQL Server2005遇到的几个问题</a></li><li><a href="http://www.javatang.com/archives/2007/09/29/2003203.html" rel="bookmark" class="crp_title">环境变量中的Os2LibPath是什么？</a></li><li><a href="http://www.javatang.com/archives/2008/01/07/1628256.html" rel="bookmark" class="crp_title">让IIS支持中文文件名和目录</a></li><li><a href="http://www.javatang.com/archives/2006/06/24/414447.html" rel="bookmark" class="crp_title">光驱无法使用（错误代码 31）的解决办法</a></li><li><a href="http://www.javatang.com/archives/2006/04/07/194214.html" rel="bookmark" class="crp_title">SQLServer2000的”以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2012/02/24/3926570.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL中更新与子查询条件中同一个表中的字段数据</title>
		<link>http://www.javatang.com/archives/2011/12/08/2906565.html</link>
		<comments>http://www.javatang.com/archives/2011/12/08/2906565.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 08:29:06 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=565</guid>
		<description><![CDATA[在MySQL中使用update语句的时候，Where条件或者值都可以使用子查询，比如： UPDATE table_a SET name=(SELECT name FROM table_b WHERE id=1)&#160; WHERE&#160;id IN (SELECT id FROM table_c WHERE age &#62; 24); 但是如果子查询和更新的表是同一个表的话，MySQL会报如下的错误： Error Code : 1093 You can&#8217;t specify target table &#8216;table_a&#8217; for update in FROM clause 这种情况下就需要使用MySQL的临时表做一个中转，代码如下： -- 将查询的结果写入到临时表中 CREATE&#160;TEMPORARY TABLE tmp_table (SELECT * FROM table_a WHERE NAME='Tom'); UPDATE&#160;table_a SET parentId=(SELECT id FROM tmp_table WHERE [...]]]></description>
			<content:encoded><![CDATA[<p>在MySQL中使用update语句的时候，Where条件或者值都可以使用子查询，比如：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">UPDATE</span><span style="color: Gray;"> </span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">SET</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_b</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">WHERE</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">IN</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_c</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">age</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">24</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>但是如果子查询和更新的表是同一个表的话，MySQL会报如下的错误：</p>
<blockquote><p>
Error Code : 1093<br />
You can&#8217;t specify target table &#8216;table_a&#8217; for update in FROM clause
</p></blockquote>
<p>这种情况下就需要使用MySQL的临时表做一个中转，代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">-- 将查询的结果写入到临时表中</span></li>
<li><span style="color: Green;">CREATE</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">TEMPORARY</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> * </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: #00008b;">NAME</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">Tom</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">UPDATE</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">SET</span><span style="color: Gray;"> </span><span style="color: Blue;">parentId</span><span style="color: Gray;">=</span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: #00008b;">NAME</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">Tom</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;">-- 删除临时表</span></li>
<li><span style="color: Green;">DROP</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;">;</span></li></ol></div>
<p>参考资料：<br />
<a href="http://www.cnblogs.com/RoadGY/archive/2011/07/22/2114088.html" target="_blank">语法：MySQL中INSERT INTO SELECT的使用</a><br />
<a href="http://bbs.chinaunix.net/thread-1787620-1-1.html" target="_blank">MySQL中的临时表使用方法</a><br />
<a href="http://www.cnblogs.com/plusium/archive/2010/03/01/1675984.html" target="_blank">关于mysql的 SELECT &#8230; INTO 语法</a><br />
<a href="http://blog.csdn.net/besily/article/details/3194286" target="_blank">MySQL select into 和 SQL select into</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/07/23/342351.html" rel="bookmark" class="crp_title">SQL Server中删除重复数据最快的方法</a></li><li><a href="http://www.javatang.com/archives/2008/03/13/5500263.html" rel="bookmark" class="crp_title">Discuz!一次误删会员用户组的恢复</a></li><li><a href="http://www.javatang.com/archives/2006/09/23/542969.html" rel="bookmark" class="crp_title">PHPWind中出现 “Update Error: INSERT LOW_PRIORITY INTO pw_tmsgs ”问题的解决</a></li><li><a href="http://www.javatang.com/archives/2006/06/13/242443.html" rel="bookmark" class="crp_title">Oracle中的”值和null以及java中的null区别</a></li><li><a href="http://www.javatang.com/archives/2006/05/07/002930.html" rel="bookmark" class="crp_title">SQL Server JDBC 1.0中提高Select的效率</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/12/08/2906565.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext中设置Ajax超时时间</title>
		<link>http://www.javatang.com/archives/2011/10/18/1847563.html</link>
		<comments>http://www.javatang.com/archives/2011/10/18/1847563.html#comments</comments>
		<pubDate>Tue, 18 Oct 2011 12:18:47 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[DynamicLanguage]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=563</guid>
		<description><![CDATA[在Ext中无论是在Grid、Combox中使用Store加载数据，还是直接使用Ajax发送请求，其超时时间均可以统一使用如下代码进行设置： // 超时时间，单位毫秒 Ext.Ajax.timeout = 5 * 60 * 1000; 注意，单位是毫秒。 不过以前不知道是因为在哪里搜索的结果，还是Ext 2.x版本中的问题，使用了Ext.lib.Ajax.timeout = 5 * 60 * 1000;的方式进行设置，但是这种方式是无效的。 Ext的版本是3.2.1. Related Posts:Apache和Resin组合时间歇性出现503错误的解决方法DWR文档之DWR总览最流行的 Ajax/Java 框架Discuz!一次误删会员用户组的恢复DWR文档之 网络上的资料]]></description>
			<content:encoded><![CDATA[<p>在Ext中无论是在Grid、Combox中使用Store加载数据，还是直接使用Ajax发送请求，其超时时间均可以统一使用如下代码进行设置：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">// 超时时间，单位毫秒</span></li>
<li><span style="color: Blue;">Ext</span><span style="color: Gray;">.</span><span style="color: Blue;">Ajax</span><span style="color: Gray;">.</span><span style="color: Blue;">timeout</span><span style="color: Gray;"> = </span><span style="color: Maroon;">5</span><span style="color: Gray;"> * </span><span style="color: Maroon;">60</span><span style="color: Gray;"> * </span><span style="color: Maroon;">1000</span><span style="color: Gray;">;</span></li></ol></div>
<p>注意，单位是毫秒。</p>
<p>不过以前不知道是因为在哪里搜索的结果，还是Ext 2.x版本中的问题，使用了Ext.lib.Ajax.timeout = 5 * 60 * 1000;的方式进行设置，但是这种方式是无效的。</p>
<p>Ext的版本是3.2.1.</p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2010/11/13/1228487.html" rel="bookmark" class="crp_title">Apache和Resin组合时间歇性出现503错误的解决方法</a></li><li><a href="http://www.javatang.com/archives/2006/10/19/301977.html" rel="bookmark" class="crp_title">DWR文档之DWR总览</a></li><li><a href="http://www.javatang.com/archives/2006/10/20/230978.html" rel="bookmark" class="crp_title">最流行的 Ajax/Java 框架</a></li><li><a href="http://www.javatang.com/archives/2008/03/13/5500263.html" rel="bookmark" class="crp_title">Discuz!一次误删会员用户组的恢复</a></li><li><a href="http://www.javatang.com/archives/2006/10/24/424782.html" rel="bookmark" class="crp_title">DWR文档之 网络上的资料</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/10/18/1847563.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache+Resin发布程序时一直出现403错误的解决办法</title>
		<link>http://www.javatang.com/archives/2011/09/20/2831546.html</link>
		<comments>http://www.javatang.com/archives/2011/09/20/2831546.html#comments</comments>
		<pubDate>Tue, 20 Sep 2011 15:28:31 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Web&Server]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=546</guid>
		<description><![CDATA[今天在Linux下面把Apach和Resin整合之后，程序发布的时候总是出现403错误。首先检查了一下Apache和Resin的配置文件，新建一个webapp显示解析成功，这样证明二者整合是正确的；另外还有一个现象，就是同样的程序在Windows下也是使用Apache和Resin进行整合的，但是运行正常，这样就排除了程序自身的问题。 因为页面总是显示403错误，又想到Windows和Linux下面最大的区别就是对文件权限的设置，于是使用 ls -l 命令查看了目录的权限，果然发现目录的权限只是 drwx&#8212;&#8212;，应该设置为 drwxr-xr-x，于是使用 chmod -R 755 directory 其中-R参数用于使设定的权限用于该目录及子目录下所有文件和目录。 另外再复习一下权限的基础知识： “rwx”表示 4(r)+2(w)+1(x)=7 “rw-”表示 {4(r)+2(w)+0(-)=6 参考资料： linux修改文件夹-文件目录权限 Related Posts:Apache+Resin下如何写伪静态和301跳转Resin 3.0.x 经验总结Apache和Resin产生大容量日志的解决办法Apache+Resin泛域名的设置解决Apache出现的CPU高占用率的问题]]></description>
			<content:encoded><![CDATA[<p>今天在Linux下面把<a href="http://www.javatang.com/index.php?s=apache+resin">Apach和Resin整合</a>之后，程序发布的时候总是出现403错误。首先检查了一下Apache和Resin的配置文件，新建一个webapp显示解析成功，这样证明二者整合是正确的；另外还有一个现象，就是同样的程序在Windows下也是使用Apache和Resin进行整合的，但是运行正常，这样就排除了程序自身的问题。</p>
<p>因为页面总是显示403错误，又想到Windows和Linux下面最大的区别就是对文件权限的设置，于是使用 <strong>ls -l</strong> 命令查看了目录的权限，果然发现目录的权限只是 drwx&#8212;&#8212;，应该设置为 drwxr-xr-x，于是使用</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">chmod -R 755 directory</li></ol></div>
<p>其中-R参数用于使设定的权限用于该目录及子目录下所有文件和目录。</p>
<p>另外再复习一下权限的基础知识：</p>
<blockquote><p>
“rwx”表示 4(r)+2(w)+1(x)=7<br />
“rw-”表示 {4(r)+2(w)+0(-)=6
</p></blockquote>
<p>参考资料：<br />
<a href="http://blog.ixm.me/archives/320.html" target="_blank">linux修改文件夹-文件目录权限</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2008/10/18/1942276.html" rel="bookmark" class="crp_title">Apache+Resin下如何写伪静态和301跳转</a></li><li><a href="http://www.javatang.com/archives/2006/08/21/010658.html" rel="bookmark" class="crp_title">Resin 3.0.x 经验总结</a></li><li><a href="http://www.javatang.com/archives/2007/06/20/1513177.html" rel="bookmark" class="crp_title">Apache和Resin产生大容量日志的解决办法</a></li><li><a href="http://www.javatang.com/archives/2008/03/18/2532264.html" rel="bookmark" class="crp_title">Apache+Resin泛域名的设置</a></li><li><a href="http://www.javatang.com/archives/2008/01/22/0615259.html" rel="bookmark" class="crp_title">解决Apache出现的CPU高占用率的问题</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/09/20/2831546.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决Google浏览器自动更新后一直提示重启浏览器的问题</title>
		<link>http://www.javatang.com/archives/2011/01/14/3017542.html</link>
		<comments>http://www.javatang.com/archives/2011/01/14/3017542.html#comments</comments>
		<pubDate>Fri, 14 Jan 2011 08:30:17 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[chrome]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=542</guid>
		<description><![CDATA[在Google浏览器中的“关于”窗口中可以自动更新浏览器，但是有时候使用自动更新完成后，会提示： Restart google chrome to finish updating 点击“Restart Now”按钮之后再打开“关于”对话框之后还是有上面的提示，反反复复总是这样，更新失败，但是也没有办法再更新。后来Google找到了解决的方法： 首先打开Google浏览器，然后进入浏览器的安装目录（可以右键快捷方式，选择属性，然后再点击“查找目标”按钮），接下来将chrome.exe修改一个其他的名称，比如chrome-old.exe，最后关掉浏览器再打开，就不会有上面的问题了。 参考资料： Issue 58256: Dev cannot update Related Posts:离线版Google Chrome Frame下载GOOGLE服务列表彻底修改Google Chrome浏览器的安装目录Google发布“网站导航”Lucene创建索引时出现的segments或deletable拒绝访问异常的原因]]></description>
			<content:encoded><![CDATA[<p>在Google浏览器中的“关于”窗口中可以自动更新浏览器，但是有时候使用自动更新完成后，会提示：</p>
<blockquote><p>
Restart google chrome to finish updating
</p></blockquote>
<p>点击“Restart Now”按钮之后再打开“关于”对话框之后还是有上面的提示，反反复复总是这样，更新失败，但是也没有办法再更新。后来Google找到了解决的方法：</p>
<p>首先打开Google浏览器，然后进入浏览器的安装目录（可以右键快捷方式，选择属性，然后再点击“查找目标”按钮），接下来将chrome.exe修改一个其他的名称，比如chrome-old.exe，最后关掉浏览器再打开，就不会有上面的问题了。</p>
<p>参考资料：<br />
<a href="http://code.google.com/p/chromium/issues/detail?id=58256#c11" target="_blank">Issue 58256:	Dev cannot update</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2010/01/19/4754372.html" rel="bookmark" class="crp_title">离线版Google Chrome Frame下载</a></li><li><a href="http://www.javatang.com/archives/2006/09/18/365065.html" rel="bookmark" class="crp_title">GOOGLE服务列表</a></li><li><a href="http://www.javatang.com/archives/2010/07/11/4201420.html" rel="bookmark" class="crp_title">彻底修改Google Chrome浏览器的安装目录</a></li><li><a href="http://www.javatang.com/archives/2007/03/12/5833125.html" rel="bookmark" class="crp_title">Google发布“网站导航”</a></li><li><a href="http://www.javatang.com/archives/2007/06/14/5433176.html" rel="bookmark" class="crp_title">Lucene创建索引时出现的segments或deletable拒绝访问异常的原因</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/01/14/3017542.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2.x中设置gzip</title>
		<link>http://www.javatang.com/archives/2010/12/01/2805477.html</link>
		<comments>http://www.javatang.com/archives/2010/12/01/2805477.html#comments</comments>
		<pubDate>Wed, 01 Dec 2010 05:28:05 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Web&Server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[gzip]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=477</guid>
		<description><![CDATA[在Apache2.x中使用mod_deflate进行gzip压缩，配置信息如下： LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so &#160; # gzip 设置 # Only compress specified content type # see also http://www.devside.net/guides/config/compression &#60;IfModule mod_deflate.c&#62; &#160;&#160; &#160;# The value must between 1 (less compression) and 9 (more compression) &#160;&#160; &#160;DeflateCompressionLevel 7 &#160;&#160; &#160;# compress content with type html, text, and css &#160;&#160; &#160;AddOutputFilterByType DEFLATE text/html text/plain text/xml [...]]]></description>
			<content:encoded><![CDATA[<p>在Apache2.x中使用mod_deflate进行gzip压缩，配置信息如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">LoadModule deflate_module modules/mod_deflate.so</li>
<li>LoadModule headers_module modules/mod_headers.so</li>
<li>&nbsp;</li>
<li># gzip 设置</li>
<li># Only compress specified content type</li>
<li># see also http://www.devside.net/guides/config/compression</li>
<li>&lt;IfModule mod_deflate.c&gt;</li>
<li>&nbsp;&nbsp; &nbsp;# The value must between 1 (less compression) and 9 (more compression)</li>
<li>&nbsp;&nbsp; &nbsp;DeflateCompressionLevel 7</li>
<li>&nbsp;&nbsp; &nbsp;# compress content with type html, text, and css</li>
<li>&nbsp;&nbsp; &nbsp;AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/json</li>
<li>&nbsp;&nbsp; &nbsp;# place filter 'DEFLATE' on all outgoing content</li>
<li>&nbsp;&nbsp; &nbsp;SetOutputFilter DEFLATE</li>
<li>&nbsp;&nbsp; &nbsp;# Properly handle old browsers that do not support compression</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch ^Mozilla/4 gzip-only-text/html</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch ^Mozilla/4\.0[678] no-gzip</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</li>
<li>&lt;/IfModule&gt;</li></ol></div>
<p>参考资料：<br />
<a href="http://jackyrong.javaeye.com/blog/797656" target="_blank">apache 2.2.15中配置mod_deflate</a><br />
<a href="http://www.devside.net/guides/config/compression" target="_blank">httpd.conf &#8212; compression</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/03/10/3018122.html" rel="bookmark" class="crp_title">使Apache实现gzip压缩</a></li><li><a href="http://www.javatang.com/archives/2007/11/11/5611239.html" rel="bookmark" class="crp_title">两个PHP的Warning及解决方法</a></li><li><a href="http://www.javatang.com/archives/2008/04/20/5034268.html" rel="bookmark" class="crp_title">Javascript的国际化方案</a></li><li><a href="http://www.javatang.com/archives/2007/10/06/5104204.html" rel="bookmark" class="crp_title">Javascript怎样设置文本框的readonly属性？</a></li><li><a href="http://www.javatang.com/archives/2010/03/21/1529393.html" rel="bookmark" class="crp_title">ExtJS hack: Add multiple toolbars to a Panel</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/12/01/2805477.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JRebel运行缓慢或提示内存不足的解决方法</title>
		<link>http://www.javatang.com/archives/2010/11/29/3337530.html</link>
		<comments>http://www.javatang.com/archives/2010/11/29/3337530.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 09:33:37 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[jrebel]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=530</guid>
		<description><![CDATA[JRebel是一个Java类热启动的工具，使Java开发（特别是Web开发）可以实现像PHP开发那样即时刷新的效果，这样再也不用修改java文件之后频繁的去重启Web Server了，用起来非常的顺手。 最近JRebel好像更新也非常频繁，8月份刚发布3.0版本，11月份就发布了3.5版本，而且这个新版本用下来非常给力，针对了spring增加了许多扩展（默认是打开的），比如可以实时更新所有Spring的配置文件等等，手痒痒的同学可以下载下来试试。BTW，我用的是正式版，:) 安装的方法也非常简单，就在vm后面增加一个-noverify 参数： -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar 当然还是记得将上面的路径修改成你自己本机JRebl的存放路径。 上面的都不是本文的重点，这里需要说一下的就是，或许3.5版本增加的功能特性太多的缘故（特别是针对Spring），刚开始启动的时候速度非常的慢，开始的时候我怀疑是spring插件的问题，于是使用 -Djrebel.spring_plugin=false将spring插件关闭了，之后启动的速度可以接受了，但是运行程序的时候速度非常非常的慢，点一个按钮要等半天。如果不使用JRebel的话程序运行正常，所以排除了程序本身的问题。 刚开始一直在怀疑是不是新版本的问题，因为用2.x和3.0的时候都很正常，所以在这方面查了很多资料，都没有发现好的解决办法。后来，无意中发现程序出现了“java.lang.OutOfMemoryError: PermGen space”的错误，突然才想到是否是给JRebel分配的内存太小了，于是使用下面的参数增加了内存： -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m 然后在运行的时候发现速度是非一般的快啊，使用JRebel的spring插件之后启动速度也非常的块了，看来就是这个问题，后来在JRebel官方上的Q&#038;A上面也得到了印证。 需要说明一点的是，如果上面的参数无法启动，需要将内存数设置小一些；还有，增加Eclipse的内存对JRebl是没有任何效果的，虽然现在想起来和可笑，但是当时在这个方面也浪费了不少时间。BTW，Eclipse3.3+内置了一个内存查看的工具，可以在“Windows”-”Preferences”中，选择左边的”General”，然后选择右边的”Show heap status”。 参考资料： I’m getting Java.lang.OutOfMemoryError: PermGen space!?? Javarebel启动程序java.lang.OutOfMemoryError: PermGen space问题的解决 Related Posts:Java 中“Error occurred during initialization of VM”错误的解决方法Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题由MyEclipse内存不足谈谈JVM内存客户真正的需求原来是这样的修改Spark的默认字体大小]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.javatang.com/wp-content/i_jrebel_logo.png" alt="" title="i_jrebel_logo" width="229" height="96" class="aligncenter size-full wp-image-533" /><br />
<a href="http://www.zeroturnaround.com/jrebel/" target="_blank">JRebel</a>是一个Java类热启动的工具，使Java开发（特别是Web开发）可以实现像PHP开发那样即时刷新的效果，这样再也不用修改java文件之后频繁的去重启Web Server了，用起来非常的顺手。</p>
<p>最近JRebel好像更新也非常频繁，8月份刚发布3.0版本，11月份就发布了3.5版本，而且这个新版本用下来非常给力，针对了spring增加了许多扩展（默认是打开的），比如可以实时更新所有Spring的配置文件等等，手痒痒的同学可以下载下来试试。BTW，我用的是正式版，:)</p>
<p>安装的方法也非常简单，就在vm后面增加一个-noverify 参数：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">-noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar</li></ol></div>
<p>当然还是记得将上面的路径修改成你自己本机JRebl的存放路径。</p>
<p>上面的都不是本文的重点，这里需要说一下的就是，或许3.5版本增加的功能特性太多的缘故（特别是针对Spring），刚开始启动的时候速度非常的慢，开始的时候我怀疑是spring插件的问题，于是使用 -Djrebel.spring_plugin=false将spring插件关闭了，之后启动的速度可以接受了，但是运行程序的时候速度非常非常的慢，点一个按钮要等半天。如果不使用JRebel的话程序运行正常，所以排除了程序本身的问题。</p>
<p>刚开始一直在怀疑是不是新版本的问题，因为用2.x和3.0的时候都很正常，所以在这方面查了很多资料，都没有发现好的解决办法。后来，无意中发现程序出现了“java.lang.OutOfMemoryError: PermGen space”的错误，突然才想到是否是给JRebel分配的内存太小了，于是使用下面的参数增加了内存：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">-noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m</li></ol></div>
<p>然后在运行的时候发现速度是非一般的快啊，使用JRebel的spring插件之后启动速度也非常的块了，看来就是这个问题，后来在JRebel官方上的Q&#038;A上面也得到了印证。</p>
<p>需要说明一点的是，如果上面的参数无法启动，需要将内存数设置小一些；还有，增加Eclipse的内存对JRebl是没有任何效果的，虽然现在想起来和可笑，但是当时在这个方面也浪费了不少时间。BTW，Eclipse3.3+内置了一个内存查看的工具，可以在“Windows”-”Preferences”中，选择左边的”General”，然后选择右边的”Show heap status”。</p>
<p>参考资料：<br />
<a href="http://www.zeroturnaround.com/jrebel/faq/#Im_getting_Java.lang.OutOfMemoryError:" target="_blank">I’m getting Java.lang.OutOfMemoryError: PermGen space!??</a><br />
<a href="http://lonelythinker.javaeye.com/blog/480131" target="_blank">Javarebel启动程序java.lang.OutOfMemoryError: PermGen space问题的解决</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/08/11/170654.html" rel="bookmark" class="crp_title">Java 中“Error occurred during initialization of VM”错误的解决方法</a></li><li><a href="http://www.javatang.com/archives/2010/11/27/1657519.html" rel="bookmark" class="crp_title">Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题</a></li><li><a href="http://www.javatang.com/archives/2007/12/03/1653250.html" rel="bookmark" class="crp_title">由MyEclipse内存不足谈谈JVM内存</a></li><li><a href="http://www.javatang.com/archives/2010/07/07/2157401.html" rel="bookmark" class="crp_title">客户真正的需求原来是这样的</a></li><li><a href="http://www.javatang.com/archives/2008/07/13/5634273.html" rel="bookmark" class="crp_title">修改Spark的默认字体大小</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/29/3337530.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题</title>
		<link>http://www.javatang.com/archives/2010/11/27/1657519.html</link>
		<comments>http://www.javatang.com/archives/2010/11/27/1657519.html#comments</comments>
		<pubDate>Sat, 27 Nov 2010 04:16:57 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[OS]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=519</guid>
		<description><![CDATA[Macbuntu是一个可以将Ubuntu修改为Mac风格的集合包，使用shell指令进行安装，其模拟到效果非常逼真和实用，效果图如上，官方网站为：http://sourceforge.net/projects/macbuntu/。 首先介绍一下安装步骤： 1. 在Macbuntu官方网站http://sourceforge.net/projects/macbuntu/上下载最新到集成包文件，目前到版本为10.10，即支持Ubuntu10.10版本，下载下来到文件为Macbuntu-10.10.tar.gz。 2. 定位到上述文件到目录，然后输入下面命令进行安装： tar zxvf Macbuntu-10.10.tar.gz sudo ./Macbuntu-10.10/install.sh 接下来就按照提示进行选择安装即可，全程都是自动的，安装完成之后需要重启。 上面是安装到步骤，下面再说几个安装之后遇到问题到程序： OpenOffice 安装Macbuntu之后发现OpenOffice打开之后，菜单和对话框中到文字都不能正常显示，如下图所示 解决的方法是：在“系统”-“首选项”-“外观”，选择“字体”标签，然后将“应用程序字体”设置为“文泉驿等宽微米黑“。 Eclipse 因为Mac中是将每个应用程序到菜单都集成到最上面到菜单栏中到，但是对于有些应用程序来说，Macbuntu没有很好的进行处理，其中Eclipse就是一个例子。这个时候打开Eclipse之后发现菜单项不见来，而最上面到菜单栏中只有一个File-Exit项。解决的方式就是创建一个shell脚本，命名为eclipse.sh，内容如下： #!/bin/bash export UBUNTU_MENUPROXY=0 PATH=/usr/lib/java/jdk1.6.0_22/bin:/usr/lib/java/jdk1.6.0_22/jre/bin ~/Development/eclipse-java-helios-SR1-linux-gtk/eclipse/eclipse 记住将中间到java和eclipse路径修改为你自己到路径，然后再执行下面到命令： chmod u+x eclipse.sh sudo ./eclipse.sh 这个时候你会发现Eclipse到菜单栏又出现了，你可以将这个eclipse.sh文件放在桌面上，然后直接双击选择“运行”即可。 参考资料： Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格 求教：openoffice菜单不能显示汉字 Eclipse menubar not appearing in Ubuntu 10.10 Related Posts:查找接口实现类的Eclipse插件在Eclipse WTP中加入Resin server adapterm2eclipse插件使用中提示jar包找不到的解决方法客户真正的需求原来是这样的非常棒的JS的Eclipse插件 &#8211; JSEclipse]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.javatang.com/wp-content/zrtn_001n4277513e_tn.jpg" alt="" title="zrtn_001n4277513e_tn" width="500" height="312" class="aligncenter size-full wp-image-520" /></p>
<p><a href="http://sourceforge.net/projects/macbuntu/" target="_blank">Macbuntu</a>是一个可以将Ubuntu修改为Mac风格的集合包，使用shell指令进行安装，其模拟到效果非常逼真和实用，效果图如上，官方网站为：<a href="http://sourceforge.net/projects/macbuntu/" target="_blank">http://sourceforge.net/projects/macbuntu/</a>。</p>
<p>首先介绍一下安装步骤：<br />
1. 在Macbuntu官方网站<a href="http://sourceforge.net/projects/macbuntu/" target="_blank">http://sourceforge.net/projects/macbuntu/</a>上下载最新到集成包文件，目前到版本为10.10，即支持Ubuntu10.10版本，下载下来到文件为Macbuntu-10.10.tar.gz。<br />
2. 定位到上述文件到目录，然后输入下面命令进行安装：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">tar zxvf Macbuntu-10.10.tar.gz</li>
<li>sudo ./Macbuntu-10.10/install.sh</li></ol></div>
<p>接下来就按照提示进行选择安装即可，全程都是自动的，安装完成之后需要重启。</p>
<p>上面是安装到步骤，下面再说几个安装之后遇到问题到程序：<br />
<strong>OpenOffice</strong></p>
<p>安装Macbuntu之后发现OpenOffice打开之后，菜单和对话框中到文字都不能正常显示，如下图所示<br />
<a href="http://www.javatang.com/wp-content/Screenshot.jpeg" target="_blank"><img src="http://www.javatang.com/wp-content/Screenshot.jpeg" alt="" title="Screenshot" width="640" height="400" class="aligncenter size-full wp-image-524" /></a></p>
<p>解决的方法是：在“系统”-“首选项”-“外观”，选择“字体”标签，然后将“应用程序字体”设置为“文泉驿等宽微米黑“。</p>
<p><strong>Eclipse</strong><br />
因为Mac中是将每个应用程序到菜单都集成到最上面到菜单栏中到，但是对于有些应用程序来说，Macbuntu没有很好的进行处理，其中Eclipse就是一个例子。这个时候打开Eclipse之后发现菜单项不见来，而最上面到菜单栏中只有一个File-Exit项。解决的方式就是创建一个shell脚本，命名为eclipse.sh，内容如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#!/bin/bash</li>
<li>export UBUNTU_MENUPROXY=0</li>
<li>PATH=/usr/lib/java/jdk1.6.0_22/bin:/usr/lib/java/jdk1.6.0_22/jre/bin</li>
<li>~/Development/eclipse-java-helios-SR1-linux-gtk/eclipse/eclipse</li></ol></div>
<p>记住将中间到java和eclipse路径修改为你自己到路径，然后再执行下面到命令：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">chmod u+x eclipse.sh</li>
<li>sudo ./eclipse.sh</li></ol></div>
<p>这个时候你会发现Eclipse到菜单栏又出现了，你可以将这个eclipse.sh文件放在桌面上，然后直接双击选择“运行”即可。</p>
<p>参考资料：<br />
<a href="http://wowubuntu.com/macubuntu.html" target="_blank">Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格</a><br />
<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=48&#038;t=299379&#038;start=0" target="_blank">求教：openoffice菜单不能显示汉字</a><br />
<a href="http://gnome-look.org/content/show.php?action=knowledgebase&#038;content=129021&#038;kbid=496" target="_blank">Eclipse menubar not appearing in Ubuntu 10.10</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/07/04/4045184.html" rel="bookmark" class="crp_title">查找接口实现类的Eclipse插件</a></li><li><a href="http://www.javatang.com/archives/2009/12/30/0134324.html" rel="bookmark" class="crp_title">在Eclipse WTP中加入Resin server adapter</a></li><li><a href="http://www.javatang.com/archives/2010/01/31/3312389.html" rel="bookmark" class="crp_title">m2eclipse插件使用中提示jar包找不到的解决方法</a></li><li><a href="http://www.javatang.com/archives/2010/07/07/2157401.html" rel="bookmark" class="crp_title">客户真正的需求原来是这样的</a></li><li><a href="http://www.javatang.com/archives/2006/03/16/11399.html" rel="bookmark" class="crp_title">非常棒的JS的Eclipse插件 &#8211; JSEclipse</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/27/1657519.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spring MVC中修改校验的异常信息</title>
		<link>http://www.javatang.com/archives/2010/11/23/5817513.html</link>
		<comments>http://www.javatang.com/archives/2010/11/23/5817513.html#comments</comments>
		<pubDate>Tue, 23 Nov 2010 08:58:17 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=513</guid>
		<description><![CDATA[使用一个例子来说明一下，Spring使用的是3.0.x： public class Account { &#160; &#160; @Pattern(regexp = &#34;[a-z0-9]{3,50}&#34;) &#160; &#160; private&#160;String name; &#160; &#160; &#160; @NotNull &#160; &#160; @NumberFormat(style=Style.CURRENCY) &#160; &#160; private&#160;BigDecimal balance = new BigDecimal(&#34;1000&#34;); &#160; &#160; &#160; @DateTimeFormat(style=&#34;S-&#34;) &#160; &#160; @Future &#160; &#160; private&#160;Date renewalDate = new Date(new Date().getTime() + 31536000000L); &#160; &#160; &#160; // 省略 getter &#38; setter... } 接下来使用注解创建一个Controller： [...]]]></description>
			<content:encoded><![CDATA[<p>使用一个例子来说明一下，Spring使用的是3.0.x：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">Account</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">Pattern</span><span style="color: Olive;">(</span><span style="color: Blue;">regexp</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">[a-z0-9]{3,50}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Blue;">name</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">NotNull</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">NumberFormat</span><span style="color: Olive;">(</span><span style="color: Blue;">style</span><span style="color: Gray;">=</span><span style="color: Blue;">Style</span><span style="color: Gray;">.</span><span style="color: Blue;">CURRENCY</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">BigDecimal</span><span style="color: Gray;"> </span><span style="color: Blue;">balance</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">BigDecimal</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1000</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">DateTimeFormat</span><span style="color: Olive;">(</span><span style="color: Blue;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">S-</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">Future</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Date</span><span style="color: Gray;"> </span><span style="color: Blue;">renewalDate</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Date</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Date</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">getTime</span><span style="color: Olive;">()</span><span style="color: Gray;"> + </span><span style="color: Maroon;">31536000000</span><span style="color: Blue;">L</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// 省略 getter &amp; setter...</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>接下来使用注解创建一个Controller：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">@</span><span style="color: Blue;">Controller</span></li>
<li><span style="color: Gray;">@</span><span style="color: Blue;">RequestMapping</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/account</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">AccountController</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * 如果view采用JSP的话&lt;code&gt;@ModelAttribute&lt;/code&gt;注解可以省略，但是如果是使用Velocity或FreeMarker</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * 的话必须要加上，而且&lt;code&gt;@Valid&lt;/code&gt;注解和后面的BindingResult类型的参数之间不能有其他参数。</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">RequestMapping</span><span style="color: Olive;">(</span><span style="color: Blue;">method</span><span style="color: Gray;">=</span><span style="color: Blue;">RequestMethod</span><span style="color: Gray;">.</span><span style="color: Blue;">POST</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Blue;">create</span><span style="color: Olive;">(</span><span style="color: Gray;">@</span><span style="color: Blue;">Valid</span><span style="color: Gray;"> @</span><span style="color: Blue;">ModelAttribute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">account</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">Account</span><span style="color: Gray;"> </span><span style="color: Blue;">account</span><span style="color: Gray;">, </span><span style="color: Blue;">BindingResult</span><span style="color: Gray;"> </span><span style="color: Blue;">result</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">result</span><span style="color: Gray;">.</span><span style="color: Blue;">hasErrors</span><span style="color: Olive;">())</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">account/createForm</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// ...</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">redirect:/account/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">account</span><span style="color: Gray;">.</span><span style="color: Blue;">getId</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>另外还有一个view文件、配置文件等等，具体的可以查看<a href="https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/" target="_blank">Spring MVC Basic Sample</a>。</p>
<p>OK，接下来说重点。我参考上面的Spring MVC Basic Sample中的做法也做了一个类似的表单，在表单中的balance中输入非数字的时候旁边的错误信息会出现下面的异常信息：</p>
<blockquote><p>
Failed to convert property value of type java.lang.String to required type java.math.BigDecimal for property balance; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value “eff” from type java.lang.String to type java.math.BigDecimal; nested exception is java.lang.IllegalArgumentException: Unable to parse eff
</p></blockquote>
<p>这个就很郁闷了，明显是格式转换出错，但是列出来一堆的异常信息，对用户来说非常不友好。于是开始在Google中搜索也没有找到比较好的说法，后来运行了Spring MVC Basic Sample，不显示上面的异常信息，而只是显示一句话：”could not be parsed“，这个效果正是我们所期待的。于是我将例子中的所有spring配置文件、Bean信息、Controller都做了对比，甚至JSP模板都一样，但是一到我自己的项目中就会出现那个异常，当时非常郁闷。</p>
<p>后来无意中在Google中查到到了参考资料中的一篇帖子，里面提到只要在messages.properties文件中设置typeMismatch属性就可以了，于是我猛然想到Spring MVC Basic Sample中也有个messages.properties文件，打开之后赫然看到果然有一条typeMismatch属性：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">typeMismatch=could not be parsed</li></ol></div>
<p>原来是在这里设置的，真的很郁闷。还好，参考资料中的帖子中还提到可以设置具体的类型，比如可以这样设置：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">## 全局的配置信息</li>
<li>typeMismatch=输入的数据格式不正确</li>
<li>## 针对BigDecimal类型的错误信息</li>
<li>typeMismatch.java.math.BigDecimal=请输入数字</li>
<li>## 针对Date类型的错误信息</li>
<li>typeMismatch.java.util.Date=请在{0}中输入正确的日期</li></ol></div>
<p>参考资料：<br />
<a href="http://www.velocityreviews.com/forums/t302365-spring-mvc-data-binding-and-user-friendly-error-messages.html" target="_blank">Spring MVC Data Binding and user-friendly error messages</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/03/13/5026128.html" rel="bookmark" class="crp_title">按照指定的类型排序</a></li><li><a href="http://www.javatang.com/archives/2010/08/09/3212438.html" rel="bookmark" class="crp_title">SimpleJdbcInsert使用executeAndReturnKeyHolder方法返回主键时需要注意的一个地方</a></li><li><a href="http://www.javatang.com/archives/2008/07/07/5648271.html" rel="bookmark" class="crp_title">如何使用DWR2.0的注解功能</a></li><li><a href="http://www.javatang.com/archives/2008/06/19/0308269.html" rel="bookmark" class="crp_title">JPA和Hibernate注解的继承问题</a></li><li><a href="http://www.javatang.com/archives/2007/03/05/5722110.html" rel="bookmark" class="crp_title">Java中文排序</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/23/5817513.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic (Feed is rejected)
Page Caching using disk: enhanced
Database Caching 22/118 queries in 0.201 seconds using disk: basic

Served from: www.javatang.com @ 2012-05-19 04:26:03 -->
