验证码在页面的使用

包括验证码的图片生成,服务器对验证码的对比确认。
一、生成验证码图片的服务器端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>
密   码:<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="重新获取验证码" onclick=""/><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 {
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值