动态校验码生成
java代码 校验码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
import javax.imageio.ImageIO;
public class VerifyCodeUtils {
public static final String VERIFY_CODES = "02345869";
private static Random random = new Random();
public static String generateVerifyCode(int verifySize){
return generateVerifyCode(verifySize, VERIFY_CODES);
}
public static String generateVerifyCode(int verifySize, String sources){
if(sources == null || sources.length() == 0){
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for(int i = 0; i < verifySize; i++){
verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));
}
return verifyCode.toString();
}
public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException{
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, outputFile, verifyCode);
return verifyCode;
}
public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException{
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, os, verifyCode);
return verifyCode;
}
public static void outputImage(int w, int h, File outputFile, String code) throws IOException{
if(outputFile == null){
return;
}
File dir = outputFile.getParentFile();
if(!dir.exists()){
dir.mkdirs();
}
try{
outputFile.createNewFile();
FileOutputStream fos = new FileOutputStream(outputFile);
outputImage(w, h, fos, code);
fos.close();
} catch(IOException e){
throw e;
}
}
public static void outputImage(int w, int h, OutputStream os, String code) throws IOException{
int verifySize = code.length();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5];
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.YELLOW };
float[] fractions = new float[colors.length];
for(int i = 0; i < colors.length; i++){
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
fractions[i] = rand.nextFloat();
}
Arrays.sort(fractions);
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, w, h);
Color c = getRandColor(200, 250);
g2.setColor(c);
g2.fillRect(0, 2, w, h-4);
Random random = new Random();
g2.setColor(getRandColor(160, 200));
for (int i = 0; i < 40; i++) {
int x = random.nextInt(w - 1);
int y = random.nextInt(h - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g2.drawLine(x, y, x + xl + 40, y + yl + 20);
}
float yawpRate = 0.1f;
int area = (int) (yawpRate * w * h);
for (int i = 0; i < area; i++) {
int x = random.nextInt(w);
int y = random.nextInt(h);
int rgb = getRandomIntColor();
image.setRGB(x, y, rgb);
}
shear(g2, w, h, c);
int nextInt = new Random().nextInt(2);
int fontSizes = h-20;
Font font = new Font("Algerian", Font.BOLD+ Font.ITALIC, fontSizes);
g2.setFont(font);
int fontSize = h-10;
font = new Font("Algerian", Font.BOLD+ Font.ITALIC, fontSize);
g2.setFont(font);
char[] chars = code.toCharArray();
Color randColorOne = getRandColorOne(new Random().nextInt(10));
for(int i = 0; i < verifySize; i++){
AffineTransform affine = new AffineTransform();
if (i !=3) {
affine.setToRotation(Math.PI /2* rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
}else{
affine.setToRotation(Math.PI /4* rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
}
g2.setTransform(affine);
g2.setColor(randColorOne);
g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i + 5, h/2 + fontSize/2 - 10);
}
g2.dispose();
ImageIO.write(image, "png", os);
}
private static Color getRandColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
private static Color getRandColorOne(int a) {
int[][] arr={{220,20,60},{75,0,130},{128,0,0},{139,0,0},{0,0,0},{0,100,0},{0,128,0},{0,100,0},{47,79,79},{0,0,128},{75,0,130}};
return new Color(arr[a][0],arr[a][1],arr[a][2]);
}
private static Color getRandColors(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
private static int getRandomIntColor() {
int[] rgb = getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private static int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
private static void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
private static void shearX(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = random.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
private static void shearY(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(50) + 10;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(i, 0, 1, h1, 0, (int) d);
if (borderGap) {
g.setColor(color);
g.drawLine(i, (int) d, i, 0);
g.drawLine(i, (int) d + h1, i, h1);
}
}
}
public static void outputImageErro(int w, int h, OutputStream os, String code) throws IOException{
int verifySize = code.length();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5];
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.YELLOW };
float[] fractions = new float[colors.length];
for(int i = 0; i < colors.length; i++){
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
fractions[i] = rand.nextFloat();
}
Arrays.sort(fractions);
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, w, h);
Color c = getRandColor(200, 250);
g2.setColor(c);
g2.fillRect(0, 2, w, h-4);
Random random = new Random();
g2.setColor(getRandColor(160, 200));
for (int i = 0; i < 40; i++) {
int x = random.nextInt(w - 1);
int y = random.nextInt(h - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g2.drawLine(x, y, x + xl + 40, y + yl + 20);
}
float yawpRate = 0.1f;
int area = (int) (yawpRate * w * h);
for (int i = 0; i < area; i++) {
int x = random.nextInt(w);
int y = random.nextInt(h);
int rgb = getRandomIntColor();
image.setRGB(x, y, rgb);
}
shear(g2, w, h, c);
int fontSize = h-4;
Font font = new Font("Algerian", Font.ITALIC, fontSize);
g2.setFont(font);
char[] chars = code.toCharArray();
Color randColorOne = getRandColorOne(new Random().nextInt(10));
for(int i = 0; i < verifySize; i++){
AffineTransform affine = new AffineTransform();
if (i !=3) {
affine.setToRotation(Math.PI /2* rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
}else{
affine.setToRotation(Math.PI /4* rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
}
g2.setTransform(affine);
g2.setColor(randColorOne);
g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i + 5, h/2 + fontSize/2 - 10);
}
g2.dispose();
ImageIO.write(image, "png", os);
}
public static void outputImageErroChinese(int w, int h, OutputStream os, String code) throws IOException{
int verifySize = code.length();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5];
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.YELLOW };
float[] fractions = new float[colors.length];
for(int i = 0; i < colors.length; i++){
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
fractions[i] = rand.nextFloat();
}
Arrays.sort(fractions);
g2.setColor(Color.GRAY);
g2.fillRect(0, 0, w, h);
Color c = getRandColor(200, 250);
g2.setColor(c);
g2.fillRect(0, 2, w, h-4);
Random random = new Random();
g2.setColor(getRandColor(160, 200));
shear(g2, w, h, c);
int fontSize = h-50;
Font font = new Font("Algerian", Font.ITALIC, fontSize);
g2.setFont(font);
char[] chars = code.toCharArray();
Color randColorOne = getRandColorOne(new Random().nextInt(10));
for(int i = 0; i < verifySize; i++){
AffineTransform affine = new AffineTransform();
g2.setTransform(affine);
g2.setColor(new Color(220,20,60));
g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i + 5, h/2 + fontSize/2 - 10);
}
g2.dispose();
ImageIO.write(image, "png", os);
}
public static void main(String[] args) throws IOException{
for (int i = 0; i <100; i++) {
}
File dir = new File("D://logs/");
int w = 350, h = 80;
String verifyCode = generateVerifyCode(4);
System.out.println(verifyCode);
File file = new File(dir, verifyCode + ".jpg");
outputImage(w, h,file,verifyCode);
}
}
生成校验码
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
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 org.apache.commons.lang.StringUtils;
@WebServlet("/Captcha")
public class CreateCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
LogEntity LOG = new LogEntity("ott_paymentexception");
HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader("x-frame-options", "Deny");
resp.setHeader("Pragma", "No-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setContentType("image/jpeg");
String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
req.getSession().setAttribute("CODEPAY", verifyCode.toLowerCase());
LOG.warn("verifyCode:["+verifyCode+"]");
int width = 350;
int height = 80;
VerifyCodeUtils.outputImage(width, height, resp.getOutputStream(), verifyCode);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
校验校验码
import java.io.IOException;
import java.net.URLDecoder;
import java.util.regex.Pattern;
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 org.apache.commons.lang.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import net.sf.json.JSONObject;
@WebServlet("/verifyCode")
public class VerifyCodeServlet extends HttpServlet {
private Logger logger = LogManager.getLogger("ott_paymentexception");
private static final long serialVersionUID = 1L;
private static final String aeskey="hebjemuYAhM=";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
LogEntity LOG = new LogEntity("ott_paymentexception");
req.getSession().removeAttribute("CODE");
JSONObject js=new JSONObject();
js.put("messageCode", "1");
js.put("message", "失败");
LOG.warn("请求为GET请求 报错");
resp.getWriter().println(js);
}
@SuppressWarnings("deprecation")
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String code = req.getParameter("code");
String verifySpId= (String) req.getSession().getAttribute("verifySpId");
String ip = getClientIpAddr(req);
if(code != null && code.equalsIgnoreCase(key)){
LOG.warn(" 校验码成功继续流程 :输入校验码:【"+code+ "】 生成校验码 【"+ key+"】");
String checkcode = StringUtil.randomCode(8);
req.getSession().setAttribute("checkcode",checkcode);
JSONObject js=new JSONObject();
js.put("messageCode", "0");
js.put("message", "成功");
js.put("code", code);
js.put("checkcode", checkcode);
resp.getWriter().println(js);
}else{
req.getSession().removeAttribute("CODE");
JSONObject js=new JSONObject();
js.put("messageCode", "1");
js.put("message", "失败");
LOG.warn(" 校验码失败 :输入校验码:【"+code+ "】 生成校验码 【"+ key+"】");
resp.getWriter().println(js);
}
}
public static boolean isNumber(String string) {
if (string == null)
return false;
Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");
return pattern.matcher(string).matches();
}
public static void main(String[] args) throws Exception {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
String str=" 111.11 ";
System.out.println( pattern.matcher(str).matches());
System.out.println( isNumber(str));
}
}
js代码
<%@ 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>
<%
String ftpPath = PayConfig.get().getConfig("ftp_path");
String path = request.getContextPath();
String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
%>
<%-- <script src="<%=path %>/js/code.js"></script> --%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src="<%=path %>/js/util.js"></script>
<style type="text/css">
body{
background-image: url(“输入背景图片”);
background-repeat: no-repeat;
width:1280px;
height:720px;
}
</style>
</head>
<body >
<img id="codeimg" style="position: absolute; left:725px; top: 238px; width: 160px; height: 52px;" src="获取校验码生成地址/Captcha" onclick="changeImg()">
<div style="position: absolute;top: 238px;left: 382px;width: 276px;height: 50px;border:1px solid #cccccc;border-radius: 3px;">
<input type="text" name="code" id="code" style="width:273px;height: 45px;font-size:30px;background:transparent;color:white; text-align:center;"/>
</div>
<div style="width:179px;height:79px;position:absolute;left:452px;top:312px;">
<a href="javascript:submit();" onfocus="mouseover(452,312,178,79,'<%=ftpPath %>/ott_payment_images/order/querenOn.png');" onblur="mouseout()">
<img src="<%=ftpPath %>/ott_payment_images/order/queren.png" class="img-rounded" style="width:178px;height:79px;"/>
</a>
</div>
<div style="width:179px;height:79px;position:absolute;left:647px;top:312px;">
<a href="javascript:cancelOrder();" onfocus="mouseover(647,312,178,79,'<%=ftpPath %>/ott_payment_images/order/fanhuiOn.png');" onblur="mouseout()">
<img src="<%=ftpPath %>/ott_payment_images/order/fanhui.png" class="img-rounded" style="width:178px;height:79px;"/>
</a>
</div>
<script type="text/javascript">
window.setInterval("changeImg()",90000);
function changeImg(){
var img = document.getElementById('codeimg');
img.src = "/Captcha?x=" + Math.floor(Math.random()*100)
}
var path= '<%=basePath %>';
function submit(){
var input = document.getElementsByTagName('input')[0];
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.response);
console.log(xhr.responseText);
var data=xhr.responseText;
var json=JSON.parse(data);
console.log("返回json "+json);
if ('0'==json.messageCode) {
alert(pagecode +" pagecode");
alert(path +" path");
var resultcode=json.code;
var resultcheckcode=json.checkcode;
window.location.href=""
}
if ('1'==json.messageCode) {
changeImg();
}
}
}
xhr.open('post','校验码地址/verifyCode' + input.value);
xhr.send();
}
</script>
</body>
</html>
技术交流群:809079777