自定义安全性高的验证机制
来源:互联网 发布:数据分类汇总步骤文字 编辑:程序博客网 时间:2024/05/20 06:06
由于科技手段的发达,图片内容识别已经很先进,传统的数字+字符验证码你在像客户端展示的时候太迷糊了导致用户体验度差,用户看不清换来换去消耗服务器性能,太明显了跟没设验证码的意义不大,因为总有竞争者,别有用心者来捣乱,总会有智能识别验证码的方法,所以要达到魔高一尺道不限高的姿势,才立于不败之地,我不经意在某些地方看到安全性挺高的验证码验证方法,特别做了个案例供大家学习
代码贴上:
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;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
/**
*由于时间有限 这只是自定义的一个小案例 您可以设计更负复杂的算法达到机器不能破解的地步
* Created by lizf on 2017/6/12.
*/
public class Validate extends HttpServlet {
private String V_CODE ;//输出到客户端
public static int WIDTH = 58;//宽度
public static int HEIGHT = 20;//高度
@Overridepublic void init() throws ServletException { super.init();}@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //生成验证码 HttpSession session =req.getSession(); int i = (int) (Math.random()*10); int j = (int) (Math.random()*10); char[] ch = {'加','减','乘'}; int operator = (int) (Math.random()*3+1); String sessionCode ;//存到session switch (ch[operator-1]){ case '加': sessionCode = (i+j)+""; session.setAttribute("SESSION_CODE",sessionCode); V_CODE = i+" 加 "+j+" = ?"; break; case '减': sessionCode = (i-j)+""; session.setAttribute("SESSION_CODE",sessionCode); V_CODE = i+" 减 "+j+" = ?"; break; case '乘': sessionCode = (i*j)+""; session.setAttribute("SESSION_CODE",sessionCode); V_CODE = i+" 乘 "+j+" = ?"; break; } //创建一个画板 BufferedImage bufferedImage = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB); //创建画笔 Graphics2D graphics2D = bufferedImage.createGraphics(); //设置背景色 graphics2D.setBackground(Color.blue); //创建区域 graphics2D.clearRect(0,0,WIDTH,HEIGHT); //设置内容颜色 graphics2D.setColor(Color.green); float x = 3F;//x轴 float y = 14F;//y轴
//向画板里添加内容x y 为边距
graphics2D.drawString(V_CODE,x,y);
//释放资源,清空缓存 graphics2D.dispose(); bufferedImage.flush(); ImageIO.write(bufferedImage,"png",resp.getOutputStream()); //向客户端输出图片}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp);}@Overridepublic void destroy() { super.destroy();}
}
基于二维码验证
import com.swetake.util.Qrcode;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
*扫描二维码验证自己自定义验证玩法
* Created by lzf
*/
public class QrCodeImg extends HttpServlet {
//设定宽高
final static int HEIGHT = 236;
final static int WIDTH = 236;
final static String CONTENT = “扫码后跳转的链接或者内容”;
/*
* 生成二维码
*/
public static void getQrCodeImg() throws IOException {
//实例化一个QrCode
Qrcode qrcode = new Qrcode();
//排错率M代表15%
qrcode.setQrcodeErrorCorrect(‘M’);
//编码集
qrcode.setQrcodeEncodeMode(‘B’);
//二维码的版本
qrcode.setQrcodeVersion(15);
//创建一个画板
BufferedImage bufferedImage= new BufferedImage(WIDTH,HEIGHT,
BufferedImage.TYPE_INT_RGB);
//创建画笔
Graphics2D graphics2D = bufferedImage.createGraphics();
//设置背景色
graphics2D.setBackground(Color.white);
/创建二维码区域
graphics2D.clearRect(0,0, WIDTH, HEIGHT);
//设置内容颜色
graphics2D.setColor(Color.black);
//获取内容的字节数据,设置字符编码
byte[] contentBytes = CONTENT.getBytes(“utf-8”);
boolean[][] codeOut = qrcode.calQrcode(contentBytes);
int offset = 3;
//设置偏移量
//绘制二维码内容
for (int i= 0; i < codeOut.length; i++) {
for (int j= 0; j < codeOut.length; j++) {
if (codeOut[i][j]) {
graphics2D.fillRect(j*3+ offset,i*3+offset, 3, 3);
}
}
}
//释放资源,清空缓
graphics2D.dispose();
bufferedImage.flush();
ImageIO.write(bufferedImage,”png”,resp.getOutputStream());
//向客户端输出图片
}
为了便于编码我已打好jar包以及web项目使用案例已经放到github 项目链接
点击获取案例源码
- 自定义安全性高的验证机制
- JAVA生成安全性高的验证码图片
- IOS 中使用token机制来验证用户的安全性
- iOS 中使用token机制来验证用户的安全性
- IOS 中使用token机制来验证用户的安全性
- IOS 中使用token机制来验证用户的安全性
- Wcf 安全性 之 自定义证书验证
- Wcf 安全性之 自定义用户名密码验证
- Mvc 安全性之 自定义属性验证
- 高安全性操作系统的设计
- SSO单点登录使用token机制来验证用户的安全性
- SSO单点登录使用token机制来验证用户的安全性
- 数据库系统的安全性机制
- Struts2的拦截器、自定义拦截器、Struts2 验证机制
- Linux 开发人员坚信Linux的高安全性
- HashMap与Hashtable的线程安全性验证
- StringBuffer与StringBuilder的线程安全性验证
- StringBuffer与StringBuilder的线程安全性验证
- 【ROS书籍】ROSByExampleⅡ——第一章 本卷范围
- JavaWeb项目同时配置MySQL和Oracle
- win7关机后没有完全断电怎么办
- 909422229_JAVA中获取当前系统时间
- Android Studio Error:Connection timed out: connect.
- 自定义安全性高的验证机制
- vim常见使用命令
- 2017 年最佳开源网络监控工具
- Android:用GSON 五招之内搞定任何JSON数组
- iOS10 新的通知框架 UserNotifications
- ZOJ 1284 Perfection
- CTF安卓逆向练习第四弹
- 【JFinal】Field 'xxx' doesn't have a default value
- maven3 下载配置