<?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"
	>

<channel>
	<title>北风技术专栏 &#187; 小白</title>
	<atom:link href="http://column.ibeifeng.com/wp-feed.php?author_name=mfgqls&#038;feed=feed" rel="self" type="application/rss+xml" />
	<link>http://column.ibeifeng.com</link>
	<description>用技术点亮生活中每个亮点</description>
	<pubDate>Tue, 07 Apr 2009 09:38:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>浅谈注册码(二利用servlet生成简单的注册码)</title>
		<link>http://column.ibeifeng.com/mfgqls/20081016161.shtml</link>
		<comments>http://column.ibeifeng.com/mfgqls/20081016161.shtml#comments</comments>
		<pubDate>Thu, 16 Oct 2008 11:55:56 +0000</pubDate>
		<dc:creator>小白</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[注册码]]></category>

		<guid isPermaLink="false">http://column.ibeifeng.com/?p=161</guid>
		<description><![CDATA[在web.xml配置:

Java代码



&#60;servlet&#62;  
    &#60;servlet-name&#62;image&#60;/servlet-name&#62;  
    &#60;servlet-class&#62;org.test.web.AuthImage&#60;/servlet-class&#62;  
&#60;/servlet&#62;  
  
&#60;servlet-mapping&#62;  
    &#60;servlet-name&#62;image&#60;/servlet-name&#62;  
 &#60;url-pattern&#62;/authImage&#60;/url-pattern&#62;  
&#60;/servlet-mapping&#62;  



其servlet源代码:

Java代码



public class AuthImage extends HttpServlet  
{  
  
    private static final String CONTENT_TYPE = &#8220;text/html; charset=gb2312&#8243;;  
    //设置字母的大小,大小  
    private Font mFont = new Font(&#8220;Times New Roman&#8221;, Font.PLAIN, 17);  
    public void init() throws ServletException  
    {  
        super.init();  
    }  
    Color getRandColor(int fc,int bc)  
    {  
        Random random = new Random();  
        if(fc&#62;255) fc=255;  
        if(bc&#62;255) bc=255;  
        int r=fc+random.nextInt(bc-fc);  
        int g=fc+random.nextInt(bc-fc);  
        int b=fc+random.nextInt(bc-fc);  
        return new Color(r,g,b);  
    }  
  
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  
    {  
        response.setHeader(&#8220;Pragma&#8221;,&#8220;No-cache&#8221;);  
        response.setHeader(&#8220;Cache-Control&#8221;,&#8220;no-cache&#8221;);  
        response.setDateHeader(&#8220;Expires&#8221;, 0);  
        //表明生成的响应是图片  
        response.setContentType(&#8220;image/jpeg&#8221;);  
          
        int width=100, height=18;  
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
          
        Graphics g = image.getGraphics();  
        Random random = new Random();  
        g.setColor(getRandColor(200,250));  
        g.fillRect(1, 1, width-1, height-1);  
        g.setColor(new Color(102,102,102));  
        g.drawRect(0, 0, width-1, height-1);  
        g.setFont(mFont);  
  
        g.setColor(getRandColor(160,200));  
  
        //画随机线  
        for (int i=0;i&#60;155;i++)  
        {  
            int x = random.nextInt(width - 1);  
            int y = random.nextInt(height - 1);  
            int xl = random.nextInt(6) + 1;  
            int yl = random.nextInt(12) + 1;  
            g.drawLine(x,y,x + xl,y + yl);  
        }  
  
        //从另一方向画随机线  
        for (int i = 0;i &#60; 70;i++)  
        {  
            int x = random.nextInt(width - 1);  
            int y = random.nextInt(height - 1);  
            int xl = random.nextInt(12) + 1;  
            int yl = random.nextInt(6) + 1;  
            g.drawLine(x,y,x - xl,y - yl);  
        }  
  
        //生成随机数,并将随机数字转换为字母  
        String sRand=&#8220;&#8221;;  
        for (int i=0;i&#60;6;i++)  
        {  
            int itmp = random.nextInt(26) + 65;  
            char ctmp = (char)itmp;  
            sRand += String.valueOf(ctmp);  
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
            g.drawString(String.valueOf(ctmp),15*i+10,16);  
        }  
  
        HttpSession session = request.getSession(true);  
        session.setAttribute(&#8220;rand&#8221;,sRand);  
        g.dispose();  
        ImageIO.write(image, &#8220;JPEG&#8221;, response.getOutputStream());  
    }  
    public void destroy()  
    {  
    }  
}  


怎样用:
在页面显示随机图片,可在JSP页面中增加如下代码即可:



Java代码：


&#60;img src=&#8220;authImage&#8221;&#62;  


]]></description>
			<content:encoded><![CDATA[<p>在web.xml配置:</p>
<div class="bar">
<div class="tools">Java代码</div>
</div>
<div class="dp-highlighter">
<ol class="dp-j">
<li><span><span>&lt;servlet&gt;  </span></span></li>
<li><span>    &lt;servlet-name&gt;image&lt;/servlet-name&gt;  </span></li>
<li><span>    &lt;servlet-<span class="keyword">class</span><span>&gt;org.test.web.AuthImage&lt;/servlet-</span><span class="keyword">class</span><span>&gt;  </span></span></li>
<li><span>&lt;/servlet&gt;  </span></li>
<li><span>  </span></li>
<li><span>&lt;servlet-mapping&gt;  </span></li>
<li><span>    &lt;servlet-name&gt;image&lt;/servlet-name&gt;  </span></li>
<li><span> &lt;url-pattern&gt;/authImage&lt;/url-pattern&gt;  </span></li>
<li><span>&lt;/servlet-mapping&gt;  </span></li>
</ol>
</div>
<p><span><span id="more-161"></span></span></p>
<p><span>其servlet源代码:</span></p>
<div class="bar">
<div class="tools">Java代码</div>
</div>
<div class="dp-highlighter">
<ol class="dp-j">
<li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AuthImage </span><span class="keyword">extends</span><span> HttpServlet  </span></span></li>
<li><span>{  </span></li>
<li><span>  </span></li>
<li><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String CONTENT_TYPE = </span><span class="string">&#8220;text/html; charset=gb2312&#8243;</span><span>;  </span></span></li>
<li><span>    <span class="comment">//设置字母的大小,大小</span><span>  </span></span></li>
<li><span>    <span class="keyword">private</span><span> Font mFont = </span><span class="keyword">new</span><span> Font(</span><span class="string">&#8220;Times New Roman&#8221;</span><span>, Font.PLAIN, </span><span class="number">17</span><span>);  </span></span></li>
<li><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> init() </span><span class="keyword">throws</span><span> ServletException  </span></span></li>
<li><span>    {  </span></li>
<li><span>        <span class="keyword">super</span><span>.init();  </span></span></li>
<li><span>    }  </span></li>
<li><span>    Color getRandColor(<span class="keyword">int</span><span> fc,</span><span class="keyword">int</span><span> bc)  </span></span></li>
<li><span>    {  </span></li>
<li><span>        Random random = <span class="keyword">new</span><span> Random();  </span></span></li>
<li><span>        <span class="keyword">if</span><span>(fc&gt;</span><span class="number">255</span><span>) fc=</span><span class="number">255</span><span>;  </span></span></li>
<li><span>        <span class="keyword">if</span><span>(bc&gt;</span><span class="number">255</span><span>) bc=</span><span class="number">255</span><span>;  </span></span></li>
<li><span>        <span class="keyword">int</span><span> r=fc+random.nextInt(bc-fc);  </span></span></li>
<li><span>        <span class="keyword">int</span><span> g=fc+random.nextInt(bc-fc);  </span></span></li>
<li><span>        <span class="keyword">int</span><span> b=fc+random.nextInt(bc-fc);  </span></span></li>
<li><span>        <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Color(r,g,b);  </span></span></li>
<li><span>    }  </span></li>
<li><span>  </span></li>
<li><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> service(HttpServletRequest request, HttpServletResponse response) </span><span class="keyword">throws</span><span> ServletException, IOException  </span></span></li>
<li><span>    {  </span></li>
<li><span>        response.setHeader(<span class="string">&#8220;Pragma&#8221;</span><span>,</span><span class="string">&#8220;No-cache&#8221;</span><span>);  </span></span></li>
<li><span>        response.setHeader(<span class="string">&#8220;Cache-Control&#8221;</span><span>,</span><span class="string">&#8220;no-cache&#8221;</span><span>);  </span></span></li>
<li><span>        response.setDateHeader(<span class="string">&#8220;Expires&#8221;</span><span>, </span><span class="number">0</span><span>);  </span></span></li>
<li><span>        <span class="comment">//表明生成的响应是图片</span><span>  </span></span></li>
<li><span>        response.setContentType(<span class="string">&#8220;image/jpeg&#8221;</span><span>);  </span></span></li>
<li><span>          </span></li>
<li><span>        <span class="keyword">int</span><span> width=</span><span class="number">100</span><span>, height=</span><span class="number">18</span><span>;  </span></span></li>
<li><span>        BufferedImage image = <span class="keyword">new</span><span> BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  </span></span></li>
<li><span>          </span></li>
<li><span>        Graphics g = image.getGraphics();  </span></li>
<li><span>        Random random = <span class="keyword">new</span><span> Random();  </span></span></li>
<li><span>        g.setColor(getRandColor(<span class="number">200</span><span>,</span><span class="number">250</span><span>));  </span></span></li>
<li><span>        g.fillRect(<span class="number">1</span><span>, </span><span class="number">1</span><span>, width-</span><span class="number">1</span><span>, height-</span><span class="number">1</span><span>);  </span></span></li>
<li><span>        g.setColor(<span class="keyword">new</span><span> Color(</span><span class="number">102</span><span>,</span><span class="number">102</span><span>,</span><span class="number">102</span><span>));  </span></span></li>
<li><span>        g.drawRect(<span class="number">0</span><span>, </span><span class="number">0</span><span>, width-</span><span class="number">1</span><span>, height-</span><span class="number">1</span><span>);  </span></span></li>
<li><span>        g.setFont(mFont);  </span></li>
<li><span>  </span></li>
<li><span>        g.setColor(getRandColor(<span class="number">160</span><span>,</span><span class="number">200</span><span>));  </span></span></li>
<li><span>  </span></li>
<li><span>        <span class="comment">//画随机线</span><span>  </span></span></li>
<li><span>        <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="number">155</span><span>;i++)  </span></span></li>
<li><span>        {  </span></li>
<li><span>            <span class="keyword">int</span><span> x = random.nextInt(width - </span><span class="number">1</span><span>);  </span></span></li>
<li><span>            <span class="keyword">int</span><span> y = random.nextInt(height - </span><span class="number">1</span><span>);  </span></span></li>
<li><span>            <span class="keyword">int</span><span> xl = random.nextInt(</span><span class="number">6</span><span>) + </span><span class="number">1</span><span>;  </span></span></li>
<li><span>            <span class="keyword">int</span><span> yl = random.nextInt(</span><span class="number">12</span><span>) + </span><span class="number">1</span><span>;  </span></span></li>
<li><span>            g.drawLine(x,y,x + xl,y + yl);  </span></li>
<li><span>        }  </span></li>
<li><span>  </span></li>
<li><span>        <span class="comment">//从另一方向画随机线</span><span>  </span></span></li>
<li><span>        <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>;i &lt; </span><span class="number">70</span><span>;i++)  </span></span></li>
<li><span>        {  </span></li>
<li><span>            <span class="keyword">int</span><span> x = random.nextInt(width - </span><span class="number">1</span><span>);  </span></span></li>
<li><span>            <span class="keyword">int</span><span> y = random.nextInt(height - </span><span class="number">1</span><span>);  </span></span></li>
<li><span>            <span class="keyword">int</span><span> xl = random.nextInt(</span><span class="number">12</span><span>) + </span><span class="number">1</span><span>;  </span></span></li>
<li><span>            <span class="keyword">int</span><span> yl = random.nextInt(</span><span class="number">6</span><span>) + </span><span class="number">1</span><span>;  </span></span></li>
<li><span>            g.drawLine(x,y,x - xl,y - yl);  </span></li>
<li><span>        }  </span></li>
<li><span>  </span></li>
<li><span>        <span class="comment">//生成随机数,并将随机数字转换为字母</span><span>  </span></span></li>
<li><span>        String sRand=<span class="string">&#8220;&#8221;</span><span>;  </span></span></li>
<li><span>        <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i&lt;</span><span class="number">6</span><span>;i++)  </span></span></li>
<li><span>        {  </span></li>
<li><span>            <span class="keyword">int</span><span> itmp = random.nextInt(</span><span class="number">26</span><span>) + </span><span class="number">65</span><span>;  </span></span></li>
<li><span>            <span class="keyword">char</span><span> ctmp = (</span><span class="keyword">char</span><span>)itmp;  </span></span></li>
<li><span>            sRand += String.valueOf(ctmp);  </span></li>
<li><span>            g.setColor(<span class="keyword">new</span><span> Color(</span><span class="number">20</span><span>+random.nextInt(</span><span class="number">110</span><span>),</span><span class="number">20</span><span>+random.nextInt(</span><span class="number">110</span><span>),</span><span class="number">20</span><span>+random.nextInt(</span><span class="number">110</span><span>)));  </span></span></li>
<li><span>            g.drawString(String.valueOf(ctmp),<span class="number">15</span><span>*i+</span><span class="number">10</span><span>,</span><span class="number">16</span><span>);  </span></span></li>
<li><span>        }  </span></li>
<li><span>  </span></li>
<li><span>        HttpSession session = request.getSession(<span class="keyword">true</span><span>);  </span></span></li>
<li><span>        session.setAttribute(<span class="string">&#8220;rand&#8221;</span><span>,sRand);  </span></span></li>
<li><span>        g.dispose();  </span></li>
<li><span>        ImageIO.write(image, <span class="string">&#8220;JPEG&#8221;</span><span>, response.getOutputStream());  </span></span></li>
<li><span>    }  </span></li>
<li><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> destroy()  </span></span></li>
<li><span>    {  </span></li>
<li><span>    }  </span></li>
<li><span>}  </span></li>
</ol>
</div>
<p><span>怎样用:<br />
在页面显示随机图片,可在JSP页面中增加如下代码即可:<br />
</span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码：</div>
</div>
<ol class="dp-j">
<li><span><span>&lt;img src=</span><span class="string">&#8220;authImage&#8221;</span><span>&gt;  </span></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://column.ibeifeng.com/mfgqls/20081016161.shtml/feed</wfw:commentRss>
		</item>
		<item>
		<title>浅谈验证码(一什么是验证码)</title>
		<link>http://column.ibeifeng.com/mfgqls/20081016159.shtml</link>
		<comments>http://column.ibeifeng.com/mfgqls/20081016159.shtml#comments</comments>
		<pubDate>Thu, 16 Oct 2008 11:48:54 +0000</pubDate>
		<dc:creator>小白</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[验证码]]></category>

		<guid isPermaLink="false">http://column.ibeifeng.com/?p=159</guid>
		<description><![CDATA[验证码：有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试，实际上是用验证码是现在很多网站通行的方式（比如招商银行的网上个人银行，腾讯的QQ社区），我们利用比较简易的方式实现了这个功能。虽然登陆麻烦一点，但是对社区还来说这个功能还是很有必要，也很重要。但我们还是提醒大家主要保护自己的密码，尽量使用混杂了数字、字母、符号在内的6位以上密码，不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码。不要因为只是来iclub问问问题，就随意设置密码，保护你自己的密码也是保护你自己，免得你的账号给人盗用给自己带来不必要的麻烦。

(1)验证码一般是防止批量注册的，人眼看起来都费劲，何况是机器。二像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生目前，不少网站为了防止用户利用机器人自动注册、登录、灌水，都采用了验证码技术。所谓验证码，就是将一串随机产生的数字或符号，生成一幅图片，图片里加上一些干扰象素（防止OCR），由用户肉眼识别其中的验证码信息，输入表单提交网站验证，验证成功后才能使用某项功能。
(2)一般注册用户ID的地方以及各大论坛都要要输入验证码
(3)常见的验证码
1，四位数字，随机的一数字字符串，最原始的验证码，验证作用几乎为零。                                                         
2，CSDN网站用户登录用的是GIF格式，目前常用的随机数字图片验证码。图片上的字符比较中规中矩，验证作用比上一个好。没有基本图形图像学知识的人，不可破！可惜读取它的程序，在CSDN使用它的第一天，好像就在论坛里发布了，真是可怜！
3，QQ网站用户登录用的是PNG格式，图片用的随机数字+随机大写英文字母，整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊…                                                                                   
4，MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。
5，Google的Gmail注册时候的是JPG格式，随机英文字母+随机颜色+随机位置+随机长度。                                   
6，其他各大论坛的是XBM格式，内容随机。
（4）意义：不少网站为了防止用户利用机器人自动注册、登录、灌水，都采用了验证码技术。所谓验证码，就是将一串随机产生的数字或符号，生成一幅图片，图片里加上一些干扰象素（防止OCR），由用户肉眼识别其中的验证码信息，输入表单提交网站验证，验证成功后才能使用某项功能。
]]></description>
			<content:encoded><![CDATA[<p>验证码：有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试，实际上是用验证码是现在很多网站通行的方式（比如招商银行的网上个人银行，腾讯的QQ社区），我们利用比较简易的方式实现了这个功能。虽然登陆麻烦一点，但是对社区还来说这个功能还是很有必要，也很重要。但我们还是提醒大家主要保护自己的密码，尽量使用混杂了数字、字母、符号在内的6位以上密码，不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码。不要因为只是来iclub问问问题，就随意设置密码，保护你自己的密码也是保护你自己，免得你的账号给人盗用给自己带来不必要的麻烦。</p>
<p><span id="more-159"></span></p>
<p>(1)验证码一般是防止批量注册的，人眼看起来都费劲，何况是机器。二像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生目前，不少网站为了防止用户利用机器人自动注册、登录、灌水，都采用了验证码技术。所谓验证码，就是将一串随机产生的数字或符号，生成一幅图片，图片里加上一些干扰象素（防止OCR），由用户肉眼识别其中的验证码信息，输入表单提交网站验证，验证成功后才能使用某项功能。</p>
<p>(2)一般注册用户ID的地方以及各大论坛都要要输入验证码</p>
<p>(3)常见的验证码<br />
1，四位数字，随机的一数字字符串，最原始的验证码，验证作用几乎为零。                                                         </p>
<p>2，CSDN网站用户登录用的是GIF格式，目前常用的随机数字图片验证码。图片上的字符比较中规中矩，验证作用比上一个好。没有基本图形图像学知识的人，不可破！可惜读取它的程序，在CSDN使用它的第一天，好像就在论坛里发布了，真是可怜！</p>
<p>3，QQ网站用户登录用的是PNG格式，图片用的随机数字+随机大写英文字母，整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊…                                                                                   </p>
<p>4，MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。</p>
<p>5，Google的Gmail注册时候的是JPG格式，随机英文字母+随机颜色+随机位置+随机长度。                                   </p>
<p>6，其他各大论坛的是XBM格式，内容随机。</p>
<p>（4）意义：不少网站为了防止用户利用机器人自动注册、登录、灌水，都采用了验证码技术。所谓验证码，就是将一串随机产生的数字或符号，生成一幅图片，图片里加上一些干扰象素（防止OCR），由用户肉眼识别其中的验证码信息，输入表单提交网站验证，验证成功后才能使用某项功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://column.ibeifeng.com/mfgqls/20081016159.shtml/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
