1. 程式人生 > >JAVAWEB專案如何實現驗證碼

JAVAWEB專案如何實現驗證碼

驗證碼基礎

一.什麼是驗證碼及它的作用

   驗證碼為全自動區分計算機和人類的圖靈測試的縮寫,是一種區分使用者是計算機的公共全自動程式,這個問題可以由計算機生成並評判,但是必須只有人類才能解答.可以防止惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一個特定註冊使用者用特定程式暴力破解方式進行不斷的登入。

二.圖文驗證碼的原理

   在servlet中隨機生成一個指定位置的驗證碼,一般為四位,然後把該驗證碼儲存到session中.在通過Java的繪圖類以圖片的形式輸出該驗證碼。為了增加驗證碼的安全級別,可以輸出圖片的同時輸出干擾線,最後在使用者提交資料的時候,在伺服器端將使用者提交的驗證碼和Session儲存的驗證碼進行比較。

三.驗證碼所需的技術

    i.因為驗證碼中的文字,數字,應為都是可變的,故要用到隨機生成數技術。

       ii.如果驗證碼中包含漢字,則要用到漢字生成技術.

       iii.可以使用Ajax技術實現區域性重新整理

       iv.可以使用圖片的縮放和旋轉技術,

       vi.隨機繪製干擾線(可以是折現,直線等)

       vii.如果考慮到驗證碼的安全性,可以使用MD5加密.

驗證碼模組例項

1.編寫生成英文,數字,漢字隨機生成的Servlet類.原始碼如下:

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);	//隨機生成RGB顏色中的r值
		g=s+random.nextInt(e-s);	//隨機生成RGB顏色中的g值
		b=s+random.nextInt(e-s);	//隨機生成RGB顏色中的b值
		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);	//建立BufferedImage物件,其作用相當於一圖片
		Graphics g=image.getGraphics();		//建立Graphics物件,其作用相當於畫筆
		Graphics2D g2d=(Graphics2D)g;		//建立Grapchics2D物件
		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));
		
		//繪製100條顏色和位置全部為隨機產生的線條,該線條為2f
		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:		//生成A-Z的字母
				     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);
			//將生成的隨機數進行隨機縮放並旋轉制定角度 PS.建議不要對文字進行縮放與旋轉,因為這樣圖片可能不正常顯示
			/*將文字旋轉制定角度*/
			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();	//釋放g所佔用的系統資源
		ImageIO.write(image,"JPEG",response.getOutputStream());	//輸出圖片
	}
}

 2.配置Servlet

    在web.xml中的配置如下:

<?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://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <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:顯示介面

<%@ 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="" onclick="myReload()"> 看不清,換一個</a>
			<input type="submit" value="提交" />
		</form>
	</body>
</html>

2.Check.jsp :主要驗證提交的資料是否和Session中儲存的驗證碼是否相同

<%@ 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.工程專案結構,及執行截圖 

相關推薦

JAVAWEB專案如何實現驗證

驗證碼基礎 一.什麼是驗證碼及它的作用    :驗證碼為全自動區分計算機和人類的圖靈測試的縮寫,是一種區分使用者是計算機的公共全自動程式,這個問題可以由計算機生成並評判,但是必須只有人類才能解答.可以防止惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一個特定註冊使用者

javaWeb用kaptcha實現驗證

基本配置 1、匯入kaptcha的jar包 2、在web.xml中完成基本配置 <servlet> <servlet-name>Kaptcha</servlet-name> <serv

Java WEB專案如何實現驗證

驗證基礎 一.什麼是驗證碼及驗證碼的作用 驗證碼為全自動區分計算機和人類的圖靈測試的縮寫。是一種區分使用者還是計算機的全自動程式,這個問題可以由計算機生成並進行判斷,但是隻有人類才可以解答。可以防止惡意破解密碼,刷票,論壇灌水,有效防止某個黑客對某一

vue實現驗證專案

vue實現驗證碼功能 在這裡插入<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title&l

javaweb中使用servlet實現驗證

1、jsp頁面 在jsp頁面中,我們要有下面幾部分: 1.輸入框 2.驗證碼圖片 3.看不清按鈕 4.提交按鈕 預期效果: 思路: 2、jsp頁面程式碼: <%@ page language="java" import="java.

