亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP實用教程之簡易圖片驗證碼的實現方法(附源碼)

2020-07-27 21:21:45
字體:
來源:轉載
供稿:網友

前言

很多新手對圖片驗證碼不是很了解,所以本文嘗試通過一個簡單的 JSP 小程序來實現驗證碼功能。文中給出了詳細的示例代碼,文末給出了完整實例代碼的下載地址,下面話不多說了,來一起看看詳細的介紹吧。

效果圖

示例代碼

前臺代碼如下:

<form action="action.jsp" method="POST">  <label> 用戶名:  <input type="text" name="name" data-singleTips="請輸入用戶名" value="admin" />  </label>  <label> 密碼: <input type="password" name="password" />  </label>  <!-- 驗證碼 -->  <label class="captchaCode">  驗證碼: <img src="img.jsp" style="cursor: pointer;" onclick="this.src=this.src + '?' + new Date().valueOf();" />  <input type="text" name="captchaImgCode" />  </label>  <div>  <input type="submit" value="登錄" />   </div> </form> 

驗證碼圖片從何而來? img.jsp 是也:

<%@include file="captcha.jsp"%> <%  init(pageContext);// 加載圖片 %> 

返回圖片的數據流。

action.jsp 這里不作用戶名或密碼的檢驗,只是單純驗證碼檢驗。

如果輸入驗證碼通過,顯示如下:

反之,給出已捕獲的異常:

action.jsp 就是調用 captcha.jsp 里面的 isPass(pageContext, captchaImgCode) 方法,以及捕獲已知異常。

<%@page pageEncoding="UTF-8"%> <%@include file="captcha.jsp"%> <%  String captchaImgCode = request.getParameter("captchaImgCode");  try {  if (isPass(pageContext, captchaImgCode)) {  out.println("驗證碼通過!");  }  } catch (Throwable e) {  out.println(e);  } %> 

核心 captcha,jsp 代碼:

