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配置我就不写了。

图片效果如下,大家可以调一调颜色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值