servlet實現驗證碼

驗證碼生成類代碼


package com.amyhi.util;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;


import javax.imageio.ImageIO;


public class CodeUtil {


private char[] codeChar = {'一','但','搞','A','b','1','6','s','w'};//字符庫
private int width = 150;
private int height = 40;
private int fontSize = 30;//字體大小
private int remote = 5;//偏移數
private int lenght = 4;//驗證碼長度
private String code = "";//驗證碼
private BufferedImage codeImg = null;

public CodeUtil() throws FileNotFoundException, IOException{
creatCode();
}
public void creatCode() throws FileNotFoundException, IOException{
//生成隨機數
Random random = new Random();
//獲取一個畫布
codeImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//獲取一支筆
Graphics g = codeImg.createGraphics();
//獲取隨機顏色並畫在背景上
g.setColor(new Color(200,197,197));
g.fillRect(0, 0, width, height);
//循環畫字符
int x = 10;
for(int i=0;i<lenght;i++){
int y = height/2;
String c = ""+codeChar[random.nextInt(codeChar.length)];
code += c;
//設置字體,隨機大小
int rem = random.nextInt(remote);//隨機偏移
int fSize = fontSize+rem;//字體大小縮放
y+=rem;//Y座標軸偏移
g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));//隨機顏色
g.setFont(new Font("黑體", Font.BOLD, fSize));
g.drawString(c, x, y);
x+=fSize+rem;//移動X軸
}
//添加隨機干擾
g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
for (int i = 0; i < 20; i++) {
int tempX = random.nextInt(width);
int tempY = random.nextInt(height);
int tempX2 = random.nextInt(width);
int tempY2 = random.nextInt(height);
g.drawLine(tempX, tempY, tempX2, tempY2);
}
//圖像生效
g.dispose();
ImageIO.write(codeImg, "JPEG", new FileOutputStream(new File("d:/test.jpg")));
}
public String getCode(){
return code;
}
public BufferedImage getCodeImg(){
return codeImg;
}
}

servlet生成驗證碼類

package com.amyhi.web;


import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;


import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import com.bbs.util.CodeUtil;


public class CodeAction extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
CodeUtil cu = new CodeUtil();
//獲取一個驗證碼字符,放入session
req.getSession().setAttribute("code", cu.getCode());
//將圖片渲染在Response中
ImageIO.write(cu.getImg(), "JPEG", resp.getOutputStream());
}



}


jsp頁面

<%@ page language="java" contentType="text/html; charset=utf8"
    pageEncoding="utf8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>hello</title>
</head>
<body>
<img alt="" src="./code">
</body>
</html>


比較驗證碼的代碼很簡單,從session中取出code,然後和用戶輸入的code比較一下就OK了,注意用完驗證碼之後記得清除或者改變,防止重複利用

package com.amyhi.web;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import com.bbs.model.User;
import com.bbs.service.UserService;
import com.bbs.service.imp.UserServiceImp;


public class UserAction extends HttpServlet{
private UserService service = new UserServiceImp();
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");//輸入框中的驗證碼
String sessionCode = (String) request.getSession().getAttribute("code");
if(!code.equals(sessionCode)){
request.getSession().removeAttribute("code");
request.getRequestDispatcher("./login.jsp").forward(request,
response);
}
request.getSession().removeAttribute("code");

}


web.xml配置我就不寫了。

圖片效果如下,大家可以調一調顏色

發佈了34 篇原創文章 · 獲贊 39 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章