一、介紹:
1.base64編碼簡介:
Base64就是一種編碼格式。Base64要求把每三個8Bit的字節轉換為四個6Bit的字節(3*8 = 4*6 = 24),然后把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換后的字符串理論上將要比原來的長1/3。
2.使用base64編碼的優點:
①減少了網絡請求:采用http形式的url的話都會額外發送一次請求,網頁發送的http請求次數越多,會造成頁面加載速度越慢。
②不會造成跨域請求的問題:因為采用Base64編碼的圖片是隨着頁面一起加載的。
③不會造成清理圖片緩存問題。
3.使用base64編碼的缺點:
①數據傳輸量變大,代碼的可讀性不高。
②對於IE 8以下的瀏覽器不可使用,IE 8以上的瀏覽器可以使用,但對大小做出了限制。
所以此方法適合於圖片像素小的。
二、使用例子:
1.html
<!--圖片驗證碼--> <div> <div> <input type="text" id="codeImg" placeholder="請輸入驗證碼" maxlength="4"> </div> <div> <a href="javascript:void(0);" title="點擊更換驗證碼"> <img id="imgVerify" src="" alt="更換驗證碼" onclick="getVerify(this);"> </a> </div> </div> <script type="text/javascript"> var imgVerify = $("#imgVerify").get(0); $(function () { getVerify(imgVerify); }); // 圖片驗證碼 function getVerify(obj) { $.ajax({ type: "GET", url: httpRequestUrl + "/getVerifyPic", success: function (result) { obj.src = "data:image/jpeg;base64," + result; } }); } </script>
2.接口
//controller層 @Autowired private YZMService yzmService; @RequestMapping(value = "/getVerifyPic", method = RequestMethod.GET) public String getVerifyPic(HttpServletRequest request) { final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key Map<String,String> map = new HashMap<String,String>(); map = yzmService.getVerifyPic(); yzmService.getVerifyPic(); request.getSession().setAttribute(RANDOMCODEKEY, map.get("num")); return map.get("pic"); } //service層 public Map<String,String> getVerifyPic() { RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil(); return randomValidateCode.getRandcode();//輸出驗證碼圖片方法 }
3.驗證碼工具類
public class RandomValidateCodeUtil { public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key // private String randString = "0123456789";//隨機產生只有數字的字符串 private String // private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//隨機產生只有字母的字符串 private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//隨機產生數字與字母組合的字符串 private int width = 95;// 圖片寬 private int height = 25;// 圖片高 private int lineSize = 40;// 干擾線數量 private int stringNum = 4;// 隨機產生字符數量 private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class); private Random random = new Random(); /** * 獲得字體 */ 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); int g = fc + random.nextInt(bc - fc - 14); int b = fc + random.nextInt(bc - fc - 18); return new Color(r, g, b); } /** * 生成隨機圖片 */ public Map<String,String> getRandcode() { // 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); } logger.info(randomString); //將生成的隨機字符串保存到session中 // session.removeAttribute(RANDOMCODEKEY); // session.setAttribute(RANDOMCODEKEY, randomString); g.dispose(); String base64 = null; try { // 將內存中的圖片通過流動形式輸出到客戶端 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", baos);//圖片格式 byte[] bytes = baos.toByteArray(); base64 = new BASE64Encoder().encodeBuffer(bytes).trim(); } catch (Exception e) { logger.error("將內存中的圖片通過流動形式輸出到客戶端失敗>>>> ", e); } Map<String,String> map = new HashMap<String,String>(); map.put("num", randomString); map.put("pic", base64); return map; } /** * 繪制字符串 */ 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 rand = String.valueOf(getRandomString(random.nextInt(randString .length()))); randomString += rand; g.translate(random.nextInt(3), random.nextInt(3)); g.drawString(rand, 13 * i, 16); 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)); } }