<%@page pageEncoding="UTF-8" import="java.io.IOException, java.awt.*, java.awt.image.BufferedImage, java.util.Random, javax.imageio.ImageIO"%> <%!  // 定義Captcha 類  public static class Captcha {  /**  * 默認寬度 60  */  private int width = 60;   /**  * 默認高度 20  */  private int height = 20;   /**  * 驗證碼  */  private String code;   /**  * 生成驗證碼圖片  *  * @return 圖片對象  */  public BufferedImage get() {  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 在內存中創建圖像  Graphics g;   g = image.getGraphics(); // 獲取圖形上下文  g.setColor(getRandColor(200, 250)); // 設定背景  g.fillRect(0, 0, width, height);  g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 設定字體  g.setColor(getRandColor(160, 200));   Random random = new Random();// 隨機產生干擾線  for (int i = 0; i < 155; i++) {  int x = random.nextInt(width), y = random.nextInt(height);  int xl = random.nextInt(12), yl = random.nextInt(12);  g.drawLine(x, y, x + xl, y + yl);  }   String sRand = ""; // 隨機產生4位驗證碼  for (int i = 0; i < 4; i++) {  String rand = String.valueOf(random.nextInt(10));  sRand += rand;  g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); // 將認證碼顯示到圖象中  g.drawString(rand, 13 * i + 6, 16);// 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成  }   // 將認證碼存入SESSION  // session.setAttribute("rand", sRand);  setCode(sRand);  g.dispose();// 圖象生效   return image;  }   /**  * 生成隨機顏色  *  * @param fc  * @param bc  * @return  */  private Color getRandColor(int fc, int bc) {  if (fc > 255)  fc = 255;  if (bc > 255)  bc = 255;   Random random = new Random();  int r = fc + random.nextInt(bc - fc);  int g = fc + random.nextInt(bc - fc);  int b = fc + random.nextInt(bc - fc);   return new Color(r, g, b);  }   /**  * 獲取高度  *  * @return  */  public int getHeight() {  return height;  }   /**  * 設置高度  *  * @param height  * 高度  */  public void setHeight(int height) {  this.height = height;  }   /**  * 獲取驗證碼  *  * @return  */  public String getCode() {  return code;  }   /**  * 設置驗證碼  *  * @param code  * 驗證碼  */  public void setCode(String code) {  this.code = code;  }   /**  * 獲取寬度  *  * @return  */  public int getWidth() {  return width;  }   /**  * 設置寬度  *  * @param width  * 寬度  */  public void setWidth(int width) {  this.width = width;  }   }    /**  * SESSION 的鍵值  */  public static final String SESSION_KEY = "rand";   /**  * 顯示驗證碼圖片并將認證碼存入 Session  *  * @param response  * 響應對象  * @param session  * 會話對象  */  public static void init(HttpServletResponse response, HttpSession session) {  Captcha img = new Captcha();   // 不用緩存  response.setHeader("Pragma", "No-cache");  response.setHeader("Cache-Control", "no-cache");  response.setDateHeader("Expires", 0);  response.setContentType("image/jpg");   try {  ImageIO.write(img.get(), "JPEG", response.getOutputStream());   /*  * 加上下面代碼,運行時才不會出現java.lang.IllegalStateException: getOutputStream() has already been called ..........等異常  * response.getOutputStream().flush();  * response.getOutputStream().close();  * response.flushBuffer();  */   // JSP內置對象out和response.getWrite()的區別,兩者的主要區別:1. 這兩個對象的類型是完全不同的……  // response.getWriter();  // http://blog.sina.com.cn/s/blog_7217e4320101l8gq.html  // http://www.49028c.com/kf/201109/103284.html   // pageContext.getOut().clear();  } catch (IOException e) {  e.printStackTrace();  }   session.setAttribute(SESSION_KEY, img.getCode()); // 將認證碼存入 SESSION  System.out.println("生成驗證碼:" + img.getCode());  }   /**  * 顯示驗證碼圖片并將認證碼存入 Session(For JSP)  *  * @param pageContext  * 頁面上下文對象  */  public static void init(PageContext pageContext) {  init((HttpServletResponse) pageContext.getResponse(), pageContext.getSession());  }    /**  * 判斷用戶輸入的驗證碼是否通過  *  * @param pageContext  * 頁面上下文對象  * @return true 表示通過  * @throws Throwable  */  public static boolean isPass(PageContext pageContext, String code) throws Throwable {  boolean isCaptchaPass = false;   String rand = (String) pageContext.getSession().getAttribute(SESSION_KEY);   System.out.println("rand:" + rand);  System.out.println("CaptchaCode:" + code);   if (rand == null)  throw new UnsupportedOperationException("請刷新驗證碼。");  else if (code == null || code.equals("")) {  throw new IllegalArgumentException("沒提供驗證碼參數");  } else {  isCaptchaPass = rand.equals(code);  if (!isCaptchaPass)  throw new IllegalAccessError("驗證碼不正確");  }   return isCaptchaPass;  } %> 

