Java Web項目中驗證碼功效的制造攻略。本站提示廣大學習愛好者:(Java Web項目中驗證碼功效的制造攻略)文章只能為提供參考,不一定能成為您想要的結果。以下是Java Web項目中驗證碼功效的制造攻略正文
1、媒介
在表單頁面中應用驗證碼的利益在於有用避免用戶歹意提交表單,或許應用外掛不法進擊體系。
2、預備前提
1、一個通俗的web項目 webProject;
2、一個web辦事器 Tomcat。
3、完成思緒:
1、自界說一個servlet VerifyCodeServlet 畫一個包括驗證字符的驗證碼圖片,這裡的圖片須要應用Graphics2D手動去畫;
2、在詳細頁面應用img標簽的src援用這個servlet便可顯示servlet;
3、由於繪圖的時刻把驗證碼信息放入了session,所以提交表單後可以依據session中保留的值和用戶輸出的code做比擬,驗證輸出能否准確。
網上年夜都是經由過程servlet完成的驗證碼,入下圖邏輯:
步調:
1、要求登錄頁面時隨機生成驗證碼字符串;
2、將生成對驗證碼字符串存到session中;
3、依據驗證碼字符串生成驗證碼圖片,然後將驗證碼圖片輸入到客戶展現;
4、提交登錄要求時用戶輸出的驗證碼字符串與session中的字符串做比對。
4、詳細代碼以下:
package com.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 發生驗證碼圖片的servlet
* @author Administrator
*
*/
public class VerifyCodeServlet extends HttpServlet {
private static final long serialVersionUID = -5051097528828603895L;
/**
* 驗證碼圖片的寬度。
*/
private int width = 100;
/**
* 驗證碼圖片的高度。
*/
private int height = 30;
/**
* 驗證碼字符個數
*/
private int codeCount = 4;
/**
* 字體高度
*/
private int fontHeight;
/**
* 第一個字符的x軸值,由於前面的字符坐標順次遞增,所以它們的x軸值是codeX的倍數
*/
private int codeX;
/**
* codeY ,驗證字符的y軸值,由於並行所以值一樣
*/
private int codeY;
/**
* codeSequence 表現字符許可湧現的序列值
*/
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
/**
* 初始化驗證圖片屬性
*/
public void init() throws ServletException {
// 從web.xml中獲得初始信息
// 寬度
String strWidth = this.getInitParameter("width");
// 高度
String strHeight = this.getInitParameter("height");
// 字符個數
String strCodeCount = this.getInitParameter("codeCount");
// 將設置裝備擺設的信息轉換成數值
try {
if (strWidth != null && strWidth.length() != 0) {
width = Integer.parseInt(strWidth);
}
if (strHeight != null && strHeight.length() != 0) {
height = Integer.parseInt(strHeight);
}
if (strCodeCount != null && strCodeCount.length() != 0) {
codeCount = Integer.parseInt(strCodeCount);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
//width-4 除去閣下過剩的地位,使驗證碼加倍集中顯示,減得越多越集中。
//codeCount+1 //等比分派顯示的寬度,包含閣下雙方的空格
codeX = (width-4) / (codeCount+1);
//height - 10 集中顯示驗證碼
fontHeight = height - 10;
codeY = height - 7;
}
/**
* @param request
* @param response
* @throws ServletException
* @throws java.io.IOException
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
// 界說圖象buffer
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D gd = buffImg.createGraphics();
// 創立一個隨機數生成器類
Random random = new Random();
// 將圖象填充為白色
gd.setColor(Color.LIGHT_GRAY);
gd.fillRect(0, 0, width, height);
// 創立字體,字體的年夜小應當依據圖片的高度來定。
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 設置字體。
gd.setFont(font);
// 畫邊框。
gd.setColor(Color.BLACK);
gd.drawRect(0, 0, width - 1, height - 1);
// 隨機發生160條攪擾線,使圖像中的認證碼不容易被其它法式探測到。
gd.setColor(Color.gray);
for (int i = 0; i < 16; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
gd.drawLine(x, y, x + xl, y + yl);
}
// randomCode用於保留隨機發生的驗證碼,以便用戶登錄落後行驗證。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 隨機發生codeCount數字的驗證碼。
for (int i = 0; i < codeCount; i++) {
// 獲得隨機發生的驗證碼數字。
String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
// 發生隨機的色彩重量來結構色彩值,如許輸入的每位數字的色彩值都將分歧。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
// 用隨機發生的色彩將驗證碼繪制到圖象中。
gd.setColor(new Color(red,green,blue));
gd.drawString(strRand, (i + 1) * codeX, codeY);
// 將發生的四個隨機數組合在一路。
randomCode.append(strRand);
}
// 將四位數字的驗證碼保留到Session中。
HttpSession session = request.getSession();
session.setAttribute("validateCode", randomCode.toString());
// 制止圖象緩存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
// 將圖象輸入到Servlet輸入流中。
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
}
}
然後在web.xml中設置裝備擺設下這個生成驗證碼的servlet,詳細以下:
<servlet>
<servlet-name>VerifyCodeServlet</servlet-name>
<servlet-class>com.servlet.VerifyCodeServlet</servlet-class>
<init-param>
<param-name>width</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>height</param-name>
<param-value>32</param-value>
</init-param>
<init-param>
<param-name>codeCount</param-name>
<param-value>4</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>VerifyCodeServlet</servlet-name>
<url-pattern>/VerifyCodeServlet</url-pattern>
</servlet-mapping>
啟動辦事器,在閱讀器地址欄輸出:http://localhost:8080/webProject/VerifyCodeServlet
檢查顯示後果,詳細以下:
1、 每次刷新驗證碼都有變更,這是由於servlet設置了禁用閱讀器緩存。
2、這裡發明一個成績:假如應用火狐閱讀器,VerifyCodeServlet中重寫的serviice辦法被履行了兩次,換成重寫doGet辦法或許doPost辦法也是一樣, 而且其他閱讀器都不見該情形,後來發明假如是經由過程頁面援用該servlet就挪用正常了。
然後便可以在頁面中援用該驗證碼了,詳細代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<div>
<%
String inputCode = request.getParameter("inputCode");
String verifyCode = (String)session.getAttribute("validateCode");
if(inputCode!=null && verifyCode!=null){
out.print("真實的驗證碼:" + verifyCode + "<br/>" + "用戶輸出的驗證碼:" + inputCode + "<br/>");
inputCode = inputCode.toUpperCase();//不辨別年夜小寫
out.print("比擬驗證碼證實用戶輸出 " + (inputCode.equals(verifyCode)?"准確":"毛病") + "!");
}
%>
<form action="index.jsp">
驗證碼:<input name="inputCode" value=""/>
<img src="VerifyCodeServlet" align="middle" title="看不清,請點我" onclick="javascript:refresh(this);" onmou搜索引擎優化ver="mou搜索引擎優化ver(this)"/><br/>
<input name="submit" type="submit" value="提交"/>
</form>
</div>
<script>
function refresh(obj){
obj.src = "VerifyCodeServlet?" + Math.random();
}
function mou搜索引擎優化ver(obj){
obj.style.cursor = "pointer";
}
</script>
</body>
</html>
下面代碼經由過程表單提交驗證碼到以後jsp,驗證用戶輸出的驗證碼能否准確,運轉的詳細後果以下:
1、輸出准確的驗證碼
2、輸出毛病的驗證碼