1.產生圖片的工廠:
- package org.blog.util;
-
-
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.util.Random;
-
-
- import javax.imageio.ImageIO;
- import javax.imageio.stream.ImageOutputStream;
-
-
-
-
- public class RandomNumUtil
- {
- private ByteArrayInputStream image;
- private String str;
-
- public RandomNumUtil()
- {
- init();
- }
-
- public static RandomNumUtil Instance()
- {
- return new RandomNumUtil();
- }
-
- public ByteArrayInputStream getImage()
- {
- return this.image;
- }
-
- public String getString()
- {
- return this.str;
- }
-
- private void init()
- {
- //在內存中創建圖象
- int width = 109;
- int height = 40;
- BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-
- /* 獲取內在中圖像的上下文 */
- Graphics g = image.getGraphics();
-
- /* 創建一個隨機類 */
- Random random = new Random();
-
- /* 設置背景顏色 */
- g.setColor(this.getRandColor(200, 250));
- g.fillRect(0, 0, width, height);
-
- /* 設置字體 */
- g.setFont(new Font("Times New Roman", Font.PLAIN, 28));
-
- /* 設置干擾線的顏色 */
- 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);
- }
-
- /* 用來臨時保存隨機產生的數字 */
- String sRand = "";
- for (int i=0; i<4; i++)
- {
- String rand = String.valueOf(random.nextInt(10));
- sRand += rand;
- g.setColor(new Color(20 + random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110) ));
- g.drawString(rand, 20*i+10, 25);
- /* 然後賦給str */
- this.str = sRand;
- }
- /* 使圖像生效 */
- g.dispose();
-
-
- ByteArrayInputStream input = null;
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- try
- {
- ImageOutputStream imageOutput = ImageIO.createImageOutputStream(output);
- ImageIO.write(image, "JPEG", imageOutput);
- imageOutput.close();
- input = new ByteArrayInputStream(output.toByteArray());
- } catch (Exception e)
- {
- System.out.println("驗證碼圖片產生出現錯誤:"+e.toString());
- }
- this.image = input;
- }
-
- /* 隨機產生顏色 */
- 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);
- }
- }
2.通過Action獲取該圖片:
- package org.blog.admin.action;
-
-
- import java.io.ByteArrayInputStream;
-
-
- import org.blog.util.RandomNumUtil;
-
-
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionSupport;
-
-
- public class GetRandomNum extends ActionSupport
- {
- private static final long serialVersionUID = 1L;
- private ByteArrayInputStream inputStream;
-
- public ByteArrayInputStream getInputStream()
- {
- return inputStream;
- }
-
-
- public void setInputStream(ByteArrayInputStream inputStream)
- {
- this.inputStream = inputStream;
- }
-
-
- public String execute() throws Exception
- {
- RandomNumUtil randomNumUtil = RandomNumUtil.Instance();
- this.setInputStream(randomNumUtil.getImage());
- ActionContext.getContext().getSession().put("validateCode", randomNumUtil.getString());
- return SUCCESS;
- }
- }
3.在strus.xml中配置:
- <!-- 獲取隨機產生的數字驗證碼 -->
- <action name="getRandomNumber" class="org.blog.admin.action.GetRandomNum">
- <result type="stream">
- <param name="contentType">image/jpeg</param>
- <param name="inputName">inputStream</param>
- </result>
- </action>
4.在jsp文件中:
- <img src="getRandomNumber" width="90" height="25" alt="驗證碼圖片" id="randomCode"/>
- <a href="#" id="refresh" style="font-size:12px;">看不楚,換張圖片</a>
5.局部刷新驗證碼的js代碼:(主要的思想是讓圖片的src屬性,通過js來每次重新加載一次action.可以通過產生隨機數或以當前時間為種子,這樣每次都去重新讀取產生圖片的Action了)
- $(function() {
- $("#refresh").click(function() {
- var rom = new Date();
- $("#randomCode").attr("src", "getRandomNumber?timestamp="+rom);
- });
- });