`

登录图片验证

阅读更多

自己的验证图片生成servlet,还有相关的配置和JSP。先留个脚印

 

package com.thomas.logoimagecheck;

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;
import javax.servlet.http.HttpSession;

public class ValidateCodeServlet extends HttpServlet {
 // 验证码宽和高及验证码的位数
 private int width = 80;

 private int height = 30;

 private int codecount = 4;

 private int fontheight;

 private int x;

 private int codeY;

 char[] codeSequence = { '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

 public void inti() throws ServletException {
  // 从web.xml文件中读取参数
  String strWidth = this.getInitParameter("width");
  String strHeight = this.getInitParameter("height");
  String codeCount = this.getInitParameter("codeCount");
  try {
   if (strWidth != null && strWidth.length() != 0) {
    width = Integer.getInteger(strWidth);
   }
   if (strHeight != null && strHeight.length() != 0) {
    height = Integer.parseInt(strHeight);
   }
   if (codeCount != null && codeCount.length() != 0) {
    codecount = Integer.parseInt(codeCount);
   }
  } catch (NumberFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

protected void service(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // 定义图像buffer
  x = width / (codecount + 1);
  fontheight = height - 4;
  codeY = height - 4;
  BufferedImage bimage = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  Graphics2D g = bimage.createGraphics();
  Random random = new Random();
  g.setColor(Color.white);
  g.fillRect(0, 0, width, height);
  // 创建字体,字体的大小应该根据图片的高度来定。(fontheight实现了)
  Font font = new Font("Times New Roman",Font.PLAIN,fontheight);
  // 设置画的边框
  g.setFont(font);
  g.setColor(new Color(110,110,110));
  g.drawRect(0, 0, width - 1, height - 1);
  // 随机产生160条干扰线
  //g.setColor(Color.BLACK);
  for (int i = 0; i < 160; i++) {
   int x = random.nextInt(160);
   int y = random.nextInt(160);
   int xl = random.nextInt(12);
   int yl = random.nextInt(12);
   g.drawLine(x, y, x + xl, y + yl);
  }
  StringBuffer randomcode = new StringBuffer();
  int red = 0, green = 0, blue = 0;
  // 随机产生验证码
  for (int i = 0; i < codecount; i++) {
   // 产生验证码的数字
   String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
   System.out.print(strRand);
   red=20+random.nextInt(110);
   green=20+random.nextInt(110);
   blue=20+random.nextInt(110);
   g.setColor(new Color(red,green,blue));
   g.drawString(strRand,18*i+10,codeY);
   randomcode.append(strRand);
  }
  //把字符串存储到session中
  HttpSession session=req.getSession();
  session.setAttribute("valibaleCode", randomcode.toString());
  resp.setHeader("Pragma","no-cache");
  resp.setHeader("Cache-Control","no-cache");
  resp.setContentType("image/jpeg");
  ServletOutputStream sos=resp.getOutputStream();
  ImageIO.write(bimage, "jpeg", sos);
  sos.close();
 }
}

 

下面是验证的jsp

 

<body>
  <% String str=(String)session.getAttribute("valibaleCode");
   String imagestr=request.getParameter("rand");
   //out.print(request.getParameter("rand"));
  //out.print(str);
   if(!imagestr.equalsIgnoreCase(str)){
    out.print("unpassed");
   }
   if(imagestr.equalsIgnoreCase(str)){
    out.print("passed ");
   }
   %>
  <form method=post action="logoncheck/logon.jsp">
    <img border=0 src="<%=basePath %>validate">
    <input type=text name=rand value=""/>
    <input type=submit value="check"/>
    </form>
  </body>

 

web.xml文件

<servlet-name>ValidateCodeServlet</servlet-name>
 <servlet-class>com.thomas.logoimagecheck.ValidateCodeServlet</servlet-class>
 <init-param>
 <param-name>width</param-name>
 <param-value>200</param-value>
 </init-param>
 <init-param>
 <param-name>height</param-name>
 <param-value>80</param-value>
 </init-param>
 <init-param>
 <param-name>codeCount</param-name>
 <param-value>5</param-value>
 </init-param>
 </servlet>
  
  
   <servlet-mapping>
   <servlet-name>ValidateCodeServlet</servlet-name>
   <url-pattern>/validate</url-pattern>
   </servlet-mapping>

 

分享到:
评论
1 楼 i_am_birdman 2010-11-29  
问下:你这个验证码是放在session中,能不能放在数据库里呢?
哪种方法比较好?

相关推荐

Global site tag (gtag.js) - Google Analytics