验证码功能

来源:互联网 发布:网络协议分析软件 编辑:程序博客网 时间:2024/05/22 15:09

验证码生成类:

import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.geom.Line2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 验证码生成类 * @author 30869 * */public class PictureCheckCode extends HttpServlet {Random random = new Random();public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置不缓存图片response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "No-cache");response.setDateHeader("Expires", 0);// 提定生成的响应图片,一定不能缺少这句话,否则错误response.setContentType("image/jpeg");int width = 80, height = 35;// 指定生成验证码的宽和高BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();// 创建Graphics对象,其作用相当于画笔Graphics2D g2d = (Graphics2D) g;// 创建Graphics2D对象,提供了几何形状,坐标转换、字体、颜色布局等Font mFont = new Font("楷体", Font.BOLD, 16);// 定义字符g.setColor(getRandColor(200, 250));// 设置背景g.fillRect(0, 0, width, height);// 绘制背景g.setFont(mFont);// 设置字体// 绘制100条颜色的位置全部为随机产生的线条,该线条为2ffor (int i = 0; i < 100; i++) {int x = random.nextInt(width - 1);int y = random.nextInt(height - 1);int x1 = random.nextInt(6) + 1;int y1 = random.nextInt(12) + 1;BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);Line2D line = new Line2D.Double(x, y, x + x1, y + y1);g2d.setStroke(bs);g2d.draw(line);// 绘制直线}// 输出右英文、数字、和中文随机组成的验证文字,具体的组合方式根据生成随机数确定String sRand = "";// 最后生成的验证码String ctmp = "";// 每次生成 的字符int itmp = 0;// 制定输出的验证码为四位for (int i = 0; i < 4; i++) {switch (random.nextInt(3)) {case 1:// 生成A-Z的字母itmp = random.nextInt(26) + 65;ctmp = String.valueOf((char) itmp);break;case 2:String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8","9", "a", "b", "c", "d", "e", "f" };// 生成第一位区码int r1 = random.nextInt(3) + 11;String str_r1 = rBase[r1];// 生成第二位区码int r2;if (r1 == 13) {r2 = random.nextInt(7);} else {r2 = random.nextInt(16);}String str_r2 = rBase[r2];// 生成第一位位码int r3 = random.nextInt(6) + 10;String str_r3 = rBase[r3];// 生成第二位位码int r4;if (r3 == 10) {r4 = random.nextInt(15) + 1;} else if (r3 == 15) {r4 = random.nextInt(15);} else {r4 = random.nextInt(16);}String str_r4 = rBase[r4];// 将生成的机内码转换为汉字byte[] bytes = new byte[2];// 将生成的区码保存到字节数组的第一个元素中String str_12 = str_r1 + str_r2;int tempLow = Integer.parseInt(str_12, 16);bytes[0] = (byte) tempLow;// 将生成的位码保存到字节数组的第二个元素中String str_34 = str_r3 + str_r4;int tempHigh = Integer.parseInt(str_34, 16);bytes[1] = (byte) tempHigh;ctmp = new String(bytes);break;default:itmp = random.nextInt(10) + 48;ctmp = String.valueOf((char) itmp);break;}sRand += ctmp;Color color = new Color(20 + random.nextInt(100),20 + random.nextInt(100), random.nextInt(100));g.setColor(color);// 将生成的随机数进行随机缩放并旋转制定角度PS,建议不要对文字进行缩放和旋转,因为这样图片可能不能正常显示// 将文字旋转制定角度Graphics2D g2d_word = (Graphics2D) g;AffineTransform trans = new AffineTransform();trans.rotate((45) * 3.14 / 180, 15 * i + 8, 7);// 缩放文字float scaleSize = random.nextFloat() + 0.8f;if (scaleSize > 1f) {scaleSize = 1f;}trans.scale(scaleSize, scaleSize);g2d_word.setTransform(trans);g.drawString(ctmp, 15 * i + 18, 14);}HttpSession session = request.getSession(true);session.setAttribute("randCheckCode", sRand);System.out.println(sRand);g.dispose();// 释放g所占用的系统资源ImageIO.write(image, "JPEG", response.getOutputStream());// 输出图片}/** * 生成随机颜色 *  * @param start * @param end * @return */public Color getRandColor(int start, int end) {if (start > 255) {start = 255;}if (end > 255) {end = 255;}int r, g, b;r = start + random.nextInt(end - start);// 随机生成红g = start + random.nextInt(end - start);// 随机生成绿b = start + random.nextInt(end - start);// 随机生成蓝return new Color(r, g, b);}}

jsp页面:

<%@page import="cn.lilin.jstl.entity.User"%><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>JSTL综合应用</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--><script language=javascript"">function myReload() {var img = document.getElementById("CreateCheckCode");img.src = PictureCheckCode + "?nocache" + new Date().getTime();}</script></head><body><%request.setCharacterEncoding("UTF-8");String userName = request.getParameter("userName");String password = request.getParameter("password");String cmdStr = request.getParameter("cmdStr");//用于区分是否提交表单if ("post".equals(cmdStr)) {if (userName.equals("李林") && password.equals("123456")) {User user = new User();user.setUserName(userName);user.setPassword(password);user.setRole("财务部");request.getSession().setAttribute("user", user);} else {request.setAttribute("errMsg", "用户名或密码不正确");}}%><c:choose><%--如果user为空,显示登录框 --%><c:when test="${empty user }"><form id="login" method="post" action="servlet/TestServlet"><input type="hidden" value="post" name="cmdStr" /><%--输出错误提示 --%><c:if test="${not empty errMsg}"><div style="color:red">${errMsg }</div><c:remove var="errMsg" /></c:if><table><tr><%--显示登录框 --%><tr><td>用户名:<input type="text" name="userName" id="userName" /></td></tr><tr><td>密码:<input type="password" name="password" id="password" /></td><td></tr><tr><td>验证码:<input type="text" name="checkCode"style="width:70px;height:35px" /> <imgsrc="servlet/PictureCheckCode" id="CreateCheckCode"align="middle" style="margin-top:-10px" /><br /> <ahref="login.jsp" onclick="myRelode()"style="font-size:12px;color:red;margin-left:156px">看不清。换一个</a></td></tr></tr></table><input type="submit" value="登录" /></form></c:when><%--登录成功 --%><c:otherwise><c:choose><c:when test="${user.role eq '部门经理' }">部门经理页面</c:when><c:when test="${user.role eq '总监' }">总监页面</c:when><c:when test="${user.role eq '前台' }">前台页面</c:when><c:otherwise>员工页面</c:otherwise></c:choose></c:otherwise></c:choose></body></html>


原创粉丝点击