Java Web验证码
来源:互联网 发布:linux 开机启动服务器 编辑:程序博客网 时间:2024/06/05 02:10
1 验证码生成类RandomCode
RandomCode是一个生成验证码的工具类,支持英文和数字验证码,验证码包括英文大小写和数组,其中英文i、o和数字0、1因为容易产生混淆,不包括在生成验证码中。RandomCode支持输出jpg/bmp/png/gif图片格式的验证码。
/** * RandomCode验证码可以通过静态方法和实例方法生成。 * * 静态方法: * * //生成长度为4的随机验证码 * String code = RandomCode.randomString(4); * * //把验证码图片输入到response输出流中 * //图片格式jpg * OutputStream os = response.getOutputStream(); * RandomCode.write(code, 120, 30, os, "jpg"); * * 实例方法: * * //实例化验证码类 * RandomCode rc = new RandomCode(4); * * //把验证码图片输入到response输出流中 * //图片格式jpg * OutputStream os = response.getOutputStream(); * rc.write(120, 30, os, "jpg"); * * //获取验证码字符串 * String code = rc.getCode(); * */public class RandomCode {/** * 随机验证码字符 */private static String base = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";/** * 随机验证码长度 */private int length = 4;/** * 验证码字符串 */private String code;/** * 4位随机验证码 */public RandomCode(){this.code = RandomCode.randomString(this.length);}public RandomCode(int length){if(length > 0){this.length = length;}this.code = RandomCode.randomString(this.length);}/** * 生成验证码图片 * @param width 图片宽度 * @param height 图片高度 * @return */public BufferedImage toImage(int width, int height){return RandomCode.toImage(this.code, width, height);}/** * 输出验证码图片,默认图片格式jpeg * @param width * @param height * @param os * @throws IOException */public void write(int width, int height, OutputStream os) throws IOException{RandomCode.write(code, width, height, os, "jpeg");}/** * 输出验证码图片 * @param width * @param height * @param os * @param format 图片格式,支持jpg/jpeg/bmp/gif/png * @throws IOException */public void write(int width, int height, OutputStream os, String format) throws IOException{RandomCode.write(code, width, height, os, format);}public int getLength() {return length;}public String getCode() {return code;}/** * 静态方法 * 生成随机字符串 * @param length 字符串长度 * @return 随机字符串 */public static String randomString(int length){Random random = new Random();StringBuffer sb = new StringBuffer();for(int i = 0; i < length; i++){sb.append(base.charAt(random.nextInt(base.length())));}return sb.toString();}/** * 静态方法 * 输出验证码图片 * @param code 验证码字符串 * @param width 图片宽度 * @param height 图片高度 * @param os 图片输出流 * @param format 图片格式,支持jpg/jpeg/bmp/gif/png * @throws IOException */public static void write(String code, int width, int height, OutputStream os, String format) throws IOException{BufferedImage image = toImage(code, width, height);ImageIO.write(image, format, os);}/** * 静态方法 * 输出验证码图片,默认图片格式jpeg * @param code 验证码字符串 * @param width 图片宽度 * @param height 图片高度 * @param os 图片输出流 * @throws IOException */public static void write(String code, int width, int height, OutputStream os) throws IOException{write(code, width, height, os, "jpeg");}/** * 静态方法 * 字符串转成验证码图片 * @param code 验证码字符串 * @param width 验证码图片宽度,单位像素 * @param height 验证码图片高度,单位像素 * @return */public static BufferedImage toImage(String code, int width, int height){//字体大小int fontSize = (int)Math.ceil(height * 0.9);if(fontSize < 20){fontSize = 20;}//字体在Y坐标上的位置int positionY = (int)Math.ceil(height * 0.8);int lenCode = code.length();//计算字体宽度int fontWidth = width / (lenCode + 2);BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();//图片背景随机颜色g.setColor(randomColor(new Random(), 200, 250));g.fillRect(0, 0, width, height);//设置字体g.setFont(new Font("Times New Roman", Font.BOLD, fontSize));//在图片上画纵横交错的线,达到混淆效果drawLines(g, width, height);//在图片上画验证码drawString(g, code, fontWidth, positionY);g.dispose();return image;}/** * 静态方法 * 在图片上话位子 * @param g * @param code 验证码字符串 * @param fontWidth 字体宽度 * @param positionY 字体Y坐标 */private static void drawString(Graphics g, String code, int fontWidth, int positionY){int len = code.length();Random random = new Random();for(int i = 0; i < len; i++){g.setColor(randomColor(random));g.drawString(String.valueOf(code.charAt(i)), (i + 1) * fontWidth, positionY);}}private static Color randomColor(Random random){ int r = random.nextInt(255); int g = random.nextInt(255); int b = random.nextInt(255); return new Color(r, g, b); }private static Color randomColor(Random random, int fc, int bc){ if(fc > 255){ fc = 255; } if(bc > 255){ bc = 255; } int diff = bc-fc; int r = fc + random.nextInt(diff); int g = fc + random.nextInt(diff); int b = fc + random.nextInt(diff); return new Color(r,g,b); }/** * 静态方法 * 画纵横交错的线 * @param g * @param width 验证码图片宽度 * @param height 验证码图片高度 */private static void drawLines(Graphics g, int width, int height){Random random = new Random();//线的数量int count = ((int)(Math.ceil(random.nextDouble() * 100))) + 100;for(int i = 0; i < count; i++){int fc = 160 + (int)Math.ceil(random.nextDouble() * 40);int bc = 200 + (int)Math.ceil(random.nextDouble() * 55); g.setColor(randomColor(random, fc, bc));int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(width / 5); int yl = random.nextInt(height / 5); g.drawLine(x, y, x + xl, y + yl);} }}
2 Servlet返回验证码
请求路径http://<网站路径>/random/code/servlet
@WebServlet("/random/code/servlet")public class RandomCodeServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 验证码图片宽度,单位像素int width = 120;// 验证码图片高度,单位像素int height = 30;// 验证码图片格式String format = "png";// 验证码字符长度int len = 4;// 设置图片格式response.setContentType("image/" + format);// 禁止浏览器缓存图片response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);String code = RandomCode.randomString(len);// 把图片输出到response输出流RandomCode.write(code, width, height, response.getOutputStream(), format);}}
3 Strust2返回验证码
public class RandomCodeAction extends ActionSupport {private static final long serialVersionUID = -7515645222798283236L;/** * 获取验证码 */public void generateCode() {HttpServletResponse response = ServletActionContext.getResponse();// 验证码图片宽度,单位像素int width = 120;// 验证码图片高度,单位像素int height = 30;// 验证码图片格式String format = "png";// 验证码字符长度int len = 4;// 设置图片格式response.setContentType("image/" + format);// 禁止浏览器缓存图片response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);String code = RandomCode.randomString(len);// 把图片输出到response输出流try {RandomCode.write(code, width, height, response.getOutputStream(), format);} catch (IOException e) {e.printStackTrace();}}}
Struts2的验证码配置
<package name="pkg-random-code" namespace="/" extends="struts-default"><action name="randomCode_*" method="{1}" class="com.rhui.web.action.RandomCodeAction"></action></package>
请求路径http://<网站路径>/randomCode_generateCode.do
4 SpringMVC返回验证码
请求路径http://<网站路径>/random/code/generate.do
package com.rhui.web.controller;import java.io.IOException;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.rhui.util.RandomCode;@Controller@RequestMapping("/random/code")public class RandomCodeController {@RequestMapping("/generate.do")public void generateCode(HttpServletResponse response) {// 验证码图片宽度,单位像素int width = 120;// 验证码图片高度,单位像素int height = 30;// 验证码图片格式String format = "png";// 验证码字符长度int len = 4;// 设置图片格式response.setContentType("image/" + format);// 禁止浏览器缓存图片response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);String code = RandomCode.randomString(len);// 把图片输出到response输出流try {RandomCode.write(code, width, height, response.getOutputStream(), format);} catch (IOException e) {e.printStackTrace();}}}
0 0
- Java Web验证码
- 【Java Web】验证码
- Java web 验证码
- java Web生成验证码
- java Web图片验证码
- Java Web 验证码 Util
- java Web图片验证码
- java web生成验证码
- java web验证码实现
- java web 实现验证码
- java web中验证码的实现
- java-web绘制验证码图片例程
- java web ----生成随机验证码
- Java Web中验证码的实现
- Java Web简单的图片验证码
- 慕课网 java-web应用2 验证码
- Java Web显示图片验证码
- Java web 产生随机图片验证码
- LeetCode Same Tree
- Apache之火狐的卸载
- UltraEdit多种语法高亮工具
- solr中的dih tips
- Android开发之BroadcastReceiver详解
- Java Web验证码
- Win7部署asp.net网站,问题逐个突破<一>---Win7 IIS 部署网站,同局域网中电脑无法访问解决方案
- shell中的括号知多少
- 访问者模式(Visitor)
- 协方差
- 通用数据库行转列的方法
- eclipse快捷键(含Debug调试)
- opencv之haar特征+AdaBoos分类器算法流程(一)
- 关于代码注释