关于java生成验证码

本文介绍了一种使用外部txt文件生成包含成语的验证码的方法,以及另一种生成数字与字母大小写组合的验证码的方法。前者利用了Java Servlet技术从txt文件中随机读取成语,后者则通过随机选择数字和字母来生成验证码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.读取外部txt文件生成二维码

 jsp:

   <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>验证码生成</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.7.2.js"></script>
<script type="text/javascript">  
  function myReload() {  
    document.getElementById("CreateCheckCode").src =   
        document.getElementById("CreateCheckCode").src+ "?nocache=" + new Date().getTime();  
  }  
</script>  
</head>
<body>
      <p style="margin-left:40%;color:blue;">验证码生成</p>
      <div style="margin-left:30%;margin-top:5%">
   <form action="${pageContext.request.contextPath}/loginServlet" method="post">
               验证码:<input type="text" name = "checkCode" style="width:80px;height:35px;"/>               
            
       <!--  验证码是外部成语组合: -->        
       <img src="${pageContext.request.contextPath}/phraseCode" id="CreateCheckCode" align="middle" 
               style="margin-top:-10px;"> <br/> 
               
       <a href="" οnclick="myReload()" 
               style="font-size:12px;color:red;margin-left:156px;">
                                   看不清,换一个</a> <br/>       
       <input type="submit" value="Submit" 
               style="width:240px;height:35px;background:#f19e28"/>
   </form>
      </div>
</body>

</html>

后台部分:

 1.处理登陆请求

  package com.imgcode;


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * 处理登录请求
 */
@WebServlet("/loginServlet")
public class ImgCode extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    
    public ImgCode() {
        super();   
    }


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


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
String code = request.getParameter("checkCode");
HttpSession session = request.getSession();
if(!code.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){
request.setAttribute("errormsg", "验证码不正确");
response.getWriter().print("<script> type='text/javascript'>window.alert('*验证码错误!');window.location.href='jsp/imgCode.jsp'</script>");
}
response.getWriter().println("<script> type='text/javascript'>window.alert('*验证码校验成功!');window.location.href='jsp/imgCode.jsp'</script>");  
     response.getWriter().print("验证码校验成功");      
     
}

}

2.  验证码生成类

说明:外部txt文件里面时存放的四字成语,成语的个数一定要大于随机读取成语的数字,及对应的randomChar()方法里面

的参数num的值;

package com.imgcode;

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.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * 验证码-- 成语验证
 */
@WebServlet("/phraseCode")
public class PhraseCode extends HttpServlet {
private static final long serialVersionUID = 1L;

public PhraseCode() {
super();
}


/**
* @Title: getRandom 
* @Description: 该方法主要作用是获得随机生成的颜色
* @param @param s
* @param @param e
* @param @return    设定文件 
* @return Color    返回类型 
* @throws
*/
public Color getRandColor(int s,int e){
Random random = new Random();
if(s > 255){
s = 255;
}
if(e > 255){
e = 255;
}
int r,g,b;
r = s + random.nextInt(e - s);
g = s + random.nextInt(e - s);
b = s + random.nextInt(e - s);
return new Color(r,g,b);
}

        
//读取code验证码文件
//验证码为txt成语文件
private String randomChar(){
List<String> fileList = FileUtils.getFile(null);
//List<String> asList = Arrays.asList(code);
Random ran = new Random();
int num = ran.nextInt(149);//随机定位个数并读取相应位置的成语
System.out.println(num);
String codes = fileList.get(num);
return codes;
}


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


//doPost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");


//设置不缓存图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);  


//指定生成的响应图片,一定不能缺少这句话,否则错误.  
response.setContentType("image/jepg");
//制定生成验证码的宽度和高度
int width = 80;
int height = 35;


// 创建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 font = new Font("楷体", Font.BOLD, 16);
g.setColor(getRandColor(200,250));
// 绘制背景  
g.fillRect(0, 0, width, height);
//设置字体
g.setFont(font);
g.setColor(getRandColor(180, 200)); 


// 绘制100条颜色和位置全部为随机产生的线条,该线条为2f  
for (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);
}




//用来保存验证码字符串文本内容  
StringBuilder sb = new StringBuilder();
//验证码为txt成语文件时
String sTemp = String.valueOf(randomChar());
sb.append(sTemp);
Color color = new Color(20 + random.nextInt(110),
20 + random.nextInt(110),random.nextInt(110));
g.setColor(color);


// 将生成的随机数进行随机缩放并旋转制定角度 PS.
// 建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示 


//将文字旋转制定角度
Graphics2D g2d_word = (Graphics2D) g;  
AffineTransform trans = new AffineTransform();  
//trans.rotate((22) * 3.14 / 180, 15 + 8, 1); 


//说明:rotate([angle] [px,py])
// [angle] : 旋转角度。 由于屏幕坐标和数学坐标的Y轴相反,所以向左旋转为正角度值。
// [px,py] : 旋转的中心点。参数缺省默认为圆点(0,0)。
trans.rotate(10*Math.PI/180);  


// 缩放文字  
float scaleSize = random.nextFloat() + 1f;  
if (scaleSize > 1f)  
scaleSize = 1f;  
trans.scale(scaleSize, scaleSize);  
g2d_word.setTransform(trans);  
g.drawString(sTemp,10, 14); //说明drawString(取到的值,距离左边,距离上边)


