一.读取外部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());
}
}
生成后效果: