驗證碼(隨機數字+字元,數字加減)
阿新 • • 發佈:2019-02-13
<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") @ResponseBody public 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中的key private 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+7 int g = fc + random.nextInt(bc - fc - 14);//110+9 int b = fc + random.nextInt(bc - fc - 18);//110+5 return 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)); } }