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

java驗證碼生成的基本流程

 更新時間:2015年11月26日 16:48:28   作者:YX_blog  
這篇文章主要介紹了java驗證碼生成的基本流程,需要的朋友可以參考下

1.驗證碼的生成,我們能夠看到是用Graphics對象畫出來的。對象我們必須要獲得Graphics對象

1-1、Graphics對象的獲取,要通過BufferedImage獲得

<span style="font-size:18px;">int width=100;//確定框框的大小 
 int height=40; 
 BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
 Graphics g=bfi.getGraphics();//獲得Graphics對象就可以畫圖</span> 

1-2、一般的驗證碼背景框都是白色的

<span style="font-size:18px;"> //1,設置背景(白框框) 
 g.setColor(Color.WHITE);//白色的畫筆 
 g.fillRect(0, 0, width, height);//畫矩形矩形框框</span> 

1-3、保存數據(后臺驗證使用)和設置字體樣式(美觀)

String str="";//保存數據 
 Random rom=new Random(); 
 //設置字體的大寫與粗 
 g.setFont(new Font("a", Font.BOLD,20)); 

1-4、生成具體的數值,以及隨機生成的顏色

for(int i=0;i<4;i++){ 
  int num=rom.nextInt(10);//生成的隨機數 
  g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
  g.drawString(""+num, 20*i, 20+rom.nextInt(10));//畫出線,x的位置每一之間增加20,y的坐標以20一條線,在線上或者是線下 
  //PS:位置需要明確些, 
 } 

1-5、一般的數字容易被其他軟件直接識別出來,為了防黑。稍微加一點干擾線

//畫出一些干擾線 
 for (int i = 0; i < 10; i++) { 
  g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
  g.drawLine(rom.nextInt(100),rom.nextInt(40), rom.nextInt(100), rom.nextInt(40));//位置也是隨機,x,y的值不要超過矩形框框 
 } 

1-6、銷毀Graphics對象和存儲圖片

<span style="white-space:pre"> </span>g.dispose();//銷毀對象 
 ImageIO.write(bfi, "JPEG", res.getOutputStream());//圖片用字節(jié)流 直接得到 PS::: res是Servlet里面的。 

這樣驗證碼就生成了,那我們如何導入到前臺去呢

2、具體實現
前臺代碼呈現():

<body> 
  <h1>用戶登錄</h1><br/> 
  用戶名:<input type="text" name="nametext"/><br/> 
  密 碼:<input type="text" name="psd"/><br/> 
  請輸入驗證碼:<input type="text"/> 
  <img <span style="color:#ff0000;">src="/IMG/immg" </span>id="aid"/><a href="javascript:flush()" >看不清</a> 
 </body> 

src的地址來源就是從后臺發(fā)過來的。路徑是很有意思的。
2-1步驟
項目里面
myeclipse --> src -->new  Servlet 出現如下:

點擊----》next 出現如下頁面:

這個配置會自動到項目里面的web-INF文件夾里面web.xml。這個框框里面的值就是前臺 src里面寫的需要訪問的路徑,----> 點擊完成就行了。
自動了。生成如下界面:

在這里就可寫之前的代碼。但是需要注意,我們必須通過覆蓋這個方法才能有效:

protected void service(HttpServletRequest req, HttpServletResponse resp)//自動生成 輸入 <span style="font-family: Arial, Helvetica, sans-serif;">service 補全,自動生成</span> 
 
  throws ServletException, IOException { 
 // TODO Auto-generated method stub 
 super.service(req, resp); 
} 

具體的代碼如下:

package cn.hncu.com.servlet; 
 
 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Random; 
 
