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

首頁 > 編程 > JSP > 正文

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

2024-09-05 00:23:13
字體:
來源:轉載
供稿:網友

前言

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

效果圖

jsp,驗證碼,圖片,圖片驗證碼,jsp圖片驗證碼代碼

示例代碼

前臺代碼如下:

<form action="action.jsp/5844.html">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 這里不作用戶名或密碼的檢驗,只是單純驗證碼檢驗。

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

jsp,驗證碼,圖片,圖片驗證碼,jsp圖片驗證碼代碼

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

jsp,驗證碼,圖片,圖片驗證碼,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;  } %> 

 

總結

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


注:相關教程知識閱讀請移步到JSP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情在线视频| 亚洲第一色中文字幕| 中文字幕亚洲一区在线观看| 色偷偷888欧美精品久久久| 久久久久久午夜| 亚洲精品久久久久久久久久久久| 欧美在线播放视频| 国产日韩欧美在线视频观看| 国产69精品久久久久99| 美女福利精品视频| 欧美性xxxx极品hd满灌| 91在线色戒在线| 欧美性xxxxx| 亚洲视频专区在线| 成人午夜激情免费视频| 国产日韩av在线| 欧美日韩国产在线| 国产在线精品成人一区二区三区| 日韩高清有码在线| 久久手机免费视频| 欧美极品欧美精品欧美视频| 米奇精品一区二区三区在线观看| 一区二区三区回区在观看免费视频| 青草青草久热精品视频在线网站| 国产精品视频精品视频| 青青草国产精品一区二区| 国产成人免费91av在线| 欧美成人激情在线| 亚洲一区二区三区xxx视频| 亚洲自拍av在线| 亚洲色图综合久久| 亚洲天堂av图片| 国产亚洲精品久久久久久| 国产精品观看在线亚洲人成网| 久久精品青青大伊人av| 欧美日韩国产成人在线| 亚洲精品美女免费| 欧美午夜丰满在线18影院| 亚洲第一页中文字幕| 国产v综合v亚洲欧美久久| 欧美成人精品激情在线观看| 亚洲香蕉伊综合在人在线视看| 78m国产成人精品视频| 成人黄色生活片| 午夜精品蜜臀一区二区三区免费| 国产成人中文字幕| 青青久久av北条麻妃海外网| 成人av.网址在线网站| 日本aⅴ大伊香蕉精品视频| 欧美剧在线观看| 国产精品高精视频免费| 成人在线免费观看视视频| 国产精品www色诱视频| 色综合天天综合网国产成人网| 亚洲一区二区三区在线视频| 国产精品日韩专区| 高清一区二区三区四区五区| 国产欧美日韩精品丝袜高跟鞋| 国产日韩欧美视频在线| 在线电影av不卡网址| 亚洲第一区第一页| 92裸体在线视频网站| 欧洲成人免费视频| 色噜噜狠狠狠综合曰曰曰| 亚洲欧美综合精品久久成人| 亚洲国产精品yw在线观看| 中文字幕亚洲色图| 国产精品九九久久久久久久| 1769国产精品| 国产视频久久久| 精品久久久久久久久久久久| 亚洲成年网站在线观看| 国产精品网红直播| 精品国产乱码久久久久久婷婷| 欧美一区二区三区免费视| 亚洲欧美日韩中文视频| 91啪国产在线| 日韩免费在线免费观看| 亚洲精品一区久久久久久| 精品人伦一区二区三区蜜桃免费| 亚洲免费高清视频| 欧美成人免费在线观看| 国内精品久久久| 日韩在线精品视频| 国产精品视频色| 中文字幕亚洲精品| 亚洲国产精品推荐| 亚洲精品自拍视频| 亚洲精品久久久久中文字幕二区| 2019中文字幕免费视频| 亚洲一区免费网站| 97人洗澡人人免费公开视频碰碰碰| 亚洲人成伊人成综合网久久久| 亚洲四色影视在线观看| 国产成人精品日本亚洲| 欧美精品在线第一页| 国产精品成久久久久三级| 91久久国产婷婷一区二区| 欧美午夜女人视频在线| 欧美成人网在线| 国产69精品久久久| 国产精品一区二区三区免费视频| 欧美激情国产日韩精品一区18| 精品欧美一区二区三区| 亚洲成人教育av| 中文字幕国产亚洲| 日韩一中文字幕| 亚洲欧洲中文天堂| 亚洲91精品在线| 久久影视免费观看| 97久久精品在线| 亚洲欧美精品suv| 久久久爽爽爽美女图片| 欧美福利视频在线观看| 亚洲精品一区久久久久久| 亚洲色图国产精品| 国产精品欧美激情在线播放| 亚洲xxxx在线| 久久精品人人做人人爽| 国产精品一二三视频| 最近中文字幕mv在线一区二区三区四区| 日韩精品欧美国产精品忘忧草| 日韩av在线网址| 亚洲精品国精品久久99热| 国产精品免费久久久久影院| 成人乱人伦精品视频在线观看| 97精品国产97久久久久久春色| 欧美国产乱视频| 日韩中文字幕在线看| 亚洲最大福利视频网| 97视频在线观看亚洲| 欧美成人手机在线| 国产免费成人av| 欧美激情亚洲精品| 97超级碰碰碰| 国语对白做受69| 91精品视频免费看| 国外成人免费在线播放| 一区二区三区在线播放欧美| 中文字幕精品一区久久久久| 国产日韩在线亚洲字幕中文| 欧美日韩免费观看中文| 成人羞羞国产免费| 在线观看视频99| 亚洲成人久久久| 欧美精品videos另类日本| 国产精品一区二区三区久久| 中文字幕亚洲综合久久| 国语自产精品视频在线看一大j8| 亚洲理论电影网| 91久久精品美女高潮| 欧美日韩福利电影| 成人午夜在线影院| 国产精品精品视频一区二区三区| 青青草99啪国产免费| 一本色道久久88综合日韩精品| 国产丝袜视频一区| 亚洲男人天堂2023| 91精品国产高清自在线看超| 久久久精品2019中文字幕神马| 国产精品久久精品| 日韩免费av片在线观看| 国产一区二区三区网站| 久久精品2019中文字幕|