验证码(随机数字+字符,数字加减)

来源:互联网 发布:怎样在淘宝开店铺 编辑:程序博客网 时间:2024/06/08 17:12
<div>
<span style="white-space:pre"></span><img<span style="white-space:pre"></span>id="dl_i_code" src="<%=request.getContextPath()%>/user/identifyingCode.yhb">
<span style="white-space:pre"></span><a href="javascript:refushCode('dl');" title="换一批">换一批</a></div>



@RequestMapping(value = "user/identifyingCode.yhb")@ResponseBodypublic String identifyingCode(HttpServletRequest request,HttpServletResponse response) {response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expire", 0);IdentifyingCode randomValidateCode = new IdentifyingCode();try {randomValidateCode.getRandcode(request, response);// 输出图片方法} catch (Exception e) {e.printStackTrace();}return "NONE";}



public class IdentifyingCode {public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的keyprivate Random random = new Random();//private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串private String randString = "0123456789";// 随机产生数字private String randFH="+-x";private String randZF="我爱中国游伙伴";private int width = 80;// 图片宽private int height = 33;// 图片高private int lineSize = 40;// 干扰线数量private int stringNum = 1;// 随机产生字符数量/* * 获得字体 */private Font getFont() {return new Font("Fixedsys", Font.CENTER_BASELINE, 18);}/* * 获得颜色 */private Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc - 16);//110+7int g = fc + random.nextInt(bc - fc - 14);//110+9int b = fc + random.nextInt(bc - fc - 18);//110+5return new Color(r, g, b);}/** * 生成随机图片 */public void getRandcode(HttpServletRequest request,HttpServletResponse response) {HttpSession session = request.getSession();// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作g.fillRect(0, 0, width, height);g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));g.setColor(getRandColor(110, 133));// 绘制干扰线for (int i = 0; i <= lineSize; i++) {drowLine(g);}// 绘制随机字符String randomString = "";for (int i = 1; i <= stringNum; i++) {randomString = drowString(g, randomString, i);}char [] stringArr = randomString.toCharArray();if(stringArr[1]=='+'){randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))+Integer.parseInt(String.valueOf(stringArr[2]))); }else if(stringArr[1]=='-'){randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))-Integer.parseInt(String.valueOf(stringArr[2])));  }else if(stringArr[1]=='x'){randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))*Integer.parseInt(String.valueOf(stringArr[2]))); }session.removeAttribute(RANDOMCODEKEY);session.setAttribute(RANDOMCODEKEY, randomString);g.dispose();try {ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端} catch (Exception e) {e.printStackTrace();}}/* * 绘制字符串 *///private String drowString(Graphics g, String randomString, int i) {//g.setFont(getFont());////String rand ="";////if(i==5){//g.setColor(new Color(230,0,0));//rand=getRandomString2(random.nextInt(randZF.length()));//}else{//g.setColor(new Color(random.nextInt(101), random.nextInt(111), random//.nextInt(121)));//rand = String.valueOf(getRandomString(random.nextInt(randString//.length())));//}//randomString += rand;//g.translate(random.nextInt(4), random.nextInt(4));//g.drawString(rand, 13 * i, 24);//return randomString;//}private String drowString(Graphics g, String randomString, int i) {g.setFont(getFont());g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));String rand1 = String.valueOf(getRandomString(random.nextInt(randString.length())));String rand2 = String.valueOf(getRandomString(random.nextInt(randString.length())));String rand3 = String.valueOf(getRandomStringFH(random.nextInt(randFH.length())));randomString += rand1+rand3+rand2+"=";g.translate(random.nextInt(2), random.nextInt(2));g.drawString(randomString, 13 * i, 24);return randomString;}/* * 绘制干扰线 */private void drowLine(Graphics g) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(13);int yl = random.nextInt(15);g.drawLine(x, y, x + xl, y + yl);}/* * 获取随机的字符 */public String getRandomString(int num) {return String.valueOf(randString.charAt(num));}/* * 获取随机的汉字 */public String getRandomString2(int num) {return String.valueOf(randZF.charAt(num));}/* * 获取随机的运算符号 */public String getRandomStringFH(int num) {return String.valueOf(randFH.charAt(num));}}
许多验证码都类似,参考一下就行了

0 0
原创粉丝点击