验证码在页面的使用

包括验证码的图片生成,服务器对验证码的对比确认。
一、生成验证码图片的服务器端Servlet

package servlet;

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

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;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;

public class PicCodeServlet extends HttpServlet {
	// 验证码图片的宽度。
	 private int width=60;
	 // 验证码图片的高度。
	 private int height=20;
	
	public PicCodeServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//在内存中创建力图象
		BufferedImage buffImg=new BufferedImage(width,height,
                BufferedImage.TYPE_INT_RGB);
		//获取图形上下文
        Graphics2D g=buffImg.createGraphics();
    
      // 创建一个随机数生成器类。
        Random random=new Random();
      //设置背景色
        g.setColor(Color.WHITE);
        g.fillRect(0,0,width,height);
     
       // 创建字体,字体的大小应该根据图片的高度来定。
      Font font=new Font("Times New Roman",Font.PLAIN,18);
       // 设置字体。
       g.setFont(font);
      
       // 画边框。
        g.setColor(Color.BLACK);
        g.drawRect(0,0,width-1,height-1);
       
     // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
       g.setColor(Color.pink);
       for (int i=0;i<160;i++) {
           int x = random.nextInt(width);
           int y = random.nextInt(height);
           int xl = random.nextInt(12);
           int yl = random.nextInt(12);
           g.drawLine(x,y,x+xl,y+yl);
        }
        
        
       // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
       StringBuffer randomCode=new StringBuffer();
       int red=0,green=0,blue=0;
       
      // 随机产生4位数字的验证码。
       for (int i=0;i<4;i++) {
          // 得到随机产生的验证码数字。
          String strRand=String.valueOf(random.nextInt(10));
        
           // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
           red=random.nextInt(110);
           green=random.nextInt(50);
          blue=random.nextInt(50);
           
       // 用随机产生的颜色将验证码绘制到图像中。
           g.setColor(new Color(red,green,blue));
           g.drawString(strRand,13*i+6,16);
         
           // 将产生的四个随机数组合在一起。
          randomCode.append(strRand);
        }
       // 将四位数字的验证码保存到Session中。
       HttpSession session=request.getSession();
       session.setAttribute("randomCode",randomCode.toString());
//       request.setAttribute("randomCode",randomCode.toString());

       
        // 禁止图像缓存。
       response.setHeader("Pragma","no-cache");
       response.setHeader("Cache-Control","no-cache");
       response.setDateHeader("Expires", 0);
       response.setContentType("image/jpeg");
       
       // 将图像输出到Servlet输出流中。
      ServletOutputStream sos=response.getOutputStream();
      ImageIO.write(buffImg, "jpeg",sos);
      System.out.println("==========");
      sos.close();
	}

	public void init() throws ServletException {
		// Put your code here
	}

}


------------------------
二、前台页面登录login.jsp中验证码的输入(原始页面在struts下自动生成)

<%@ page language="java" pageEncoding="utf-8"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
  <head>
    <html:base />
    <title>login.jsp</title>

  </head>
  <body >
	<center>
<h1>欢迎光临!!!!!</h1>
<table border="1"><tr><td>
   	<form action="servlet/DoLoginServlet" method="post">
	用户名:<input type="text" id="username" /><br>
	密 &nbsp;&nbsp;码:<input type="password" id="password"/><br>
	验证码:<input type="text" name="validateCode" id="validateCode" size="5px" />
	<img id="img" src="servlet/PicCodeServlet"/>
<input type="button" value="重新获取验证码" οnclick=""/><br>
	<input type="submit" value="登录" /><input type="reset" id="reset" value="重置"/>
	</form>
</td></tr></table>
</center>
  </body>
</html:html>


----------------------
三、服务器端对验证码的对比确认

package 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;

public class DoLoginServlet extends HttpServlet {

	public DoLoginServlet() {
		super();
	}
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String code = request.getParameter("validateCode");
		System.out.println("inputCode ="+code);
		System.out.println("sessionCode ="+request.getSession().getAttribute("randomCode"));
		String randomCode = request.getSession().getAttribute("randomCode").toString();
		//把前台输入的验证码与服务器生成的验证码对比
		if(code.equals(randomCode)){
			System.out.println("验证码正确");
		}else{
			System.out.println("验证错误,请重新输入!");
		}
	}
	public void init() throws ServletException {
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值