<div id="article\_content" class="article\_content csdn-tracking-statistics tracking-click" data-mod="popu\_519" data-dsm="post" style="overflow: hidden;"> <div class="htmledit\_views">
<p>最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善。</p> <p>验证码生成器:</p> <p></p><div class="dp-highlighter bg\_html"><div class="bar"><div class="tools"><b>\[html\]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu\_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 498px; top: 332px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie\_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie\_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu\_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>import javax.imageio.ImageIO; </span></span></li><li class=""><span>import java.awt.\*; </span></li><li class="alt"><span>import java.awt.image.BufferedImage; </span></li><li class=""><span>import java.io.FileOutputStream; </span></li><li class="alt"><span>import java.io.IOException; </span></li><li class=""><span>import java.io.OutputStream; </span></li><li class="alt"><span>import java.util.Date; </span></li><li class=""><span>import java.util.Random; </span></li><li class="alt"><span> </span></li><li class=""><span>/\*\* </span></li><li class="alt"><span> \* 验证码生成器 </span></li><li class=""><span> \* </span></li><li class="alt"><span> \* @author </span></li><li class=""><span> \*/ </span></li><li class="alt"><span>public class ValidateCode { </span></li><li class=""><span> // 图片的宽度。 </span></li><li class="alt"><span> private int <span class="attribute">width</span><span> = </span><span class="attribute-value">160</span><span>; </span></span></li><li class=""><span> // 图片的高度。 </span></li><li class="alt"><span> private int <span class="attribute">height</span><span> = </span><span class="attribute-value">40</span><span>; </span></span></li><li class=""><span> // 验证码字符个数 </span></li><li class="alt"><span> private int <span class="attribute">codeCount</span><span> = </span><span class="attribute-value">5</span><span>; </span></span></li><li class=""><span> // 验证码干扰线数 </span></li><li class="alt"><span> private int <span class="attribute">lineCount</span><span> = </span><span class="attribute-value">150</span><span>; </span></span></li><li class=""><span> // 验证码 </span></li><li class="alt"><span> private String <span class="attribute">code</span><span> = </span><span class="attribute-value">null</span><span>; </span></span></li><li class=""><span> // 验证码图片Buffer </span></li><li class="alt"><span> private BufferedImage <span class="attribute">buffImg</span><span> = </span><span class="attribute-value">null</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> // 验证码范围,去掉0(数字)和O(拼音)容易混淆的(小写的1和L也可以去掉,大写不用了) </span></li><li class=""><span> private char\[\] <span class="attribute">codeSequence</span><span> = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', </span></span></li><li class="alt"><span> 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', </span></li><li class=""><span> 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; </span></li><li class="alt"><span> </span></li><li class=""><span> /\*\* </span></li><li class="alt"><span> \* 默认构造函数,设置默认参数 </span></li><li class=""><span> \*/ </span></li><li class="alt"><span> public ValidateCode() { </span></li><li class=""><span> this.createCode(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> /\*\* </span></li><li class=""><span> \* @param width 图片宽 </span></li><li class="alt"><span> \* @param height 图片高 </span></li><li class=""><span> \*/ </span></li><li class="alt"><span> public ValidateCode(int width, int height) { </span></li><li class=""><span> <span class="attribute">this.width</span><span> = </span><span class="attribute-value">width</span><span>; </span></span></li><li class="alt"><span> <span class="attribute">this.height</span><span> = </span><span class="attribute-value">height</span><span>; </span></span></li><li class=""><span> this.createCode(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> /\*\* </span></li><li class=""><span> \* @param width 图片宽 </span></li><li class="alt"><span> \* @param height 图片高 </span></li><li class=""><span> \* @param codeCount 字符个数 </span></li><li class="alt"><span> \* @param lineCount 干扰线条数 </span></li><li class=""><span> \*/ </span></li><li class="alt"><span> public ValidateCode(int width, int height, int codeCount, int lineCount) { </span></li><li class=""><span> <span class="attribute">this.width</span><span> = </span><span class="attribute-value">width</span><span>; </span></span></li><li class="alt"><span> <span class="attribute">this.height</span><span> = </span><span class="attribute-value">height</span><span>; </span></span></li><li class=""><span> <span class="attribute">this.codeCount</span><span> = </span><span class="attribute-value">codeCount</span><span>; </span></span></li><li class="alt"><span> <span class="attribute">this.lineCount</span><span> = </span><span class="attribute-value">lineCount</span><span>; </span></span></li><li class=""><span> this.createCode(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> public void createCode() { </span></li><li class=""><span> int <span class="attribute">x</span><span> = </span><span class="attribute-value">0</span><span>, </span><span class="attribute">fontHeight</span><span> = </span><span class="attribute-value">0</span><span>, </span><span class="attribute">codeY</span><span> = </span><span class="attribute-value">0</span><span>; </span></span></li><li class="alt"><span> int <span class="attribute">red</span><span> = </span><span class="attribute-value">0</span><span>, </span><span class="attribute">green</span><span> = </span><span class="attribute-value">0</span><span>, </span><span class="attribute">blue</span><span> = </span><span class="attribute-value">0</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="attribute">x</span><span> = </span><span class="attribute-value">width</span><span> / (codeCount + 2);//每个字符的宽度(左右各空出一个字符) </span></span></li><li class=""><span> <span class="attribute">fontHeight</span><span> = </span><span class="attribute-value">height</span><span> - 2;//字体的高度 </span></span></li><li class="alt"><span> <span class="attribute">codeY</span><span> = </span><span class="attribute-value">height</span><span> - 4; </span></span></li><li class=""><span> </span></li><li class="alt"><span> // 图像buffer </span></li><li class=""><span> <span class="attribute">buffImg</span><span> = </span><span class="attribute-value">new</span><span> BufferedImage(width, height, BufferedImage.TYPE\_INT\_RGB); </span></span></li><li class="alt"><span> Graphics2D <span class="attribute">g</span><span> = </span><span class="attribute-value">buffImg</span><span>.createGraphics(); </span></span></li><li class=""><span> // 生成随机数 </span></li><li class="alt"><span> Random <span class="attribute">random</span><span> = </span><span class="attribute-value">new</span><span> Random(); </span></span></li><li class=""><span> // 将图像填充为白色 </span></li><li class="alt"><span> g.setColor(Color.WHITE); </span></li><li class=""><span> g.fillRect(0, 0, width, height); </span></li><li class="alt"><span> // 创建字体,可以修改为其它的 </span></li><li class=""><span> Font <span class="attribute">font</span><span> = </span><span class="attribute-value">new</span><span> Font("Fixedsys", Font.PLAIN, fontHeight); </span></span></li><li class="alt"><span>// Font <span class="attribute">font</span><span> = </span><span class="attribute-value">new</span><span> Font("Times New Roman", Font.ROMAN\_BASELINE, fontHeight); </span></span></li><li class=""><span> g.setFont(font); </span></li><li class="alt"><span> </span></li><li class=""><span> for (int <span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><</span><span> </span><span class="tag-name">lineCount</span><span>; i++) { </span></span></li><li class="alt"><span> // 设置随机开始和结束坐标 </span></li><li class=""><span> int <span class="attribute">xs</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(width);//x坐标开始 </span></span></li><li class="alt"><span> int <span class="attribute">ys</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(height);//y坐标开始 </span></span></li><li class=""><span> int <span class="attribute">xe</span><span> = </span><span class="attribute-value">xs</span><span> + random.nextInt(width / 8);//x坐标结束 </span></span></li><li class="alt"><span> int <span class="attribute">ye</span><span> = </span><span class="attribute-value">ys</span><span> + random.nextInt(height / 8);//y坐标结束 </span></span></li><li class=""><span> </span></li><li class="alt"><span> // 产生随机的颜色值,让输出的每个干扰线的颜色值都将不同。 </span></li><li class=""><span> <span class="attribute">red</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class="alt"><span> <span class="attribute">green</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class=""><span> <span class="attribute">blue</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class="alt"><span> g.setColor(new Color(red, green, blue)); </span></li><li class=""><span> g.drawLine(xs, ys, xe, ye); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> // randomCode记录随机产生的验证码 </span></li><li class=""><span> StringBuffer <span class="attribute">randomCode</span><span> = </span><span class="attribute-value">new</span><span> StringBuffer(); </span></span></li><li class="alt"><span> // 随机产生codeCount个字符的验证码。 </span></li><li class=""><span> for (int <span class="attribute">i</span><span> = </span><span class="attribute-value">0</span><span>; i </span><span class="tag"><</span><span> </span><span class="tag-name">codeCount</span><span>; i++) { </span></span></li><li class="alt"><span> String <span class="attribute">strRand</span><span> = </span><span class="attribute-value">String</span><span>.valueOf(codeSequence\[random.nextInt(codeSequence.length)\]); </span></span></li><li class=""><span> // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。 </span></li><li class="alt"><span> <span class="attribute">red</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class=""><span> <span class="attribute">green</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class="alt"><span> <span class="attribute">blue</span><span> = </span><span class="attribute-value">random</span><span>.nextInt(255); </span></span></li><li class=""><span> g.setColor(new Color(red, green, blue)); </span></li><li class="alt"><span> g.drawString(strRand, (i + 1) \* x, codeY); </span></li><li class=""><span> // 将产生的四个随机数组合在一起。 </span></li><li class="alt"><span> randomCode.append(strRand); </span></li><li class=""><span> } </span></li><li class="alt"><span> // 将四位数字的验证码保存到Session中。 </span></li><li class=""><span> <span class="attribute">code</span><span> = </span><span class="attribute-value">randomCode</span><span>.toString(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> public void write(String path) throws IOException { </span></li><li class=""><span> OutputStream <span class="attribute">sos</span><span> = </span><span class="attribute-value">new</span><span> FileOutputStream(path); </span></span></li><li class="alt"><span> this.write(sos); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> public void write(OutputStream sos) throws IOException { </span></li><li class="alt"><span> ImageIO.write(buffImg, "png", sos); </span></li><li class=""><span> sos.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> public BufferedImage getBuffImg() { </span></li><li class=""><span> return buffImg; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> public String getCode() { </span></li><li class=""><span> return code; </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> /\*\* </span></li><li class=""><span> \* 测试函数,默认生成到d盘 </span></li><li class="alt"><span> \* @param args </span></li><li class=""><span> \*/ </span></li><li class="alt"><span> public static void main(String\[\] args) { </span></li><li class=""><span> ValidateCode <span class="attribute">vCode</span><span> = </span><span class="attribute-value">new</span><span> ValidateCode(160,40,5,150); </span></span></li><li class="alt"><span> try { </span></li><li class=""><span> String <span class="attribute">path</span><span>=</span><span class="attribute-value">"D:/"</span><span>+new Date().getTime()+".png"; </span></span></li><li class="alt"><span> System.out.println(vCode.getCode()+" <span class="tag">></span><span>"+path); </span></span></li><li class=""><span> vCode.write(path); </span></li><li class="alt"><span> } catch (IOException e) { </span></li><li class=""><span> e.printStackTrace(); </span></li><li class="alt"><span> } </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre class="html" name="code" style="display: none;">import javax.imageio.ImageIO; import java.awt.\*; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import java.util.Random;
/**
-
验证码生成器
-
@author
*/
public class ValidateCode {
// 图片的宽度。
private int width = 160;
// 图片的高度。
private int height = 40;
// 验证码字符个数
private int codeCount = 5;
// 验证码干扰线数
private int lineCount = 150;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg = null;
// 验证码范围,去掉0(数字)和O(拼音)容易混淆的(小写的1和L也可以去掉,大写不用了)
private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
/**
- 默认构造函数,设置默认参数 */
public ValidateCode() {
this.createCode();
}
/**
- @param width 图片宽
- @param height 图片高 */
public ValidateCode(int width, int height) {
this.width = width;
this.height = height;
this.createCode();
}
/**
- @param width 图片宽
- @param height 图片高
- @param codeCount 字符个数
- @param lineCount 干扰线条数 */
public ValidateCode(int width, int height, int codeCount, int lineCount) {
this.width = width;
this.height = height;
this.codeCount = codeCount;
this.lineCount = lineCount;
this.createCode();
}
public void createCode() {
int x = 0, fontHeight = 0, codeY = 0;
int red = 0, green = 0, blue = 0;
1 x = width / (codeCount + 2);//每个字符的宽度(左右各空出一个字符)
2 fontHeight = height - 2;//字体的高度
3 codeY = height - 4;
4
5 // 图像buffer
6 buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
7 Graphics2D g = buffImg.createGraphics();
8 // 生成随机数
9 Random random = new Random();
10 // 将图像填充为白色
11 g.setColor(Color.WHITE);
12 g.fillRect(0, 0, width, height);
13 // 创建字体,可以修改为其它的
14 Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight);
g.setFont(font);
1 for (int i = 0; i < lineCount; i++) {
2 // 设置随机开始和结束坐标
3 int xs = random.nextInt(width);//x坐标开始
4 int ys = random.nextInt(height);//y坐标开始
5 int xe = xs + random.nextInt(width / 8);//x坐标结束
6 int ye = ys + random.nextInt(height / 8);//y坐标结束
7
8 // 产生随机的颜色值,让输出的每个干扰线的颜色值都将不同。
9 red = random.nextInt(255);
10 green = random.nextInt(255);
11 blue = random.nextInt(255);
12 g.setColor(new Color(red, green, blue));
13 g.drawLine(xs, ys, xe, ye);
14 }
15
16 // randomCode记录随机产生的验证码
17 StringBuffer randomCode = new StringBuffer();
18 // 随机产生codeCount个字符的验证码。
19 for (int i = 0; i < codeCount; i++) {
20 String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
21 // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
22 red = random.nextInt(255);
23 green = random.nextInt(255);
24 blue = random.nextInt(255);
25 g.setColor(new Color(red, green, blue));
26 g.drawString(strRand, (i + 1) * x, codeY);
27 // 将产生的四个随机数组合在一起。
28 randomCode.append(strRand);
29 }
30 // 将四位数字的验证码保存到Session中。
31 code = randomCode.toString();
32}
33
34public void write(String path) throws IOException {
35 OutputStream sos = new FileOutputStream(path);
36 this.write(sos);
37}
38
39public void write(OutputStream sos) throws IOException {
40 ImageIO.write(buffImg, "png", sos);
41 sos.close();
42}
43
44public BufferedImage getBuffImg() {
45 return buffImg;
46}
47
48public String getCode() {
49 return code;
50}
51
525455
56public static void main(String[] args) {
57 ValidateCode vCode = new ValidateCode(160,40,5,150);
58 try {
59 String path="D:/"+new Date().getTime()+".png";
60 System.out.println(vCode.getCode()+" >"+path);
61 vCode.write(path);
62 } catch (IOException e) {
63 e.printStackTrace();
64 }
65}
} </pre><br><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;">下面是页面JS调用验证码</span><br><p><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"></span></p><div class="dp-highlighter bg\_javascript"><div class="bar"><div class="tools"><b>[javascript]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu\_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 534px; top: 3192px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie\_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie\_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu\_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-c"><li class="alt"><span><span class="comment">// 刷新图片 </span><span> </span></span></li><li class=""><span> <span class="keyword">function</span><span> changeImg() { </span></span></li><li class="alt"><span> <span class="keyword">var</span><span> imgSrc = $(</span><span class="string">"#imgObj"</span><span>); </span></span></li><li class=""><span> <span class="keyword">var</span><span> url = imgSrc.attr(</span><span class="string">"src"</span><span>); </span></span></li><li class="alt"><span> imgSrc.attr(<span class="string">"src"</span><span>, changeUrl(url)); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="comment">//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳 </span><span> </span></span></li><li class=""><span> <span class="keyword">function</span><span> changeUrl(url) { </span></span></li><li class="alt"><span> <span class="keyword">var</span><span> timestamp = (</span><span class="keyword">new</span><span> Date()).valueOf(); </span></span></li><li class=""><span> <span class="keyword">var</span><span> index = url.indexOf(</span><span class="string">"?"</span><span>); </span></span></li><li class="alt"><span> console.log(index); </span></li><li class=""><span> <span class="keyword">if</span><span> (index > 0) { </span></span></li><li class="alt"><span> url = url.substring(0, url.indexOf(<span class="string">"?"</span><span>)); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> console.log(url); </span></li><li class=""><span> <span class="keyword">if</span><span> ((url.indexOf(</span><span class="string">"&"</span><span>) > 0)) { </span></span></li><li class="alt"><span> url = url + <span class="string">"×tamp="</span><span> + timestamp; </span></span></li><li class=""><span> console.log(url); </span></li><li class="alt"><span> } <span class="keyword">else</span><span> { </span></span></li><li class=""><span> url = url + <span class="string">"?timestamp="</span><span> + timestamp; </span></span></li><li class="alt"><span> console.log(url); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> url; </span></span></li><li class=""><span> } </span></li></ol></div><pre class="javascript" name="code" style="display: none;"> // 刷新图片
function changeImg() {
var imgSrc = $("#imgObj");
var url = imgSrc.attr("src"); imgSrc.attr("src", changeUrl(url));
}
//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳
function changeUrl(url) {
var timestamp = (new Date()).valueOf();
var index = url.indexOf("?"); console.log(index); if (index > 0) {
url = url.substring(0, url.indexOf("?"));
} console.log(url); if ((url.indexOf("&") > 0)) {
url = url + "×tamp=" + timestamp;
console.log(url); } else {
url = url + "?timestamp=" + timestamp; console.log(url); }
return url;
}</pre><br><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;">下面是controller层输出验证码</span><br><p><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"></span></span></p><div class="dp-highlighter bg\_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu\_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 496px; top: 3766px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie\_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie\_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu\_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="comment">/ </span> </span></li><li class=""><span><span class="comment"> 响应验证码页面 </span> </span></li><li class="alt"><span><span class="comment"> @return </span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span><span class="annotation">@RequestMapping</span><span>(value=</span><span class="string">"/validateCode"</span><span>) </span></span></li><li class=""><span><span class="keyword">public</span><span> String validateCode(HttpServletRequest request,HttpServletResponse response) </span><span class="keyword">throws</span><span> Exception{ </span></span></li><li class="alt"><span> <span class="comment">// 设置响应的类型格式为图片格式 </span><span> </span></span></li><li class=""><span> response.setContentType(<span class="string">"image/jpeg"</span><span>); </span></span></li><li class="alt"><span> <span class="comment">//禁止图像缓存。 </span><span> </span></span></li><li class=""><span> response.setHeader(<span class="string">"Pragma"</span><span>, </span><span class="string">"no-cache"</span><span>); </span></span></li><li class="alt"><span> response.setHeader(<span class="string">"Cache-Control"</span><span>, </span><span class="string">"no-cache"</span><span>); </span></span></li><li class=""><span> response.setDateHeader(<span class="string">"Expires"</span><span>, </span><span class="number">0</span><span>); </span></span></li><li class="alt"><span> </span></li><li class=""><span> HttpSession session = request.getSession(); </span></li><li class="alt"><span> </span></li><li class=""><span> ValidateCode vCode = <span class="keyword">new</span><span> ValidateCode(</span><span class="number">120</span><span>,</span><span class="number">40</span><span>,</span><span class="number">5</span><span>,</span><span class="number">100</span><span>); </span></span></li><li class="alt"><span> session.setAttribute(<span class="string">"code"</span><span>, vCode.getCode()); </span></span></li><li class=""><span> vCode.write(response.getOutputStream()); </span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">null</span><span>; </span></span></li><li class=""><span>} </span></li></ol></div><pre class="java" name="code" style="display: none;">/
-
响应验证码页面
-
@return */
@RequestMapping(value="/validateCode")
public String validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception{
// 设置响应的类型格式为图片格式
response.setContentType("image/jpeg");
//禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
HttpSession session = request.getSession();
ValidateCode vCode = new ValidateCode(120,40,5,100);
session.setAttribute("code", vCode.getCode());
vCode.write(response.getOutputStream());
return null;
} </pre><br><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;">下面是controller层验证验证码输入是否正确</span><br><p><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"><span style="color:rgb(51,51,51);font-family:Arial;font-size:14px;"></span></span></span></p><div class="dp-highlighter bg\_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu\_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 496px; top: 4268px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie\_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie\_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu\_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>String code = request.getParameter(</span><span class="string">"code"</span><span>); </span></span></li><li class=""><span>HttpSession session = request.getSession(); </span></li><li class="alt"><span>String sessionCode = (String) session.getAttribute(<span class="string">"code"</span><span>); </span></span></li><li class=""><span><span class="keyword">if</span><span> (!StringUtils.equalsIgnoreCase(code, sessionCode)) { </span><span class="comment">//忽略验证码大小写 </span><span> </span></span></li><li class="alt"><span> <span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> RuntimeException(</span><span class="string">"验证码对应不上code="</span><span> + code + </span><span class="string">" sessionCode="</span><span> + sessionCode); </span></span></li><li class=""><span>} </span></li></ol></div><pre class="java" name="code" style="display: none;">String code = request.getParameter("code");
HttpSession session = request.getSession();
String sessionCode = (String) session.getAttribute("code");
if (!StringUtils.equalsIgnoreCase(code, sessionCode)) { //忽略验证码大小写
throw new RuntimeException("验证码对应不上code=" + code + " sessionCode=" + sessionCode);
} </pre><br><br> </div> </div>