python專案實戰:實現驗證登入網址例項

前言 相信大家都明白,大多數的網站為了不被惡意訪問,往往需要設定驗證碼登入,避免機器人訪問,而造成我伺服器癱瘓,崩潰,這裡用到P

Java Swing 圖形界面實現驗證驗證可動態刷新)

string ble urn repaint xtend efault event adapt 內容 import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.To

Java實現驗證(上)

ins check dom 後臺 類繼承 訪問 and text 出錯   眾所周知,現在登錄註冊各種網站賬號很多都要求輸入驗證碼。設置驗證碼,毫無疑問降低了用戶體驗,但為什麽各種網站還仍然使用驗證碼呢?   很明顯,驗證碼有其特殊的作用:驗證碼是一種區分用戶是計算機還是人

PHP實現驗證制作

php 驗證碼 captcha.php(PHP產生驗證碼並儲存Session):<?php //開啟Session session_start(); //繪制底圖 $image = imagecreatetruecolor(100, 30);//返回資源型的值 $bgcolor =

關於豆瓣登錄,並實現驗證輸入的方法

保持 學習 gen index token 如果 抓取 with open comment 最近想把模擬登錄的知識學習下,所以就進行了豆瓣賬號的簡單登錄,以下是代碼: # -*- coding:utf-8 -*- ‘‘‘豆瓣模擬登陸,並實現發一條狀態‘‘‘ impor

Python使用Timer實現驗證功能

input thread sel def AC check cache IT imp from threading import Timer import random class Code: def __init__(self): s

PHP實現驗證

channels echo img -type order pos 函數返回 個數 body (1)常見的驗證碼哪些? 圖像類型、語音類型、視頻類型、短信類型等 (2)使用驗證碼的好處在哪裏? ①防止惡意的破解密碼如一些黑客為了獲取到用戶信息,通過不同的手段向服務器

Spring中整合Cage,實現驗證功能

ger 類型 body match exce sub pom esp rec 1.pom.xml中添加Cage依賴。 <dependency> <groupId>com.github.cage</groupId

shop--6.店鋪註冊--使用kaptcha實現驗證

ssa p s request ava edi eth ring formdata input 1.引入jar包 https://mvnrepository.com/中搜索com.github.penggle 找到kaptcha,將其dependency拷貝到pom.xml

PHP JS CSS session實現驗證功能

驗證碼 ges ron oss art tex lse 個數 bcd PHP JS CSS session實現驗證碼功能 頁面<?php//校驗驗證碼if (isset($_POST["authcode"])) {session_start();

網頁登陸註冊(jsp實現)驗證

cte exp .com tran cti version height 一個 dog 這是一個登陸頁面,有登陸驗證和驗證碼的功能(1)生成驗證碼的servlet:import javax.imageio.ImageIO;import javax.servlet.Servl

基於SVM的python簡單實現驗證識別

save def lse highlight pro imp bubuko uac 如果 1. 爬取驗證碼圖片 from urllib import request def download_pics(pic_name): url = ‘http://wsbs

SpringMVC實現驗證功能

yui eat cat import inpu expires 否則 void pos 下面是一張項目結構圖,實現功能前需要先搭建好SpringMVC框架。 RandomValidateCode.java——是生成驗證碼的類 Constants.java——定義了一個常量

canvas實現驗證功能

code 區分大小寫 font num type move style lower 輸入 我們在做一些後臺系統登錄功能的時候,一般都會用到驗證碼,最多的就是後臺生成的驗證碼圖片返回給前端的。也可以不調用後端接口,前端使用canvas直接生成驗證碼。 由於功能過於簡單,不需要

前端以canvas實現驗證詳解

前端實現驗證碼生成 實現此功能,可以先拆分出驗證碼有以下要素: 隨機凌亂字元生成 隨機的背景色調 隨機出現的遮擋線與點 要實現此功能我們可以使用css3中canvas元素,通過js我們可以 非常簡單的實現前端生成驗證碼。 下面讓我們逐項實現 我們先在