`
Javac_MyLife
  • 浏览: 9136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

自己写的超简洁利用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 

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics