最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java驗(yàn)證碼圖片生成代碼

 更新時(shí)間:2017年03月06日 08:37:38   作者:J倉怕加x  
這篇文章主要為大家詳細(xì)介紹了Java驗(yàn)證碼圖片生成代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Java生成驗(yàn)證碼圖片的具體代碼,供大家參考,具體內(nèi)容如下

1、首先新建一各專門生成驗(yàn)證碼圖片的類VerifyCode:

public class VerifyCode {


private int w=70;
private int h=35;
private Random r=new Random();
//宋體,華文楷書,黑體,華文新魏,華文隸書,微軟雅黑,楷體_GB2312,Times New Roman
private String [] fontNames={"宋體","華文楷書","黑體","華文新魏","微軟雅黑","華文隸書","楷體_GB2312","Times New Roman"};
//可選的字符
private String codes="23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
//背景色
private Color bgColor=new Color(255,255,255);
//驗(yàn)證碼上的文本
private String text;

//生成隨機(jī)顏色
private Color randomColor(){
 int red=r.nextInt(150);
 int green=r.nextInt(150);
 int blue=r.nextInt(150);
 return new Color(red,green,blue);
}

//生成隨機(jī)字體
private Font randomFont(){
int index=r.nextInt(fontNames.length);//獲取下標(biāo)
String fontName=fontNames[index];//生成隨機(jī)的字體名稱
int style=r.nextInt(4);//獲取隨機(jī)樣式,0表示無樣式,1表示粗體,2表示斜體,3表示粗體加斜體
int size=r.nextInt(5)+24;//生成隨機(jī)字號(hào),24~28
return new Font(fontName,style,size);
}

//畫干擾線
private void drawLine(BufferedImage image){
int num=3;//一共畫3條
Graphics2D g2=(Graphics2D) image.getGraphics();
for(int i=0;i<num;i++){//隨機(jī)生成坐標(biāo),即4個(gè)值
int x1=r.nextInt(w);
int y1=r.nextInt(h);
int x2=r.nextInt(w);
int y2=r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));//設(shè)置筆畫的寬度
  g2.setColor(Color.blue);//干擾線顏色
  g2.drawLine(x1, y1, x2, y2);//畫線
}
}

//隨機(jī)生成一個(gè)字符
private char randomChar(){
int index=r.nextInt(codes.length());
return codes.charAt(index);
}

//創(chuàng)建BufferedImage
private BufferedImage createImage(){
BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2=(Graphics2D) image.getGraphics();
g2.setColor(this.bgColor);
g2.fillRect(0, 0, w, h);
return image;
}

//外界調(diào)用這個(gè)方法得到驗(yàn)證碼
public BufferedImage getImage(){
BufferedImage image=createImage();//創(chuàng)建圖片緩沖區(qū)
Graphics2D g2=(Graphics2D)image.getGraphics();//得到繪制環(huán)境
StringBuilder sb=new StringBuilder();//用來裝載生成的驗(yàn)證碼文本
//向圖中畫4個(gè)字符
for(int i=0;i<4;i++){//循環(huán)4次
String s=randomChar()+"";//隨機(jī)生成一個(gè)字符
sb.append(s);//把字母添加到sb中
double x=i*1.0*w/4;//設(shè)置當(dāng)前字符的x軸坐標(biāo)
g2.setFont(randomFont());//設(shè)置隨機(jī)字體
g2.setColor(randomColor());//設(shè)置隨機(jī)顏色
g2.drawString(s, (int)x, h-5);
}
this.text=sb.toString();//把生成的字符串賦給了this.text
drawLine(image);//添加干擾線
return image;
}

//返回驗(yàn)證碼圖片上面的文本
public String getText(){
return text;
}

//保存圖片到指定的輸出流
public static void output(BufferedImage image,OutputStream out) throws IOException{
ImageIO.write(image, "JPEG", out);
}
}

2、在jsp頁面上應(yīng)用:

其核心代碼如下:

<form action="/test/LoginServlet" method="post">
   用戶名:<input type="text" name="username" value="<%=uname %>"><br>
   密 碼:<input type="password" name="password"><br>
   驗(yàn)證碼:<input type="text" name="verifyCode">
  <img id="img" src="/test/VerifyCodeServlet">
  <a href="JavaScript:_change()" rel="external nofollow" >看不清換一張</a><br>
  <input type="submit" value="登錄">
 </form>

看不清換一張使用javascript實(shí)現(xiàn),代碼如下:

   <script type="text/javascript">
      function _change(){
        /**
        *1.得到image圖片
        *2.修改其src為/test/VerifyCodeServlet 
        */
        var imgEle=document.getElementById("img");
        imgEle.src="/test/VerifyCodeServlet?a="+new Date().getTime();

      }
  </script>

 +new Date().getTime()這條語句可以欺騙瀏覽器,以為請(qǐng)求是新的,實(shí)現(xiàn)驗(yàn)證碼的改變。

3、在第2步中,VerifyCodeServlet的實(shí)現(xiàn)生成一張驗(yàn)證碼,并且通過session域保存驗(yàn)證碼圖片對(duì)應(yīng)的文本內(nèi)容,為后面的登錄驗(yàn)證驗(yàn)證碼是否正確做準(zhǔn)備。核心代碼如下:

public class VerifyCodeServlet extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


/*
* 1.生成圖片
* 2.保存圖片上的文本到session域中
* 3.把圖片響應(yīng)給客戶端
*/
VerifyCode vc=new VerifyCode();
BufferedImage image=vc.getImage();
//保存圖片上的文本到session域
request.getSession().setAttribute("session_code", vc.getText());

VerifyCode.output(image, response.getOutputStream());

  }
}

4、最后一步,實(shí)現(xiàn)登錄驗(yàn)證驗(yàn)證碼是否正確,其核心代碼如下:

public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


/*
* 校驗(yàn)驗(yàn)證碼
* 1.從session中獲取正取的驗(yàn)證碼
* 2.從表單中獲取用戶填寫的驗(yàn)證碼
* 3.進(jìn)行比較
* 4.如果相同,向下運(yùn)行,否則保存錯(cuò)誤信息到request域,轉(zhuǎn)發(fā)到login.jsp
*/
String sessionCode=(String)                    

 request.getSession().getAttribute("session_code");//獲得的驗(yàn)證碼里面對(duì)應(yīng)的文本內(nèi)容
String paramCode=request.getParameter("verifyCode");//用戶輸入文本框里面的內(nèi)容
if(!paramCode.equalsIgnoreCase(sessionCode)){
request.setAttribute("msg", "驗(yàn)證碼錯(cuò)誤!");
request.getRequestDispatcher("/login.jsp").forward(request, response);//打回到登錄界面。
return;//返回,不繼續(xù)執(zhí)行下面的語句。
}
}
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)

    java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)

    下面小編就為大家?guī)硪黄猨ava中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • JAVA注解代碼詳解一篇就夠了

    JAVA注解代碼詳解一篇就夠了

    這篇文章主要介紹了Java注解詳細(xì)介紹,本文講解了Java注解是什么、Java注解基礎(chǔ)知識(shí)、Java注解類型、定義Java注解類型的注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java實(shí)現(xiàn)二叉搜索樹的插入、刪除功能

    Java實(shí)現(xiàn)二叉搜索樹的插入、刪除功能

    這篇文章主要介紹了Java實(shí)現(xiàn)二叉搜索樹的插入、刪除,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享

    使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享

    這篇文章主要介紹了使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • springboot 設(shè)置server.port不生效的原因及解決

    springboot 設(shè)置server.port不生效的原因及解決

    這篇文章主要介紹了springboot 設(shè)置server.port不生效的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 利用hadoop查詢兩兩之間有共同好友及他倆的共同好友都是誰

    利用hadoop查詢兩兩之間有共同好友及他倆的共同好友都是誰

    一想到要實(shí)現(xiàn)求共同好友的功能,很多人都會(huì)想到redis來實(shí)現(xiàn)。但是redis存儲(chǔ)和數(shù)據(jù)和計(jì)算時(shí)需要耗費(fèi)較多的內(nèi)存資源。所以文本將介紹另一種方法,即利用Hadoop中的MapReduce來實(shí)現(xiàn),感興趣的可以了解一下
    2022-01-01
  • SpringBoot擴(kuò)展外部化配置的原理解析

    SpringBoot擴(kuò)展外部化配置的原理解析

    這篇文章主要介紹了SpringBoot擴(kuò)展外部化配置的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java?Stream去重常見的多種方法及示例

    Java?Stream去重常見的多種方法及示例

    這篇文章主要介紹了Java?Stream中實(shí)現(xiàn)去重的多種方法,包括使用distinct()、Collectors.toMap、filter和groupingBy等,詳細(xì)說明了每種方法的應(yīng)用場(chǎng)景和示例代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java?CompletableFuture實(shí)現(xiàn)多線程異步編排

    Java?CompletableFuture實(shí)現(xiàn)多線程異步編排

    這篇文章主要為大家介紹了Java?CompletableFuture實(shí)現(xiàn)多線程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Spring線程池ThreadPoolTaskExecutor配置詳情

    Spring線程池ThreadPoolTaskExecutor配置詳情

    本篇文章主要介紹了Spring線程池ThreadPoolTaskExecutor配置詳情,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論

黄石市| 长垣县| 夏邑县| 当雄县| 高唐县| 平原县| 枣庄市| 贵港市| 恩平市| 团风县| 兴文县| 鸡西市| 山东省| 敦化市| 原平市| 镇原县| 阳春市| 建瓯市| 凌海市| 炉霍县| 齐河县| 牙克石市| 隆昌县| 蒙城县| 教育| 抚远县| 镇宁| 正镶白旗| 商城县| 甘洛县| 景洪市| 诸暨市| 阿城市| 富锦市| 高碑店市| 宁远县| 攀枝花市| 琼中| 石柱| 阜宁县| 方山县|