struts验证码


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class CheckCode extends HttpServlet {
private static int WIDTH = 60;
private static int HEIGHT = 25;
public void doGet(HttpServletRequest request, HttpServletResponse response) {
try{
HttpSession session = request.getSession();
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 创建内存图象并获得其图形上下文
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生随机的认证码
char[] rands = generateCheckCode();
// 产生图像
drawBackground(g);
drawRands(g, rands);
// 结束图像 的绘制 过程, 完成图像
g.dispose();
// 将图像输出到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf = bos.toByteArray();
response.setContentLength(buf.length);
// 下面的语句也可写成: bos.writeTo(sos);
sos.write(buf);
bos.close();
sos.close();
// 将当前验证码存入到 Session 中
session.setAttribute("check_code", new String(rands));
// 直接使用下面的代码将有问题, Session 对象必须在提交响应前获得
// request.getSession().setAttribute("check_code",new String(rands));
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 定义验证码的字符表
* @return
*/
private char[] generateCheckCode() {
String chars = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] rands = new char[4];
for (int i = 0; i < 4; i++) {
int rand = (int) (Math.random() * 61);
rands[i] = chars.charAt(rand);
}
return rands;
}
/**
* 划出随机数值
* @param
* @param rands
*/
private void drawRands(Graphics g, char[] rands) {
g.setColor(Color.BLUE);
g.setFont(new Font(null, Font.PLAIN | Font.PLAIN, 18));
g.drawString("" + rands[0], 1, 17);
g.drawString("" + rands[1], 16, 15);
g.drawString("" + rands[2], 31, 18);
g.drawString("" + rands[3], 46, 16);
//System.out.println(rands);
}
/**
* 画图片背景
* @param g
*/
private void drawBackground(Graphics g) {
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);
// 随机产生 120 个干扰点
for (int i = 0; i < 120; i++) {
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);
}
}
/**
* 验证用户输入的验证码
* @param request
* @param response
* @return
*/
public boolean checkLook(HttpServletRequest request, HttpServletResponse response,String check){
response.setContentType("text/html;charset=GB2312");
try{
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(false);
check = check.toLowerCase(); //把用户输入的验证码转换成小写
if(session == null)
return false;
String savedCode = (String)session.getAttribute("check_code");
savedCode = savedCode.toLowerCase(); //把存到session里的值转换成小写
if(savedCode == null)
return false;
if(!savedCode.equals(check))
return false;
}catch(Exception e){
e.printStackTrace();
}
return true;
}
}
设置web.xml
<servlet>
<servlet-name>CheckCode</servlet-name>
<servlet-class>com.hot35.common.dao.CheckCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckCode</servlet-name>
<url-pattern>/code/CheckCode</url-pattern> //这个里的值可以随便写
</servlet-mapping>
HTML中:
<img src="/code/CheckCode" name=""></img> //这个src与web.xml中的<url-pattern>中的值一样
Action 中:
当用户操作成功后,注意把session中的验证码清空: request.getSession(false).removeAttribute("check_code");
这样可以防止用户不停的做某个操作.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值