HttpSession session = request.getSession(true);
session.setAttribute("randCheckCode", sb.substring(0, 4).toString());
System.out.println("随机验证码="+sb.substring(0, 4).toString());
// 释放g所占用的系统资源  
g.dispose(); 
// 输出图片  
ImageIO.write(image, "JPEG", response.getOutputStream()); 
}

}

3.工具类,读取外部txt文件

package com.imgcode;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;


/** 
 * @ClassName: FileUtils 
 * @Description: 读取文本验证码文件
 * @author lhz
 * @date 2018年6月21日 上午12:33:46 
 */
public class FileUtils{

public static List<String> getFile(HttpServletRequest request){


FileReader fis = null;
BufferedReader bis = null;
String str = null;

try {
List<String> list = new ArrayList<String>();
File file  = new File("F:/eclipsework/video/src/com/imgcode/code.txt");
fis = new FileReader(file);
bis = new BufferedReader(fis);



while((str = bis.readLine()) != null){
String[] split = str.split(",");
for(int i = 0;i < split.length;i++){
list.add(split[i]);
}
}
return list;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}

if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}

}

生成后效果:

 

二.生成数字+字母大小写组合的验证码

  jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>验证码生成</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.7.2.js"></script>
<script type="text/javascript">  
  function myReload() {  
    document.getElementById("CreateCheckCode").src =   
        document.getElementById("CreateCheckCode").src+ "?nocache=" + new Date().getTime();  
  }  
</script>  
</head>
<body>
      <p style="margin-left:40%;color:blue;">验证码生成</p>
      <div style="margin-left:30%;margin-top:5%">
   <form action="${pageContext.request.contextPath}/loginServlet" method="post">
               验证码:<input type="text" name = "checkCode" style="width:80px;height:35px;"/>
               
            <!--  验证码是字母+数字组合: -->   
       - <img src="${pageContext.request.contextPath}/pictureCheckCode" id="CreateCheckCode"         align="middle"  style="margin-top:-10px;"> <br/>                               
       <a href="" οnclick="myReload()" 
               style="font-size:12px;color:red;margin-left:156px;">
                                   看不清,换一个</a> <br/>       
       <input type="submit" value="Submit" 
               style="width:240px;height:35px;background:#f19e28"/>
   </form>
      </div>
</body>
</html>

后台部分:

  1.处理登录请求:

   package com.imgcode;


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * 处理登录请求
 */
@WebServlet("/loginServlet")
public class ImgCode extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    
    public ImgCode() {
        super();
    }


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


//doPost
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
String code = request.getParameter("checkCode");
HttpSession session = request.getSession();
if(!code.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){
request.setAttribute("errormsg", "验证码不正确");
response.getWriter().print("<script> type='text/javascript'>window.alert('*验证码错误!');window.location.href='jsp/imgCode.jsp'</script>");
}
response.getWriter().println("<script> type='text/javascript'>window.alert('*验证码校验成功!');window.location.href='jsp/imgCode.jsp'</script>");  
     response.getWriter().print("验证码校验成功");          
     
}

}

2.验证码生成类

  package com.imgcode;


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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


/**
 * 验证码生成 包括:字母 + 数字 
 * private String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";
 * 
 */
@WebServlet("/pictureCheckCode")
public class PictureCheckCode extends HttpServlet {
private static final long serialVersionUID = 1L;



public PictureCheckCode() {
super();
}


/**
* @Title: getRandom 
* @Description: 该方法主要作用是获得随机生成的颜色
* @param @param s
* @param @param e
* @param @return    设定文件 
* @return Color    返回类型 
* @throws
*/
public Color getRandColor(int s,int e){
Random random = new Random();
if(s > 255){
s = 255;
}
if(e > 255){
e = 255;
}
int r,g,b;
r = s + random.nextInt(e - s);
g = s + random.nextInt(e - s);
b = s + random.nextInt(e - s);
return new Color(r,g,b);
}


private Random r = new Random();
// 随机字符集合中不包括0和o,O,1和l,因为这些不易区分   
private String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";

//验证码code为随机字母+数子时:
private char randomChar(){
int index = r.nextInt(codes.length());
return codes.charAt(index);
}


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


//doPost
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");


//设置不缓存图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);  


//指定生成的响应图片,一定不能缺少这句话,否则错误.  
response.setContentType("image/jepg");
//制定生成验证码的宽度和高度
int width = 80;
int height = 35;


// 创建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 font = new Font("楷体", Font.BOLD, 16);
g.setColor(getRandColor(200,250));
// 绘制背景  
g.fillRect(0, 0, width, height);
//设置字体
g.setFont(font);
g.setColor(getRandColor(180, 200)); 


// 绘制100条颜色和位置全部为随机产生的线条,该线条为2f  
for (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);
}




//用来保存验证码字符串文本内容  
StringBuilder sb = new StringBuilder();
//随机生成4个数字 ----code是字母+数字组合式
for(int i = 0;i<4;i++){
String sTemp = String.valueOf(randomChar());
sb.append(sTemp);
Color color = new Color(20 + random.nextInt(110),
20 + random.nextInt(110),random.nextInt(110));
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(sTemp, 15 * i + 18, 14);  
}




HttpSession session = request.getSession(true);
//验证码为字母 + 数字 组合式:
session.setAttribute("randCheckCode", sb.toString());
System.out.println("随机验证码="+sb.toString());
// 释放g所占用的系统资源  
g.dispose(); 
// 输出图片  
    ImageIO.write(image, "JPEG", response.getOutputStream()); 
}
}

生成后效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值