java實現(xiàn)圖片驗證碼
本文實例為大家分享了java實現(xiàn)圖片驗證碼的具體代碼,供大家參考,具體內(nèi)容如下
目的:
1) 驗證操作者是否是人
2) 防止表單重復(fù)提交
生成驗證碼的要點:
1) 使用java代碼生成圖片對象
BufferedImage
2) 使用Random生成隨機字符串
3) 將圖片對象用
ImageIO.write(圖片對象, "jpeg|png", 響應(yīng)字節(jié)輸出流)
返回給客戶端瀏覽器
驗證驗證碼:
要點:
1) 將驗證碼文字存入session作用域
2) 表單提交時,對比session中的驗證碼和表單中的驗證碼
CaptchaUtils.java
package cn.seeker.utils;
?
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.List;
?
public class CaptchaUtil {
?
? ? public static String [] fuhao = {"+","-","*","/"};
? ? public static int num = 0;
?
? ? //生成隨機算式
? ? public static String random(){
?
? ? ? ? List list = new ArrayList();
? ? ? ? Random ran = new Random();
? ? ? ? int n1 = ran.nextInt(10);
? ? ? ? int n2 = ran.nextInt(10);
? ? ? ? String f = fuhao[ran.nextInt(fuhao.length)];
? ? ? ? StringBuilder sb = new StringBuilder(4);
?
? ? ? ? switch (f){
? ? ? ? ? ? case "+":
? ? ? ? ? ? ? ? num = n1+n2;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "-":
? ? ? ? ? ? ? ? num =n1-n2;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "*":
? ? ? ? ? ? ? ? num = n1*n2;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case "/":
? ? ? ? ? ? ? ? if(n2 == 0){
? ? ? ? ? ? ? ? ? ? n2 = ran.nextInt(10)+1;
? ? ? ? ? ? ? ? ? ? num = n1/n2;
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? num = n1/n2;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? sb.append(n1);
? ? ? ? sb.append(f);
? ? ? ? sb.append(n2);
? ? ? ? sb.append("=");
?
? ? ? ? return sb.toString();
? ? }
? ? public static void outputImage(String str, OutputStream os){
? ? ? ? Random ran = new Random();
? ? ? ? //創(chuàng)建圖片對象
? ? ? ? BufferedImage img = new BufferedImage(100,40, BufferedImage.TYPE_INT_RGB);
? ? ? ? //獲取畫布
? ? ? ? Graphics g = img.getGraphics();
? ? ? ? //設(shè)置背景
? ? ? ? g.setColor(Color.white);
? ? ? ? g.fillRect(0,0,100,40);
? ? ? ? //寫字
? ? ? ? g.setColor(Color.black);
? ? ? ? g.setFont(new Font("微軟雅黑",Font.PLAIN,30));
? ? ? ? g.drawString(str,10,40);
? ? ? ? //隨機三條線
? ? ? ? g.drawLine(ran.nextInt(100),ran.nextInt(40),
? ? ? ? ? ? ? ? ran.nextInt(100),ran.nextInt(40));
? ? ? ? g.drawLine(ran.nextInt(100),ran.nextInt(40),
? ? ? ? ? ? ? ? ran.nextInt(100),ran.nextInt(40));
? ? ? ? g.drawLine(ran.nextInt(100),ran.nextInt(40),
? ? ? ? ? ? ? ? ran.nextInt(100),ran.nextInt(40));
? ? ? ? // 4. 輸出結(jié)果
? ? ? ? // 常見的壓縮格式:jpeg(有損壓縮), png(無損壓縮) ...
? ? ? ? try {
? ? ? ? ? ? ImageIO.write(img, "png", os);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
?
}regist.jsp
<%--
? Created by IntelliJ IDEA.
? User: Administrator
? Date: 2018/10/14
? Time: 15:43
? To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
? ? <title>注冊</title>
? ? <style>
? ? ??
? ? ? ? img { cursor: pointer}
? ? </style>
</head>
<body>
<form action="/regist" method="post">
? ? <img src="/captcha.png" onclick="changeImg(this)">
? ? 輸入驗證碼:<input type="text" name="cap">
? ? <input type="submit" value="提交">
</form>
?
<script>
?
? ? function changeImg(img) {
? ? ? ? // 瀏覽器有一個緩存特性,
? ? ? ? // 第一次從服務(wù)器獲取圖片,瀏覽器第二次發(fā)送請求時發(fā)現(xiàn)地址沒有改變,就會使用第一次的圖片,而不會真正發(fā)送請求
? ? ? ? // 為了讓瀏覽器每次都把請求發(fā)送給服務(wù)器,給一個時間參數(shù)
? ? ? ? img.src = "/captcha.png?t="+new Date().getTime(); // 給src賦一個新值,就會向新值的地址發(fā)送一次請求
? ? }
</script>
</body>
</html>CaptchaServlet.java
package cn.seeker.controller;
?
import cn.seeker.utils.CaptchaUtil;
?
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
?
@WebServlet(urlPatterns = "/captcha.png")
public class CaptchaServlet extends HttpServlet {
?
? ? @Override
? ? protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
?
? ? ? ? response.setContentType("image/png");
? ? ? ? //獲取隨機字符串
? ? ? ? String random = CaptchaUtil.random();
? ? ? ? //輸出圖片
? ? ? ? CaptchaUtil.outputImage(random,response.getOutputStream());
? ? ? ? //存入結(jié)果
? ? ? ? request.getSession().setAttribute("res",CaptchaUtil.num);
?
? ? }
?
?
}registServlet.jsp
package cn.seeker.controller;
?
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
?
@WebServlet(urlPatterns = "/regist")
public class registServlet extends HttpServlet {
? ? @Override
? ? protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ? String cap = req.getParameter("cap");
? ? ? ? Integer res = (Integer)req.getSession().getAttribute("res");
? ? ? ? if(Integer.parseInt(cap) == res) {
? ? ? ? ? ? // 填寫正確,注冊成功
? ? ? ? ? ? req.getSession().removeAttribute("res");
? ? ? ? ? ? System.out.println("注冊成功");
? ? ? ? ? ? resp.sendRedirect("/index.jsp");
?
? ? ? ? } else {
? ? ? ? ? ? req.setAttribute("error", "驗證碼不正確");
? ? ? ? ? ? req.getRequestDispatcher("/jsp/regist.jsp").forward(req,resp);
? ? ? ? }
? ? }
}以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置可動態(tài)刷新的實現(xiàn)代碼
這篇文章主要介紹了MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置,可動態(tài)刷新,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
springboot實現(xiàn)rabbitmq的隊列初始化和綁定
這篇文章主要介紹了springboot實現(xiàn)rabbitmq的隊列初始化和綁定,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10
Java畢業(yè)設(shè)計實戰(zhàn)之共享租車信息管理系統(tǒng)的實現(xiàn)
這是一個使用了java+Jsp+Servlet+Jdbc+Mysql開發(fā)的共享租車信息管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習,具有租車管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02

