生活随笔
收集整理的這篇文章主要介紹了
JAVAWEB项目如何实现验证码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
驗證碼基礎
一.什么是驗證碼及它的作用
???:驗證碼為全自動區分計算機和人類的圖靈測試的縮寫,是一種區分用戶是計算機的公共全自動程序,這個問題可以由計算機生成并評判,但是必須只有人類才能解答.可以防止惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登錄。
?
二.圖文驗證碼的原理
???:在servlet中隨機生成一個指定位置的驗證碼,一般為四位,然后把該驗證碼保存到session中.在通過Java的繪圖類以圖片的形式輸出該驗證碼。為了增加驗證碼的安全級別,可以輸出圖片的同時輸出干擾線,最后在用戶提交數據的時候,在服務器端將用戶提交的驗證碼和Session保存的驗證碼進行比較。
?
三.驗證碼所需的技術
????:i.因為驗證碼中的文字,數字,應為都是可變的,故要用到隨機生成數技術。
???????ii.如果驗證碼中包含漢字,則要用到漢字生成技術.
?????? iii.可以使用Ajax技術實現局部刷新
?????? iv.可以使用圖片的縮放和旋轉技術,
?????? vi.隨機繪制干擾線(可以是折現,直線等)
?????? vii.如果考慮到驗證碼的安全性,可以使用MD5加密.
?
驗證碼模塊實例
1.編寫生成英文,數字,漢字隨機生成的Servlet類.源代碼如下:
[java]?view plaincopy
package?com.servlet;????import?java.awt.*;??import?java.awt.geom.*;??import?java.awt.image.*;??import?java.io.*;??import?java.util.*;????import?javax.servlet.ServletException;??import?javax.servlet.http.HttpServlet;??import?javax.servlet.http.HttpServletRequest;??import?javax.servlet.http.HttpServletResponse;??import?javax.servlet.http.HttpSession;??import?javax.imageio.ImageIO;????public?class?PictureCheckCode?extends?HttpServlet?{????????private?static?final?long?serialVersionUID?=?1L;????????public?PictureCheckCode()?{??????????super();??????}????????public?void?destroy()?{??????????super.destroy();???????}????????public?void?init()?throws?ServletException?{??????????super.init();??????}??????????public?Color?getRandColor(int?s,int?e){??????????Random?random=new?Random?();??????????if(s>255)?s=255;??????????if(e>255)?e=255;??????????int?r,g,b;??????????r=s+random.nextInt(e-s);????????????g=s+random.nextInt(e-s);????????????b=s+random.nextInt(e-s);????????????return?new?Color(r,g,b);??????}????????@Override??????public?void?service(HttpServletRequest?request,?HttpServletResponse?response)??????????????throws?ServletException,?IOException?{??????????????????response.setHeader("Pragma",?"No-cache");??????????response.setHeader("Cache-Control",?"No-cache");??????????response.setDateHeader("Expires",?0);??????????????????response.setContentType("image/jpeg");??????????int?width=86,height=22;?????????????BufferedImage?image=new?BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);?????????Graphics?g=image.getGraphics();?????????????Graphics2D?g2d=(Graphics2D)g;???????????????Random?random=new?Random();??????????Font?mfont=new?Font("楷體",Font.BOLD,16);?????????g.setColor(getRandColor(200,250));??????????g.fillRect(0,?0,?width,?height);????????????g.setFont(mfont);???????????????????????????g.setColor(getRandColor(180,200));????????????????????????????for(int?i=0;i<100;i++){??????????????int?x=random.nextInt(width-1);??????????????int?y=random.nextInt(height-1);??????????????int?x1=random.nextInt(6)+1;??????????????int?y1=random.nextInt(12)+1;??????????????BasicStroke?bs=new?BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);?????????????Line2D?line=new?Line2D.Double(x,y,x+x1,y+y1);??????????????g2d.setStroke(bs);??????????????g2d.draw(line);?????????????}??????????????????String?sRand="";??????????String?ctmp="";??????????int?itmp=0;??????????????????for(int?i=0;i<4;i++){??????????????switch(random.nextInt(3)){??????????????????case?1:??????????????????????????itmp=random.nextInt(26)+65;???????????????????????ctmp=String.valueOf((char)itmp);???????????????????????break;??????????????????case?2:??????????????????????????String[]?rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};?????????????????????????????????????????????int?r1=random.nextInt(3)+11;???????????????????????String?str_r1=rBase[r1];????????????????????????????????????????????int?r2;???????????????????????if(r1==13){???????????????????????????r2=random.nextInt(7);??????????????????????????}else{???????????????????????????r2=random.nextInt(16);???????????????????????}???????????????????????String?str_r2=rBase[r2];????????????????????????????????????????????int?r3=random.nextInt(6)+10;???????????????????????String?str_r3=rBase[r3];????????????????????????????????????????????int?r4;???????????????????????if(r3==10){???????????????????????????r4=random.nextInt(15)+1;???????????????????????}else?if(r3==15){???????????????????????????r4=random.nextInt(15);???????????????????????}else{???????????????????????????r4=random.nextInt(16);???????????????????????}???????????????????????String?str_r4=rBase[r4];????????????????????????????????????????????byte[]?bytes=new?byte[2];????????????????????????????????????????????String?str_12=str_r1+str_r2;???????????????????????int?tempLow=Integer.parseInt(str_12,?16);???????????????????????bytes[0]=(byte)?tempLow;????????????????????????????????????????????String?str_34=str_r3+str_r4;???????????????????????int?tempHigh=Integer.parseInt(str_34,?16);???????????????????????bytes[1]=(byte)tempHigh;???????????????????????ctmp=new?String(bytes);???????????????????????break;??????????????????default:???????????????????????itmp=random.nextInt(10)+48;???????????????????????ctmp=String.valueOf((char)itmp);???????????????????????break;??????????????}??????????????sRand+=ctmp;??????????????Color?color=new?Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));??????????????g.setColor(color);??????????????????????????????????????Graphics2D?g2d_word=(Graphics2D)g;??????????????AffineTransform?trans=new?AffineTransform();??????????????trans.rotate((45)*3.14/180,15*i+8,7);??????????????????????????float?scaleSize=random.nextFloat()+0.8f;??????????????if(scaleSize>1f)?scaleSize=1f;??????????????trans.scale(scaleSize,?scaleSize);??????????????g2d_word.setTransform(trans);??????????????g.drawString(ctmp,?15*i+18,?14);??????????}??????????HttpSession?session=request.getSession(true);??????????session.setAttribute("randCheckCode",?sRand);??????????g.dispose();????????????ImageIO.write(image,"JPEG",response.getOutputStream());?????}??}?? ?
?2.配置Servlet
??? 在web.xml中的配置如下:
[java]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>??<web-app?version="2.5"???????xmlns="http://java.sun.com/xml/ns/javaee"???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???????xsi:schemaLocation="http:????http:??<servlet>??????<description>輸出驗證碼</description>??????<display-name>This?is?the?display?name?of?my?J2EE?component</display-name>??????<servlet-name>PictureCheckCode</servlet-name>??????<servlet-class><SPAN?style="COLOR:?#ff0000">com.servlet.PictureCheckCode</SPAN></servlet-class>????</servlet>??????<servlet-mapping>??????<servlet-name>PictureCheckCode</servlet-name>??????<url-pattern>/<SPAN?style="COLOR:?#ff0000">PictureCheckCode</SPAN></url-pattern>????</servlet-mapping>????<welcome-file-list>??????<welcome-file>index.jsp</welcome-file>????</welcome-file-list>??</web-app>??
3.測試驗證碼
????? 可以編寫JSP頁面來驗證是否可以輸出驗證碼圖片,JSP代碼如下:
????1.index.jsp:顯示界面
[java]?view plaincopy
<%@?page?language="java"?import="java.util.*"?pageEncoding="gbk"%>????<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??<html>??????<head>??????????<title>驗證碼</title>??????????<script?language="javascript">??function?myReload()?{??????document.getElementById("CreateCheckCode").src?=?document??????????????.getElementById("CreateCheckCode").src??????????????+?"?nocache="?+?new?Date().getTime();??}??</script>??????</head>????????<body>??????????<form?action="Check.jsp"?method="post">??????????????<input?name="checkCode"?type="text"?id="checkCode"?title="驗證碼區分大小寫"??????????????????size="8"?,maxlength="4"?/>??????????????<img?src="PictureCheckCode"?id="CreateCheckCode"?align="middle">??????????????<a?href=""?οnclick="myReload()">?看不清,換一個</a>??????????????<input?type="submit"?value="提交"?/>??????????</form>??????</body>??</html>??
?
2.Check.jsp?:主要驗證提交的數據是否和Session中保存的驗證碼是否相同
[java]?view plaincopy
<%@?page?language="java"?import="java.util.*"?pageEncoding="gbk"%>??<html>????<head>??????<title>驗證碼校驗</title>????</head>????????<body>??????<%??????????String?checkcode=request.getParameter("checkCode");??????????if(checkcode.equals("")||checkcode==null){??????????????out.print("<script>alert('請輸入驗證碼');window.location.href('index.jsp')</script>");??????????}else{??????????????if(!checkcode.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){??????????????????out.print("<script>alert('驗證碼不正確,請重新輸入');history.back(-1);</script>");??????????????}else{??????????????????out.print("登錄成功");??????????????}??????????}???????%>????</body>??</html>??
?
?4.工程項目結構,及運行截圖?
轉載于:https://www.cnblogs.com/jpwpp/p/6255291.html
總結
以上是生活随笔為你收集整理的JAVAWEB项目如何实现验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。