Servlet简单验证码的实现
1.生成验证码图片:RandomValidateCode.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class RandomValidateCode {
public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key
private Random random = new Random();
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
private int width = 80;//图片宽
private int height = 26;//图片高
private int lineSize = 20;//干扰线数量
private int stringNum = 4;//随机产生字符数量
/*
* 获得字体
*/
private Font getFont(){
return new Font("Fixedsys",Font.CENTER_BASELINE,18);
}
/*
* 获得颜色
*/
private Color getRandColor(int fc,int bc){
if(fc > 255)
fc = 255;
if(bc > 255)
bc = 255;
int r = fc + random.nextInt(bc-fc-16);
int g = fc + random.nextInt(bc-fc-14);
int b = fc + random.nextInt(bc-fc-18);
return new Color(r,g,b);
}
/**
* 生成随机图片
*/
public void getRandcode(HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession();
//BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
g.setColor(getRandColor(110, 133));
//绘制干扰线
for(int i=0;i<=lineSize;i++){
drowLine(g);
}
//绘制随机字符
String randomString = "";
for(int i=1;i<=stringNum;i++){
randomString=drowString(g,randomString,i);
}
session.removeAttribute(RANDOMCODEKEY);
session.setAttribute(RANDOMCODEKEY, randomString);
System.out.println(randomString);
g.dispose();
try {
ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 绘制字符串
*/
private String drowString(Graphics g,String randomString,int i){
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
randomString +=rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13*i, 16);
return randomString;
}
/*
* 绘制干扰线
*/
private void drowLine(Graphics g){
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x+xl, y+yl);
}
/*
* 获取随机的字符
*/
public String getRandomString(int num){
return String.valueOf(randString.charAt(num));
}
}
2.把图片传到浏览器上的servlet:ImageServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public ImageServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
RandomValidateCode randomValidateCode = new RandomValidateCode();
try {
randomValidateCode.getRandcode(request, response);//输出图片方法
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}
3.web.xml添加映射(重要!!!):
<servlet-mapping >
<servlet-name>valid</servlet-name>
<url-pattern>/valid</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>valid</servlet-name>
<servlet-class>com.datanew.czfc.validateCode.ImageServlet</servlet-class>
</servlet>
注意匹配方式:
/* 1. 完全匹配 */ <url-pattern>/test/list.do</url-pattern> /* 2. 路径匹配 */ <url-pattern>/*</url-pattern> //匹配根路径下的全部请求 /* 3. 扩展名匹配 */ <url-pattern>*.do</url-pattern> //匹配.do结尾的请求 <url-pattern>*.html</url-pattern> //匹配全部html结尾的请求 <url-pattern>*</url-pattern> //不能用*,否则报错
4.jsp显示验证码图片和输入验证码:
<tr>
<td height="37" align="right"><span class="STYLE1">验证码:</span></td>
<td><input name="validCode" class="login_valid" maxlength="4"/> <img id="validCode" src="valid" οnclick="changeCode()" title="点击更换" /></td>
</tr>
或者:
<img id="validCode" src="valid" onClick="document.getElementById('validCode').src ='valid?rand='+new Date();" title="点击更换"/>
注意:有的地方的<img>标签中的src="/valid",此处有斜杠“/”,表示的是绝对路径,地址为:127.0.0.1:8080/valid (——8080后面少了项目名!)
5.刷新验证码的脚本(重要!):
/**方式一:测试失败——原因:src无变化!!!*/ /* function changeCode(){ document.getElementById("validCode").src="valid"; } * /**方式二:测试成功!*/ function changeCode(){ document.getElementById('validCode').src ='valid?rand='+new Date(); } /**方式三:Chrome测试成功!Firefox和IE测试失败!!!*/ function changeCode(){ var request = getXMLRequest();//得到XMLHttpRequest对象 request.onreadystatechange = function(){ if(request.readyState == 4){ document.getElementById("validCode").src = "valid";//改变验证码图片 } } //将请求发送出去 request.open("GET","valid",true); request.send(null); } function getXMLRequest(){ var request; try{ //for火狐等浏览器 request = new XMLHttpRequest(); }catch(e){ try{ //for IE request = new ActiveXObject("Microsoft.XMLHttp"); }catch(e){ alert("您的浏览器不支持AJAX!!!"); return null; } } return request; }
6.登录验证:
boolean valid = false;
String validCode = request.getParameter("validCode");
String oldCode = (String) request.getSession().getAttribute("RANDOMVALIDATECODEKEY");
if (validCode !=null && validCode.equalsIgnoreCase(oldCode)) {
valid = true;
}