閱讀158 返回首頁    go 阿裏雲 go 技術社區[雲棲]


struts2中生成驗證碼

 

action:

package com.xy.action;

import java.awt.Color;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Map;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;


public class CodeGenAction extends ActionSupport implements SessionAware,ServletResponseAware,RequestAware
{

 private static int I_WIDTH = 60;
 private static int I_HEIGHT = 18;
 private static Font VALIDATECODE_FONT = new Font("Times   New   Roman ", Font.PLAIN, 18);
 private Map<String,Object> session;
 private HttpServletResponse response;
 private Map<String, Object> request;
 
 public String execute()
 {
  response.setHeader("Pragma", "No-cache");

  response.setHeader("Cache-Control", "no-cache");

  response.setDateHeader("Expires", 0);

  response.setContentType("image/jpeg");

  // 在內存中創建圖象
  BufferedImage image = new BufferedImage(I_WIDTH, I_HEIGHT, BufferedImage.TYPE_INT_RGB);
  // 獲取圖形上下文
  Graphics g = image.getGraphics();
  // 設定背景色
  g.setColor(Color.white);
  g.fillRect(0, 0, I_WIDTH, I_HEIGHT);
  // 畫邊框
  g.setColor(Color.blue);
  g.drawRect(0, 0, I_WIDTH - 1, I_HEIGHT - 1);
  Long validate = new Long(10000 + Math.round((Math.random() * 90000)));
  String validateCode = validate.toString();
  session.put("validateCode", validateCode);
  
  // 將認證碼顯示到圖象中
  g.setColor(Color.black);
  g.setFont(VALIDATECODE_FONT);
  // g.drawString(rand,10,15);
  g.drawString(validateCode.toString(), 7, 15);
  // 隨機產生88個幹擾點,使圖象中的認證碼不易被其它程序探測到
  Random random = new Random();
  for (int iIndex = 0; iIndex < 128; iIndex++)
  {
   int x = random.nextInt(I_WIDTH);
   int y = random.nextInt(I_HEIGHT);
   g.drawLine(x, y, x, y);
  }
  // 圖象生效
  g.dispose();
  
  try
  {
   // 輸出圖象到頁麵
   ServletOutputStream sos = response.getOutputStream();
   ImageIO.write(image, "jpeg", sos);
   sos.close();
   return SUCCESS;
  }
  catch (Exception e)
  {
   return "error";
  }
 }
 

 public void setSession(Map<String, Object> session)
 {
  this.session = session;
 }

 public void setServletResponse(HttpServletResponse response)
 {
  this.response = response;  
 }

 public void setRequest(Map<String, Object> request)
 {
  this.request = request;
 }

}


struts.xml,值得注意的時,result type是stream類型

<package name="login" namespace="/" extends="struts-default">
 <action name="toCode" >
  <result type="stream">
   <param name="contentType">image/jpeg</param>
  </result>
 </action>
</package>


jsp:

<td align="left">
<input type="text" />
<img src="toCode" />
<a href="javascript:change()"> 看不清,換一張</a>
</td>

 function change()
 {
     var img=document.getElementByIdx_x("imgCode");
 img.src="toCode?time="+new Date().getTime();
 }

最後更新:2017-04-02 22:15:58

  上一篇:go DataList留言板
  下一篇:go 字符串1包含幾個字符串2