简单的Session案例 —— 一次性验证码
生活随笔
收集整理的這篇文章主要介紹了
简单的Session案例 —— 一次性验证码
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- 一次性驗(yàn)證碼的主要目的就是為了限制人們利用工具軟件來(lái)暴力猜測(cè)密碼,其原理與利用Session防止表單重復(fù)提交的原理基本一樣,只是將表單標(biāo)識(shí)號(hào)變成了驗(yàn)證碼的形式,并且要求用戶將提示的驗(yàn)證碼手工填寫(xiě)進(jìn)一個(gè)表單字段中,而不是通過(guò)表單的隱藏字段自動(dòng)回傳給服務(wù)器。
- 服務(wù)器程序接收到表單數(shù)據(jù)后,首先判斷用戶是否填寫(xiě)了正確的驗(yàn)證碼,只有該驗(yàn)證碼與服務(wù)器端保存的驗(yàn)證碼匹配時(shí),服務(wù)器程序才開(kāi)始正常的表單處理流程。
- 密碼猜測(cè)工具要逐一嘗試每個(gè)密碼的前題條件是先輸入正確的驗(yàn)證碼,而驗(yàn)證碼是一次性有效的,這樣基本上就阻斷了密碼猜測(cè)工具的自動(dòng)地處理過(guò)程。
表單頁(yè)面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body> ${MessageIfo} <form action="<%=request.getContextPath()%>/checkCodeServlet" method="post">Username:<input type="text" name="username"/><br><br>驗(yàn)證碼:<input type="text" name="checkCode"/><br><br><img src="<%=request.getContextPath()%>/validateColorServlet"><br><br><input type="submit" value="登錄"/> </form> </body> </html>生成驗(yàn)證碼的Servlet
package yang.mybatis.servlet.checkCode;import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; 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; /*** Created by yangshijing on 2017/11/23 0023.*/ public class ValidateColorServlet extends HttpServlet {public static final String CHECK_CODE_KEY = "CHECK_CODE_KEY";private static final long serialVersionUID = 1L;//設(shè)置驗(yàn)證圖片的寬度, 高度, 驗(yàn)證碼的個(gè)數(shù)private int width = 152;private int height = 40;private int codeCount = 4;//驗(yàn)證碼字體的高度private int fontHeight = 4;//驗(yàn)證碼中的單個(gè)字符基線. 即:驗(yàn)證碼中的單個(gè)字符位于驗(yàn)證碼圖形左上角的 (codeX, codeY) 位置處private int codeX = 0;private int codeY = 0;//驗(yàn)證碼由哪些字符組成char [] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz23456789".toCharArray();//初始化驗(yàn)證碼圖形屬性public void init(){fontHeight = height - 2;codeX = width / (codeCount + 2);codeY = height - 4;}public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//定義一個(gè)類(lèi)型為 BufferedImage.TYPE_INT_BGR 類(lèi)型的圖像緩存BufferedImage buffImg = null;buffImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);//在 buffImg 中創(chuàng)建一個(gè) Graphics2D 圖像Graphics2D graphics = null;graphics = buffImg.createGraphics();//設(shè)置一個(gè)顏色, 使 Graphics2D 對(duì)象的后續(xù)圖形使用這個(gè)顏色 graphics.setColor(Color.WHITE);//填充一個(gè)指定的矩形: x - 要填充矩形的 x 坐標(biāo); y - 要填充矩形的 y 坐標(biāo); width - 要填充矩形的寬度; height - 要填充矩形的高度graphics.fillRect(0, 0, width, height);//創(chuàng)建一個(gè) Font 對(duì)象: name - 字體名稱; style - Font 的樣式常量; size - Font 的點(diǎn)大小Font font = null;font = new Font("", Font.BOLD, fontHeight);//使 Graphics2D 對(duì)象的后續(xù)圖形使用此字體 graphics.setFont(font);graphics.setColor(Color.BLACK);//繪制指定矩形的邊框, 繪制出的矩形將比構(gòu)件寬一個(gè)也高一個(gè)像素graphics.drawRect(0, 0, width - 1, height - 1);//隨機(jī)產(chǎn)生 15 條干擾線, 使圖像中的認(rèn)證碼不易被其它程序探測(cè)到Random random = null;random = new Random();graphics.setColor(Color.GREEN);for(int i = 0; i < 15; i++){int x = random.nextInt(width);int y = random.nextInt(height);int x1 = random.nextInt(20);int y1 = random.nextInt(20);graphics.drawLine(x, y, x + x1, y + y1);}//創(chuàng)建 randomCode 對(duì)象, 用于保存隨機(jī)產(chǎn)生的驗(yàn)證碼, 以便用戶登錄后進(jìn)行驗(yàn)證 StringBuffer randomCode;randomCode = new StringBuffer();for(int i = 0; i < codeCount; i++){//得到隨機(jī)產(chǎn)生的驗(yàn)證碼數(shù)字String strRand = null;strRand = String.valueOf(codeSequence[random.nextInt(36)]);//把正在產(chǎn)生的隨機(jī)字符放入到 StringBuffer 中 randomCode.append(strRand);//用隨機(jī)產(chǎn)生的顏色將驗(yàn)證碼繪制到圖像中 graphics.setColor(Color.BLUE);graphics.drawString(strRand, (i + 1)* codeX, codeY);}//再把存放有所有隨機(jī)字符的 StringBuffer 對(duì)應(yīng)的字符串放入到 HttpSession 中 request.getSession().setAttribute(CHECK_CODE_KEY, randomCode.toString());//禁止圖像緩存response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//將圖像輸出到輸出流中ServletOutputStream sos = null;sos = response.getOutputStream();ImageIO.write(buffImg, "jpeg", sos);sos.close();} }表單處理Servlet
package yang.mybatis.servlet.checkCode;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 java.io.IOException;/*** Created by yangshijing on 2017/11/23 0023.*/ public class CheckCodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String check_code_key = (String)session.getAttribute("CHECK_CODE_KEY");String checkCode = request.getParameter("checkCode");//不區(qū)分大小寫(xiě)if(check_code_key != null && !check_code_key.trim().equals("")){check_code_key = check_code_key.toLowerCase();}if (checkCode != null && !checkCode.trim().equals("")){checkCode = checkCode.toLowerCase();}//驗(yàn)證碼為NULL或者兩者不等,重定向到信息提示頁(yè)面if(check_code_key == null || checkCode == null && !check_code_key.equals(checkCode)){request.getSession().setAttribute("MessageIfo","驗(yàn)證不一致");response.sendRedirect(request.getContextPath()+"/jsp/checkCode/index.jsp");return;}//如果兩個(gè)驗(yàn)證碼一致,處理該表單請(qǐng)求,并移除sesssion域中的屬性值session.removeAttribute("CHECK_CODE_KEY");response.sendRedirect(request.getContextPath()+"/jsp/token/success.jsp");} }?
轉(zhuǎn)載于:https://www.cnblogs.com/realshijing/p/7884709.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的简单的Session案例 —— 一次性验证码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jmeter 场景设计
- 下一篇: java 大数处理