Structs2实现随机验证码的过程

在我们做web相关的项目时,用户登录的页面是必不可少的,在用户进行页面登录时,除了用户名和密码外,我们一般情况下都会去生成一个验证码来,让用户输入用户名和密码的同时输入验证码来进行用户的登录,在这里我们为什么一般要使用验证码呢?其实道理很简单,就是防止黑客的“暴力”登录,在用户没有使用验证码的时候,黑客可以通过不断的试探用户名和密码来进行系统的登录,使用验证码过后,由于验证码是随机生成的,所以黑客使用暴力的方式进行登录是基本不会成功的,下面就来说说怎么使用SSH的时候来生成随机验证码。

      首先是书写一个生成随机验证码的类,其实这个类的实现是比较简单的,当然对于初学者或没有书写过验证码的人来说还是有那么点难度的。这个类的名字是AuthImg.java,由于使用的是Structs2进行页面与逻辑之间的转换,所以继承了Struct2的ActionSupport类。具体代码如下:



package com.ebuy.util;

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

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

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 验证码类
* @author kjgj
*
*/
public class AuthImg extends ActionSupport{
//设置图片验证码的字符串的字体和大小
private Font mfont = new Font("Arial Black", Font.PLAIN, 16);
//生成随机颜色
Color getRandColor(int fc,int bc){
  Random rand = new Random();
  if(fc > 255){
   fc = 255;
  }
  if(bc > 255){
   bc = 255;
  }
  int r = fc + rand.nextInt(bc - fc);
  int g = fc + rand.nextInt(bc - fc);
  int b = fc + rand.nextInt(bc - fc);
  return new Color(r, g, b);
}
public String execute() throws Exception{
  HttpServletRequest request = ServletActionContext.getRequest();
  HttpServletResponse response = ServletActionContext.getResponse();
  //防止页面缓存,保证生成的随机码都是新的
  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "No-cache");
  response.setDateHeader("Expires", 0);
  response.setContentType("image/jpeg");
  //指定验证码图片大小
  int width = 100,height = 18;
  //生成一张新图片
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  //在图片中绘制内容
  Graphics g = image.getGraphics();
  Random random = new Random();
  g.setColor(getRandColor(200, 250));
  g.fillRect(1, 1, width-1, height-1);
  g.setColor(new Color(102, 102, 102));
  g.drawRect(0, 0, width-1, height-1);
  g.setFont(mfont);
  //随机生成线条,使图片看起来更加杂乱
  g.setColor(getRandColor(160, 200));
  for(int i = 0; i < 155;i++){
   int x = random.nextInt(width - 1);
   int y = random.nextInt(height -1);
   int x1 = random.nextInt(6) + 1;
   int y1 = random.nextInt(12) + 1;
   g.drawLine(x, y, x+x1, y+y1);
  }
  for(int j = 0;j < 70;j++){
   int x = random.nextInt(width - 1);
   int y = random.nextInt(height -1);
   int x1 = random.nextInt(12) + 1;
   int y1 = random.nextInt(6) + 1;
   g.drawLine(x, y, x-x1, y-y1);
  }
  //用于保存生成的随机字符串
  String sRand = "";
  for(int k = 0;k < 6;k++){
   //取得一个随机字符
   String tmp = getRandomChar();
   sRand += tmp;
   //将生成的随机字符串添加到验证码图片上
   g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
   g.drawString(tmp, 15*k+10, 15);
  }
  //取得用户session
  HttpSession session = request.getSession(true);
  //将生成的随机码放到session中
  session.setAttribute("rand", sRand);
  g.dispose();
  //输出验证码图片
  ImageIO.write(image, "JPEG", response.getOutputStream());
  return null;
}
//生成随机字符串的方法
private String getRandomChar(){
  int rand = (int)Math.round(Math.random()*2);
  long ltmp = 0;
  char ctmp = '\u0000';
  //根据rand的值来生成一个大\小写字母,数字
  switch(rand){
      //生成大写字母
     case  1:
      ltmp = Math.round(Math.random() * 25 + 65);
      ctmp = (char)ltmp;
      return String.valueOf(ctmp);
     //生成小写字母
     case  2:
      ltmp = Math.round(Math.random() * 25 + 97);
      ctmp = (char)ltmp;
      return String.valueOf(ctmp);
    //生成数字
     default:
      ltmp = Math.round(Math.random() * 9);
      return String.valueOf(ltmp);
  }
}
}




      Structs2的配置文件structs.xml的配置如下:

<constant name="struts.objectFactory" value="spring"></constant>
<package name="demo" extends="struts-default">
      <action name="authImg" class="authImg">
          <result>/welcome.jsp</result>
      </action>
   </package>



spring的配置文件applicationContext.xml的配置如下:

<bean id="authImg" class="com.ebuy.util.AuthImg" />



进行展示的welcome.jsp页面的实现如下:

验证码如图:<img alt="" src="authImg.action" id="authImg">看不清楚?<a href="#" onclick="refersh()">单击此处刷新</a>





<script type="text/javascript">
  //刷新验证码
  function refersh(){
     alert("av");
     document.getElementById("authImg").src='authImg.action?now=' +(new Date()).getTime();
  }
</script>



以上就是实现一个验证码的主要过程

猜你喜欢

转载自357029540.iteye.com/blog/2203536