您的位置:首页 > 编程语言 > Java开发

JAVA实现验证码的功能

2017-06-14 14:15 218 查看

前台页面
<form action="LoginCheck" method="post">
<table>
<tr><td><input name="checkCode"  id="checkCode" size="8" ,maxlength="4"/></td></tr>
<tr><td><img onclick="this.src='PictureCheckCode?'+new Date()" src="PictureCheckCode" alt="点击刷新验证码" width="80" height="25"/></td></tr>
<tr><td align="center"><input type="submit" value="登录"></td></tr>
</table>
</form>

java类

package com.lj.action;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Arc2D;
import java.awt.image.BufferedImage;
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;

public class PictureCheckCode extends HttpServlet {

private static final long serialVersionUID = -3235816079841410231L;

// 该方法主要作用是获得随机生成的颜色
public Color getRandColor() {
Random r = new Random();
Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
return c;
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doGet(req, resp);
}

@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 设置验证码的宽度和高度
int width = 160, height = 50;
// 创建BufferedImage对象,想到于一张画布
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 创建Graphics对象,相当于画笔
Graphics g = image.getGraphics();
// 创建Grapchics2D对象
Graphics2D g2d = (Graphics2D) g;
Random random = new Random();
// 定义字体样式
Font mfont = new Font("楷体", Font.BOLD, 40);
g.setColor(getRandColor());
// 绘制背景
g.fillRect(0, 0, width, height);
// 设置字体
g.setFont(mfont);
g.setColor(getRandColor());

// 绘制1条曲线作为干扰线,该线条为2f
BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL); // 定制线条样式
Shape arc = new Arc2D.Float(10, 20, 150, 150, 40, 100, Arc2D.OPEN);
g2d.setStroke(bs);
g2d.draw(arc);

// 输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。
String sRand = "";
String ctmp = "";
int itmp = 0;
// 制定输出的验证码为四位
for (int i = 0; i < 4; i++) {
switch (random.nextInt(2)) {
case 1: // 生成A-Z的字母
itmp = random.nextInt(26) + 65;
ctmp = String.valueOf((char) itmp);
break;
default:
itmp = random.nextInt(10) + 48;
ctmp = String.valueOf((char) itmp);
break;
}
sRand += ctmp;
Color color = new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), random.nextInt(110));
g.setColor(color);
// 绘制文字
g.drawString(ctmp, 30 * i + 20, 35);
}

// 把生成的文字放到session中
HttpSession session = request.getSession(true);
session.setAttribute("code", sRand);
System.out.println(session.getAttribute("code"));
g.dispose(); // 释放g所占用的系统资源

// 设置不缓存图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
// 指定生成的响应图片,一定不能缺少这句话,否则错误.
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(image, "jpeg", sos);
sos.close();
}
}


判断验证码的类
package com.lj.action;

import java.io.IOException;
import java.io.OutputStream;
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 LoginCheck extends HttpServlet {

/**
* 判断验证码
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");//转码
//得到项目路径
String basePath = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+req.getContextPath()+"/";
String checkCode=req.getParameter("checkCode");
String sessionCode=(String)req.getSession().getAttribute("code");
PrintWriter out=resp.getWriter();
if(checkCode==null || "".equals(checkCode)){
out.write("<script>alert('请输入验证码');location.href='"+basePath+"index.jsp'</script>");
}else if(!checkCode.equalsIgnoreCase(sessionCode)){
out.write("<script>alert('验证码错误');location.href='"+basePath+"index.jsp'</script>");
}else{
out.write("<script>alert('登录成功');location.href='"+basePath+"login.jsp'</script>");
}
out.flush();
out.close();
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doGet(req, resp);
}
}


效果图展示



本文大量参考了 "程序员-形同陌路" 的博客,只做了很少修改,大家可以去看他的博客,更详细。
博客地址:http://blog.csdn.net/lulei9876/article/details/8365500/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 验证码