(Java 功能篇) Java 验证码

哈哈 阅读:572 2021-04-01 10:17:15 评论:0

为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下;这是一个web工程,首先是页面,这里只是一个显示验证码页面index.jsp,使用默认生成的就可以了,表单没有做提交,如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>验证码</title> 
    <script type="text/javascript"> 
    function refresh(obj) { 
        obj.src = "imageServlet?"+Math.random(); 
    } 
    </script> 
  </head> 
  <body> 
    <form action="checkServlet" method="post"> 
        <label>输入验证码</label><br/> 
        <input type="text" name="randomCode"/><img title="点击更换" onclick="javascript:refresh(this);" src="imageServlet"><br/> 
        <input type="submit" value="submit"> 
    </form> 
  </body> 
</html>

下面是后台代码,这里是一个Servlet,不要忘记在web.xml中配置请求url

package com.wf.web; 
 
import java.io.IOException; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class ImageServlet extends HttpServlet { 
 
    private static final long serialVersionUID = 1L; 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
 
        response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片 
        response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setDateHeader("Expire", 0); 
        RandomValidateCode randomValidateCode = new RandomValidateCode(); 
        try { 
            randomValidateCode.getRandcode(request, response);//输出图片方法 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doGet(request, response); 
    } 
 
}

这个类是生成验证码的方法,如下

package com.wf.web; 
 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.util.Random; 
 
import javax.imageio.ImageIO; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
public class RandomValidateCode { 
 
    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key 
    private Random random = new Random(); 
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串 
     
    private int width = 80;//图片宽 
    private int height = 26;//图片高 
    private int lineSize = 40;//干扰线数量 
    private int stringNum = 4;//随机产生字符数量 
    /* 
     * 获得字体 
     */ 
    private Font getFont(){ 
        return new Font("Fixedsys",Font.CENTER_BASELINE,18); 
    } 
    /* 
     * 获得颜色 
     */ 
    private Color getRandColor(int fc,int bc){ 
        if(fc > 255) 
            fc = 255; 
        if(bc > 255) 
            bc = 255; 
        int r = fc + random.nextInt(bc-fc-16); 
        int g = fc + random.nextInt(bc-fc-14); 
        int b = fc + random.nextInt(bc-fc-18); 
        return new Color(r,g,b); 
    } 
    /** 
     * 生成随机图片 
     */ 
    public void getRandcode(HttpServletRequest request, 
            HttpServletResponse response) { 
        HttpSession session = request.getSession(); 
        //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); 
        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作 
        g.fillRect(0, 0, width, height); 
        g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18)); 
        g.setColor(getRandColor(110, 133)); 
        //绘制干扰线 
        for(int i=0;i<=lineSize;i++){ 
            drowLine(g); 
        } 
        //绘制随机字符 
        String randomString = ""; 
        for(int i=1;i<=stringNum;i++){ 
            randomString=drowString(g,randomString,i); 
        } 
        session.removeAttribute(RANDOMCODEKEY); 
        session.setAttribute(RANDOMCODEKEY, randomString); 
        System.out.println(randomString); 
        g.dispose(); 
        try { 
            ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    /* 
     * 绘制字符串 
     */ 
    private String drowString(Graphics g,String randomString,int i){ 
        g.setFont(getFont()); 
        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121))); 
        String rand = String.valueOf(getRandomString(random.nextInt(randString.length()))); 
        randomString +=rand; 
        g.translate(random.nextInt(3), random.nextInt(3)); 
        g.drawString(rand, 13*i, 16); 
        return randomString; 
    } 
    /* 
     * 绘制干扰线 
     */ 
    private void drowLine(Graphics g){ 
        int x = random.nextInt(width); 
        int y = random.nextInt(height); 
        int xl = random.nextInt(13); 
        int yl = random.nextInt(15); 
        g.drawLine(x, y, x+xl, y+yl); 
    } 
    /* 
     * 获取随机的字符 
     */ 
    public String getRandomString(int num){ 
        return String.valueOf(randString.charAt(num)); 
    } 
}

这里附带吧web.xml也加上吧,希望对初学者有帮助

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5"  
    xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
  <servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class>com.wf.web.ImageServlet</servlet-class> 
  </servlet> 
 
  <servlet-mapping> 
    <servlet-name>ImageServlet</servlet-name> 
    <url-pattern>/imageServlet</url-pattern> 
  </servlet-mapping> 
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
  </welcome-file-list> 
</web-app>

就这么多,验证码是保存在session中的,或者cookie也行,但都要必须及时清除

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号