import javax.imageio.ImageIO; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class Imgdemo extends HttpServlet { 
@Override 
public void service(ServletRequest req, ServletResponse res) 
  throws ServletException, IOException { 
 int width=100;//確定框框的大小 
 int height=40; 
 BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
 Graphics g=bfi.getGraphics();//獲得Graphics對象就可以畫圖 
 //1,設置背景(白框框) 
 g.setColor(Color.WHITE);//白色的畫筆 
 g.fillRect(0, 0, width, height);//畫矩形矩形框框 
 //2,具體生成隨機數 
 String str="";//保存數據 
 Random rom=new Random(); 
 //設置字體的大寫與粗 
 g.setFont(new Font("a", Font.BOLD,20)); 
 //畫出具體的圖片 
  
 for(int i=0;i<4;i++){ 
  int num=rom.nextInt(10);//生成的隨機數 
  g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
  g.drawString(""+num, 20*i, 20+rom.nextInt(10));//畫出線,x的位置每一之間增加20,y的坐標以20一條線,在線上或者是線下 
  //PS:位置需要明確些, 
 } 
 //畫出一些干擾線 
 for (int i = 0; i < 10; i++) { 
  g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
  g.drawLine(rom.nextInt(100),rom.nextInt(40), rom.nextInt(100), rom.nextInt(40));//位置也是隨機,x,y的值不要超過矩形框框 
 } 
 g.dispose(); 
 ImageIO.write(bfi, "JPEG", res.getOutputStream());//圖片用字節(jié)流 直接得到 
} 
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span> 

前臺代碼:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
 <head> 
 <base href="<%=basePath%>"> 
  
 <title>My JSP 'img.jsp' starting page</title> 
  
 <meta http-equiv="pragma" content="no-cache"> 
 <meta http-equiv="cache-control" content="no-cache"> 
 <meta http-equiv="expires" content="0">  
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
 <meta http-equiv="description" content="This is my page"> 
 <!-- 
 <link rel="stylesheet" type="text/css" href="styles.css"> 
 --> 
 <script type="text/javascript"> 
   
  function flush(){ 
  var text=document.getElementById("aid"); 
  var date =new Date(); 
  var tt=date.getTime(); 
  text.src="/IMG/immg?"+tt; 
   
   
  } 
 </script> 
 
 </head> 
 
 <body> 
  <h1>用戶登錄</h1><br/> 
  用戶名:<input type="text" name="nametext"/><br/> 
  密 碼:<input type="text" name="psd"/><br/> 
  請輸入驗證碼:<input type="text"/> 
  <img src="/IMG/immg" id="aid"/><a href="javascript:flush()" >看不清</a> 
 </body> 
</html> 

對于前臺代碼需要解釋一下:
當我們的的驗證碼傳過來看不清的時候需要刷新,而瀏覽器有自動記憶的功能,當沒有新的參數傳進來的時候,瀏覽器是不會刷新的,所以我們需要手動的去寫一個js控制參數傳,我們知道,只有時間是不會變化的,所有我們采用時間來作為參數傳遞。
PS:自己坑了一段時間的問題:驗證碼的路徑問題。前端的“/”表示 tomcat目錄,在項目內部,如web.xml中“/”表示該項目下。也就是說,他們兩個的目錄差了一層。

最后附上自己在測試的時候的代碼以及修改數字形狀的問題,如改成2D的效果更不錯。都有很明顯的記錄。

package cn.hncu.com; 
 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Random; 
 
import javax.imageio.ImageIO; 
 
import org.junit.Test; 
 
public class Demoimg { 
 @Test 
 public void Test() throws Exception{ 
  String str="9988"; 
  int width=60; 
  int height=30; 
  //通過bufferedImage對象獲得Graphics對象 
  BufferedImage bfi=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 
  Graphics g=bfi.getGraphics(); 
  g.drawString(str, 10,10); 
  g.dispose();//類似于IO中的關流 
  ImageIO.write(bfi , "JPEG", new FileOutputStream("F:\\ex\\a.jpg")); 
  //bfi為畫布,將畫布寫到文件中JPEG為指定文件格式 
 } 
  
 @Test 
 public void Test2() throws Exception{ 
  int width=100; 
  int height=40; 
  BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
  Graphics g=bfi.getGraphics();//獲得Graphics對象就可以畫圖 
  //1,設置背景(白框框) 
  g.setColor(Color.WHITE);//白色的畫筆 
  g.fillRect(0, 0, width, height); 
  //2,具體生成隨機數 
  String str="";//保存數據 
  Random rom=new Random(); 
  //設置字體的大寫與粗 
  g.setFont(new Font("a", Font.BOLD,20)); 
  //畫出具體的圖片 
   
  for(int i=0;i<4;i++){ 
   int num=rom.nextInt(10);//生成的隨機數 
   g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
   g.drawString(""+num, 20*i, 20+rom.nextInt(10));//畫出線,x的位置每一之間增加20,y的坐標以20一條線,在線上或者是線下 
   //PS:位置需要明確些, 
  } 
  //畫出一些干擾線 
  for (int i = 0; i < 10; i++) { 
   g.setColor(new Color(rom.nextInt(256),rom.nextInt(256), rom.nextInt(256)));//設置畫筆的顏色(隨機) 
   g.drawLine(rom.nextInt(100),rom.nextInt(40), rom.nextInt(100), rom.nextInt(40));//位置也是隨機,x,y的值不要超過矩形框框 
  } 
  g.dispose(); 
  ImageIO.write(bfi, "JPEG", new FileOutputStream("F:\\ex\\b.jpg")); 
 } 
 
  
 //畫出可以變化的情況 
 //字體能夠旋轉的驗證碼 
 @Test 
 public void Test3() throws IOException{ 
  int width=100; 
  int height=40; 
  BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
  Graphics g=bfi.getGraphics(); 
  Graphics2D g2d=(Graphics2D) g; 
  Random rom =new Random(); 
  g2d.setColor(Color.WHITE);//設置畫筆的顏色 
  g2d.fillRect(0, 0, width, height);//畫出一個白色的矩形 
  g2d.setFont(new Font("a", Font.BOLD, 20)); 
  for(int i=0;i<4;i++){ 
   int num=rom.nextInt(10); 
   //旋轉,放縮 
   AffineTransform aff=new AffineTransform(); 
   //aff.rotate(Math.random(), i*18, height-20);//旋轉 
   aff.scale(0.6+Math.random(), 0.6+Math.random());//縮放 
   g2d.setColor(new Color(rom.nextInt(256),rom.nextInt(256),rom.nextInt(256))); 
   g2d.setTransform(aff); 
   g2d.drawString(""+num, i*18, height-25); 
  } 
  g2d.dispose(); 
  ImageIO.write(bfi, "JPEG", new FileOutputStream("F:\\ex\\c.jpg")); 
   
 } 
} 

以上就是關于java生成驗證碼的基本流程,還附帶了自己親自的測試的代碼,希望這些都能幫到大家。

相關文章

  • SpringBoot 跨域問題的解決方案

    SpringBoot 跨域問題的解決方案

    這篇文章主要介紹了SpringBoot 跨域問題的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • aop注解方式實現全局日志管理方法

    aop注解方式實現全局日志管理方法

    下面小編就為大家分享一篇aop注解方式實現全局日志管理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • java構建Stream流的多種方式總結

    java構建Stream流的多種方式總結

    Java?8引入了Stream流作為一項新的特性,它是用來處理集合數據的一種函數式編程方式,本文為大家整理了多種java構建Stream流的方式,希望對大家有所幫助
    2023-11-11
  • 解讀Java中打印輸出對象內容為什么可以不寫.toString()

    解讀Java中打印輸出對象內容為什么可以不寫.toString()

    這篇文章主要介紹了解讀Java中打印輸出對象內容為什么可以不寫.toString()問題,具有很的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解spring+springmvc+mybatis整合注解

    詳解spring+springmvc+mybatis整合注解

    本篇文章主要介紹了詳解spring+springmvc+mybatis整合注解,詳細的介紹了ssm框架的使用,具有一定的參考價值,有興趣的可以了解一下
    2017-04-04
  • RabbitMQ實現Work Queue工作隊列的示例詳解

    RabbitMQ實現Work Queue工作隊列的示例詳解

    工作隊列(又稱任務隊列)的主要思想是避免立即執(zhí)行資源密集型任務,而不得不等待它完成。本篇文章將記錄和分享RabbitMQ工作隊列相關的知識點,希望對大家有所幫助
    2023-01-01
  • Java使用Apache Commons高效處理CSV文件的操作指南

    Java使用Apache Commons高效處理CSV文件的操作指南

    在 Java 開發(fā)中,CSV(Comma-Separated Values,逗號分隔值)是一種常見的數據存儲格式,廣泛用于數據交換和簡單的存儲任務,本文將介紹Java使用Apache Commons高效處理CSV文件的操作指南,需要的朋友可以參考下
    2025-03-03
  • java利用udp實現發(fā)送數據

    java利用udp實現發(fā)送數據

    這篇文章主要為大家詳細介紹了java利用udp實現發(fā)送數據,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • springboot bootcdn使用示例詳解

    springboot bootcdn使用示例詳解

    這篇文章主要介紹了springboot bootcdn使用,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java WindowBuilder 安裝及基本使用的教程

    Java WindowBuilder 安裝及基本使用的教程

    這篇文章主要介紹了Java WindowBuilder 安裝及基本使用的教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05

最新評論

治县。| 乌苏市| 萨迦县| 铅山县| 吉安市| 神木县| 白城市| 柳江县| 延吉市| 山丹县| 宽甸| 瑞昌市| 上杭县| 浦县| 浏阳市| 台安县| 安陆市| 塔河县| 新绛县| 嘉荫县| 武山县| 景东| 涞水县| 乌兰县| 榆树市| 田东县| 新民市| 岳普湖县| 永和县| 连江县| 高雄县| 通化市| 来安县| 雅江县| 康乐县| 福清市| 横山县| 兴和县| 永春县| 永安市| 儋州市|