驗證碼圖片生成及點擊重載功能實現

我是一個從汽車行業轉行IT的項目經理,我是Edward,如想了解更多,請關注我的公衆號【轉行項目經理的逆襲之路】。今天讓我們來看看如何用java實現驗證碼圖片生成,以及點擊重載的功能。

驗證碼圖片的生成:

1、構造靜態字符串,用於隨機生成驗證碼,用StringBuilder就OK了
2、用到了java自帶的awt包,使用畫布畫筆以及各種隨機顏色將隨機生成的code畫上去,同時隨機畫上干擾線。
3、用ImageIO將圖像寫出到字節流裏,用byte數組獲取數據通過socket的輸出流直接寫到頁面上。

package com.webserver.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;

public class CreateRandomImageServlet extends HttpServlet{
	//構造靜態字符串,用於隨機生成驗證碼
	private static String content;
	private static String code;
	
	static {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 26; i++) {
			sb.append((char)('a'+i));
			sb.append((char)('A'+i));
		}
		
		for (int i = 0; i < 10; i++) {
			sb.append(i);
		}
		content = sb.toString();
	}
	
	
	
	@Override
	public void service(HttpRequest request, HttpResponse response) {
		//畫布
		BufferedImage image = new BufferedImage(70, 30, BufferedImage.TYPE_INT_RGB);
		//畫筆
		Graphics g = image.getGraphics();
		//定義背景顏色
		Color bgColor = new Color(200, 200, 255);
		//畫筆蘸色
		g.setColor(bgColor);
		//填充畫布
		g.fillRect(0, 0, 70, 30);
		
		//隨機生成字符並畫上
		Random random = new Random();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 4; i++) {
			int d= random.nextInt(content.length());
			Color color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
			g.setColor(color);
			g.setFont(new Font("微軟雅黑", Font.BOLD, 20));
			char c = content.charAt(d);
			g.drawString(c+"",i*15+5 , 18);
			sb.append(c);
		}
		code = sb.toString();
		System.out.println("code:"+code);
		
		//隨機生成干擾線並畫上
		for (int i = 0; i < 5; i++) {
			Color color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
			g.setColor(color);
			//線的起始終止座標
			g.drawLine(random.nextInt(71),random.nextInt(31) ,random.nextInt(71), random.nextInt(31));
		}
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			ImageIO.write(image, "jpg", out);
			byte[]data=out.toByteArray();
			
			response.setData(data);   //CH結合ServerContext分析需求,就直接out.write()寫給你
			response.putHeader("Content-Type", "image/jpeg");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


	public static String getCode() {
		return code;
	}

}

點擊重載

驗證碼是有了,可是有時候不太清楚,想換一張怎麼辦? 有個可以只刷新驗證碼圖片的方法,即給圖片加上onclick的JS函數。圖片地址不變,頁面不加載怎麼辦? 加個Math.random就搞定!

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Login</title>
		<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<link rel="stylesheet" type="text/css" href="../bootstrap3/css/bootstrap.css">
		<link rel="stylesheet" type="text/css" href="../bootstrap3/font-awesome-4.7.0/css/font-awesome.css" />
		<style type="text/css">
			body>div {
				margin-top: 50px;
			}
			h1{
				text-align: center;
			}
		</style>
	</head>
	<body>
			<h1>Welcome Back~</h1>
		<div class="container">
			<form action="./login" method="get" class="form-horizontal">
				<div class="form-group">
					<label for="inputEmail3" class="col-sm-2 control-label">Email</label>
					<div class="col-sm-10">
						<input type="email" name="username" class="form-control" id="inputEmail3" placeholder="Email">
					</div>
				</div>
				<div class="form-group">
					<label for="inputPassword3" class="col-sm-2 control-label">Password</label>
					<div class="col-sm-10">
						<input type="password" name="password" class="form-control" id="inputPassword3" placeholder="Password">
					</div>
				</div>
				<div class="form-group">
					<label for="inputPassword3" class="col-sm-2 control-label"><img onclick="changeCode()" id="img" src="./createRandomImage" ></label>
					<div class="col-sm-10">
						<input type="text" name="code" class="form-control" id="inputPassword3" placeholder="VerificationCode">
					</div>
				</div>
				<div class="col-sm-offset-2 col-sm-10">
					<input type="submit" id="" name="" class="btn btn-default" value="Login"/>
				</div>
			</form>
		</div>

		</div>
	</body>
	<script type="text/javascript" src="../bootstrap3/jquery.min.js"></script>
	<script type="text/javascript" src="../bootstrap3/js/bootstrap.js"></script>
	<script type="text/javascript" src="../bootstrap3/js/holder.js"></script>
	<script type="text/javascript" src="../bootstrap3/js/html5shiv.min.js"></script>
	<script type="text/javascript" src="../bootstrap3/js/css3-mediaqueries.js"></script>
	<script type="text/javascript" src="../bootstrap3/js/respond.min.js"></script>
	<script type="text/javascript">
		function changeCode(){
			//src裏面的問號不能掉   document.getElementById("img")可以簡化
			img.src="./createRandomImage?"+Math.random();
		}
	</script>
</html>

注意:src後面的鏈接要換成你自己的業務端口,我這個端口的業務的邏輯是會寫入xml文件,通過靜態塊反射得到servlet對象再執行業務的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章