构建基于maven的综合项目(五)--验证码

一、常用注册验证码
1、servlet(需要配web.xml)或controller(需要配springMVC.xml)

package com.cpkf.notpad.controller.commonController;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Filename: VisualCodeController.java
* Description: 验证码控制器
* Company:
* @author: Jiang.hu
* @version: 1.0
* Create at: May 30, 2011 4:00:17 PM
* modified:
*/
@Controller
public class VisualCodeController {
@RequestMapping(value="visualCode.do",method={RequestMethod.GET,RequestMethod.POST})
public void getVisualCode(HttpServletRequest request,HttpServletResponse response){
//设定图片长宽
int width = 68;
int height = 22;
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
//得到缓冲区Graphics对象
Graphics graphics = img.getGraphics();
//画背景,颜色浅
graphics.setColor(getRandColor(200, 250));
graphics.fillRect(0, 0, width, height);
//画边框
graphics.setColor(getRandColor(0, 255));
graphics.drawRect(0, 0, width - 1, height - 1);
//随机产生两条干扰线
graphics.setColor(getRandColor(160, 200));
Random random = new Random();
for(int i = 0;i < 2;i ++){
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
graphics.drawLine(x, y, x1, y1);
}
//随机产生几个点
graphics.setColor(getRandColor(160, 200));
for(int i = 0;i < 10;i ++){
int x = random.nextInt(width);
int y = random.nextInt(height);
graphics.drawLine(x, y, x, y);
}
//随机产生四个字符,并设置其颜色、字体、大小以及位置
Font font = new Font("Times New Roman",Font.ITALIC | Font.BOLD, 22);
StringBuffer sb = new StringBuffer();
char[] ch = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
int index,length = ch.length;
for(int i = 0;i < 4;i ++){
index = random.nextInt(length);
graphics.setColor(getRandColor(20, 130));
graphics.setFont(font);
graphics.drawString("" + ch[index], (i * 15) + 3, 18);
sb.append(ch[index]);
}
//字符串放入session
request.getSession().setAttribute("checkCode", sb.toString());
//生成图片
graphics.dispose();
//禁止图像缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//创建二进制输出流并输出
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
ImageIO.write(img, "jpeg", sos);
sos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(sos != null){
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public Color getRandColor(int lower,int upper){
Random random = new Random();
lower = lower > 255 ? 255 : lower;
lower = lower < 1 ? 1 : lower;
upper = upper > 255 ? 255 : upper;
upper = upper < 1 ? 1 : upper;
if(lower > upper){
int temp = upper;
upper = lower;
lower = temp;
}
int r = lower + random.nextInt(upper - lower);
int g = lower + random.nextInt(upper - lower);
int b = lower + random.nextInt(upper - lower);;
return new Color(r, g, b);
}
}

2、jsp

<img id="visualCode" alt="visualCode" src="<c:url value='/visualCode.do'/>">
<a href="javascript:reloadVerifyCode();"><spring:message code="message.account.visualCode.notClear"/></a>

3、js

/*
* 改变图片链接,如果自己构造url,需要在页面添加base属性,动态添加前缀
* 用下面的方式可以自动保存前缀
* */
function reloadVerifyCode(){
var imgSrc = $("#visualCode");
var src = imgSrc.attr("src");
imgSrc.attr("src",changeUrl(src));
}
function changeUrl(url){
var timeNow = new Date().getTime();
if((url.indexOf("?")) >= 0){
url = url.substring(0,url.indexOf("=") + 1);
url = url + timeNow;
} else {
url = url + "?time=" + timeNow;
}
return url;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值