完整代碼下載:http://xiazai.VeVB.COm/201707/yuanma/Captcha(VeVB.COm).rar

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影中文 亚洲精品乱码| 欧美刺激性大交免费视频| 亚洲高清久久久久久| 神马久久久久久| 性亚洲最疯狂xxxx高清| 亚洲最新av网址| 欧美成人午夜激情在线| 九九精品在线观看| 亚洲一区二区三区四区视频| 91精品美女在线| 精品综合久久久久久97| 日韩欧美在线视频| 国产精品极品美女粉嫩高清在线| 久久久久久这里只有精品| 最近2019中文字幕在线高清| 久久精品一区中文字幕| 另类少妇人与禽zozz0性伦| 亚洲老头同性xxxxx| 久久亚洲综合国产精品99麻豆精品福利| 亚洲第一页在线| 成人黄色片网站| 亚洲欧洲日产国码av系列天堂| 亚洲天堂av在线免费观看| 国产成人精品视频在线观看| 成人中文字幕在线观看| 亚洲专区国产精品| 中文字幕精品影院| 亚洲欧洲一区二区三区在线观看| 亚洲国产精品va在线观看黑人| 欧美激情成人在线视频| 久久精品国产视频| 欧美成人免费全部观看天天性色| 久久久亚洲精选| 亚洲精品有码在线| 黄色一区二区在线| 亚洲男人第一av网站| 日韩精品免费视频| 国产a级全部精品| 色妞在线综合亚洲欧美| 日韩国产精品视频| 国产欧美日韩精品在线观看| 福利一区视频在线观看| 久久天堂av综合合色| 亚洲第一精品自拍| 成人免费在线视频网址| 日韩中文在线中文网三级| 久久久久久999| 日韩精品免费视频| 欧美国产日韩一区二区三区| 欧美富婆性猛交| 国产精品91久久久久久| 欧美一级电影免费在线观看| 日韩av网站大全| 亚洲男人第一网站| 欧美日韩精品中文字幕| 亚洲精品成a人在线观看| 日本精品一区二区三区在线播放视频| 亚洲网站在线看| 日韩av成人在线| 国产精品扒开腿做爽爽爽的视频| 日韩美女视频免费在线观看| 欧美高清视频免费观看| …久久精品99久久香蕉国产| 狠狠躁天天躁日日躁欧美| 日韩在线观看免费全集电视剧网站| 欧美日韩精品在线播放| 国产精品男人的天堂| 精品福利在线观看| 日韩欧美第一页| 欧美—级a级欧美特级ar全黄| 国产精品视频不卡| 国产精品主播视频| 国产美女被下药99| 91精品久久久久久久| 26uuu另类亚洲欧美日本一| 国产精品一区二区三区久久久| 成人av色在线观看| 欧美日韩性视频| 日韩av不卡电影| 亚洲福利影片在线| 亚洲欧美在线第一页| 国产精品久久久久久久午夜| 91沈先生在线观看| 日韩欧美在线观看| 国产精品美乳一区二区免费| 久久久久久久久久国产精品| 亚洲精品黄网在线观看| 亚洲精品自拍视频| 高清亚洲成在人网站天堂| 美女国内精品自产拍在线播放| 亚洲香蕉av在线一区二区三区| 国产mv免费观看入口亚洲| 欧美高清视频免费观看| 欧美亚洲伦理www| 91欧美视频网站| 日韩欧美精品网站| 国产精品一区二区久久久久| 国产精品久久久久久av福利| 97久久精品国产| 久久久久久久久久国产| 久久全球大尺度高清视频| 91美女片黄在线观| 俺也去精品视频在线观看| 色琪琪综合男人的天堂aⅴ视频| 亚洲激情第一页| 欧美日韩亚洲系列| 久久伊人精品视频| 亚洲欧美综合精品久久成人| 91久久夜色精品国产网站| 欧美自拍大量在线观看| www.日本久久久久com.| 欧美精品videos| 欧美性猛交xxxx免费看漫画| 欧美极品欧美精品欧美视频| 国产精品中文久久久久久久| 国产精品久久av| 亚洲人成网7777777国产| 欧美一级bbbbb性bbbb喷潮片| 韩剧1988免费观看全集| 亚洲精品久久久久久久久久久久久| 久久精品久久久久久国产 免费| 亚洲黄页网在线观看| 97国产精品视频人人做人人爱| 国产精品永久免费视频| 欧美精品中文字幕一区| 在线观看日韩av| 中文字幕久热精品视频在线| 日韩精品久久久久久福利| 欧美一级成年大片在线观看| 欧美成人在线免费| 午夜精品理论片| 国产一区二区三区高清在线观看| www.国产精品一二区| 国产成人精品亚洲精品| 97超级碰在线看视频免费在线看| 国产精品久久久久久久av电影| 亚洲人成在线观看| 国产精自产拍久久久久久| 一区二区欧美亚洲| xxxxxxxxx欧美| 日韩av黄色在线观看| 国产美女扒开尿口久久久| 国产精品嫩草视频| 国产精品美女999| 国产精品福利网| 国内精品视频久久| 久久久极品av| 69国产精品成人在线播放| 国产精品国产三级国产专播精品人| 欧美性猛交xxxx黑人| 欧美视频13p| 亚洲国产精品悠悠久久琪琪| 欧美性猛交xxx| 国产精品老牛影院在线观看| 亚洲男人7777| 国产日韩在线一区| 欧美最顶级的aⅴ艳星| 国产成人一区二区三区小说| 午夜精品久久久99热福利| 亚洲级视频在线观看免费1级| 自拍偷拍亚洲欧美| 中文综合在线观看| 国产亚洲欧美日韩美女| 欧美视频中文在线看|