jsp驗證碼頁面筆記

首先在網上搜了下jsp生成驗證碼的代碼,以下:java

package com.servlet;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class ValidateCodeServlet extends HttpServlet {


/**
 * 
 */
private static final long serialVersionUID = 4008416931787800531L;


/**
 * Constructor of the object.
 */
public ValidateCodeServlet() {
 super();
}


/**
 * Destruction of the servlet. <br>
 */
public void destroy() {
 super.destroy(); // Just puts "destroy" string in log
}


/**
 * The doGet method of the servlet. <br>
 * 
 * This method is called when a form has its tag value method equals to get.
 * 
 * @param request
 *            the request send by the client to the server
 * @param response
 *            the response send by the server to the client
 * @throws ServletException
 *             if an error occurred
 * @throws IOException
 *             if an error occurred
 */
public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {


 //設置頁面不緩存
 response.setHeader("Pragma", "No-cache");
 response.setHeader("Cache-Control", "no-cache");
 response.setDateHeader("Expires", 0);


 // 在內存中建立圖象
 int width = 60, height = 20;
 BufferedImage image = new BufferedImage(width, height,
   BufferedImage.TYPE_INT_RGB);


 // 獲取繪畫對象
 Graphics g = image.getGraphics();
 // 設定背景色
 g.setColor(getRandColor(225, 250));
 g.fillRect(0, 0, width, height);
 //設定字體
 g.setFont(new Font("Times New Roman", Font.BOLD, 20));


 // 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到
 Random random = new Random();
 g.setColor(getRandColor(160, 200));
 for (int i = 0; i < 155; i++) {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(12);
  int yl = random.nextInt(12);
  g.drawLine(x, y, x + xl, y + yl);
 }


 // 取隨機產生的認證碼(4位數字)
 String sRand = generateWord();
 byte[] cs = sRand.getBytes();
 for (int i = 0; i < 4; i++) {
String a = new String(cs, i, 1);
//   String rand = String.valueOf(random.nextInt(10));
  String rand = a;
//   sRand += rand;
  // 將認證碼顯示到圖象中
  g.setColor(new Color(20 + random.nextInt(110), 20 + random
    .nextInt(110), 20 + random.nextInt(110)));//調用函數出來的顏色相同,多是由於種子太接近,因此只能直接生成
  g.drawString(rand, 13 * i + 6, 16);
 }


 // 將認證碼存入SESSION
 HttpSession session = request.getSession();
 session.setAttribute("valicode", sRand);


 // 圖象生效
 g.dispose();


 // 輸出圖象到頁面
 ImageIO.write(image, "JPEG", response.getOutputStream());


}


/**
 * The doPost method of the servlet. <br>
 *
 * This method is called when a form has its tag value method equals to post.
 * 
 * @param request the request send by the client to the server
 * @param response the response send by the server to the client
 * @throws ServletException if an error occurred
 * @throws IOException if an error occurred
 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
}


/**
 * 給定範圍得到隨機顏色
 * @param fc
 * @param bc
 * @return
 */
private Color getRandColor(int fc, int bc) {
 Random random = new Random();
 if (fc > 255)
  fc = 255;
 if (bc > 255)
  bc = 255;
 int r = fc + random.nextInt(bc - fc);
 int g = fc + random.nextInt(bc - fc);
 int b = fc + random.nextInt(bc - fc);
 return new Color(r, g, b);
}
private  String generateWord() {  
       String[] beforeShuffle = new String[] {"1", "2", "3", "4", "5", "6", "7",  
               "8", "9", "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" };  
       List list = Arrays.asList(beforeShuffle);  
       Collections.shuffle(list);  
       StringBuilder sb = new StringBuilder();  
       for (int i = 0; i < list.size(); i++) {  
           sb.append(list.get(i));  
       }  
       String afterShuffle = sb.toString();  
       String result = afterShuffle.substring(5, 9);  
       return result;  
   }  
}緩存

本身加工了下,原先是產生隨機數,這裏我就用一個list集合了session

而後是在jsp頁面中引用這個servlet,以下:app

<img id="servletimg" src="<%=path %>/ValidateCodeServlet" flush="true" onclick="reloadImage()" style="vertical-align: bottom;cursor:pointer"></img>dom


注:cursor:pointer是變手形,reloadImage()是js方法jsp

function reloadImage(){
document.getElementById('servletimg').src="<%=path %>/ValidateCodeServlet";
}
函數

把相同地址再設置一遍就ok了post

相關文章
相關標籤/搜索