自己写的超简洁利用Servlet生成随机验证的图片

下午在JAVAEYE逛了一会 手有点痒了 可是一时又不知道写点什么 于是想起来几个月前 有位网友问我的 网站的随机图片的生成的问题 当时没有太在意 因为这个东西没有深接触过 只是知道有这种轻量级的东西 况且网上一GOOGLE会有一大片 出于好奇 俺动手写了一写 写的DEMO级别的 超简单 好了 俺上代码

下面我说一下思路吧 首先是随机图片的生成过程 绘制出一定尺寸的图片,产生一组随机数,一般是4个。这里要记得 要把产生的随机数存入到session里面 因为后面的校验还要用到。校验的时候就是获取用户的输入的验证码与session里面已经存取的那个做比较,匹配 则放行。


首先是Login.jsp
<h1> 带有验证码的登录的页面</h1>
<form action="servlet/LogonServlet" method="post">

用户名 : <input type="text" name="name" /><br/>

密 码 : <input type="text" name="password" /><br/>

验证码 : <input type="text" name="check_code" />
<img src="servlet/CheckCodeServlet"><br/>

<input type="submit" value="登录"/>


然后是产生图片的Servlet CheckCodeServlet 写图片的样式绘制的时候比较郁闷 很少用 所以查了一会API 不过最后终于搞定 不过不是很漂亮。。。。随机生成120个干扰点
这个没有实现。。。

package com.blacklee.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

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

/**
* Servlet implementation class CheckCodeServlet
*/
public class CheckCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private static int WIDTH = 60;
private static int HEIGHT = 20;
/**
* @see HttpServlet#HttpServlet()
*/
public CheckCodeServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
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 = createCheckCode();

//产生图像

drawBackGround(g);
drawRands(g,rands);

//结束图像的绘制

g.dispose();

//将图像输出到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
ImageIO.write(image, "JPEG", bos);
byte[] buff = bos.toByteArray();

response.setContentLength(buff.length);

//写入到页面的输出流里面去 简单的写可以这样写 bos.writeTo(sos);

sos.write(buff);
bos.close();
sos.close();
//把当前生成的验证码存进session里面去
session.setAttribute("check_code", new String(rands));



}

private void drawRands(Graphics g, char[] rands) {
// TODO Auto-generated method stub
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.BOLD, 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);

}

private void drawBackGround(Graphics g) {
// TODO Auto-generated method stub
//画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);
//随机生成120个干扰点

}

private char[] createCheckCode() {
//定义验证码的字符集
String chars = "0123456789abcdefghigklmnopqrstuvwxyz";
char[] rands1 = new char[4];
for(int i = 0 ; i<4 ;i++){
rands1[i] = chars.charAt(new Random().nextInt(37));
}
return rands1;
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}


然后是校验的servlet LogonServlet
package com.blacklee.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
* Servlet implementation class LogonServlet
*/
public class LogonServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LogonServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();

HttpSession session = request.getSession(false);

if(session==null){
writer.println("验证码处理问题!!!!");
return ;
}
String saveCode = (String) session.getAttribute("check_code");
if(saveCode==null){
writer.println("验证码处理问题!!!");
return ;
}
String checkCode = request.getParameter("check_code");

if(!saveCode.equals(checkCode)){
writer.println("验证码错误");
return ;
}

session.removeAttribute("check_code");
writer.println("验证通过服务器正在校验用户名和密码");
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}


程序到了这里大体上就完成了 很简单的一个demo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值