struts生成登录验证码

来源:互联网 发布:南宁java培训 编辑:程序博客网 时间:2024/06/06 15:40

1.先用servlet生成验证图片  servlet/AuthImg.java代码如下

 

 package servlet;
import java.io.*;   
import javax.servlet.*;   
import javax.servlet.http.*;   
import java.awt.*;   
import java.awt.image.*;   
import javax.imageio.ImageIO; 
  
public class AuthImg extends HttpServlet {  
  
 private static int WIDTH = 60;   
 private static int HEIGHT = 25;   
 public void doGet(HttpServletRequest request, HttpServletResponse response) {   
        try{   
    HttpSession session = request.getSession();   
    response.setContentType("image/jpeg");   
    ServletOutputStream sos = response.getOutputStream();   
    // 设置浏览器不要缓存此图片   
    response.setHeader("Pragma", "No-cache");   
    response.setHeader("Cache-Control", "no-cache");   
    response.setDateHeader("Expires", 0);   
    // 创建内存图象并获得其图形上下文   
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT,   
      BufferedImage.TYPE_INT_RGB);   
    Graphics g = image.getGraphics();   
    // 产生随机的认证码   
    char[] rands = generateCheckCode();   
    // 产生图像   
    drawBackground(g);   
    drawRands(g, rands);   
    // 结束图像 的绘制 过程, 完成图像   
    g.dispose();   
    // 将图像输出到客户端   
    ByteArrayOutputStream bos = new ByteArrayOutputStream();   
    ImageIO.write(image, "JPEG", bos);   
    byte[] buf = bos.toByteArray();   
    response.setContentLength(buf.length);   
    // 下面的语句也可写成: bos.writeTo(sos);   
    sos.write(buf);   
    bos.close();   
    sos.close();   
    // 将当前验证码存入到 Session 中   
    session.setAttribute("check_code", new String(rands));   
    // 直接使用下面的代码将有问题, Session 对象必须在提交响应前获得   
    // request.getSession().setAttribute("check_code",new String(rands));   
        }catch(Exception e){   
         e.printStackTrace();   
        }   
 }   
 /**  
   * 定义验证码的字符表  
   * @return  
   */   
 private char[] generateCheckCode() {   
   String chars = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";   
   char[] rands = new char[4];   
   for (int i = 0; i < 4; i++) {   
    int rand = (int) (Math.random() * 61);   
    rands[i] = chars.charAt(rand);   
   }   
   return rands;   
 }   
     /**  
      * 划出随机数值  
      * @param  
      * @param rands  
      */   
 private void drawRands(Graphics g, char[] rands) {   
   g.setColor(Color.BLUE);   
   g.setFont(new Font(null, Font.PLAIN | Font.PLAIN, 18));   
   g.drawString("" + rands[0], 1, 17);   
   g.drawString("" + rands[1], 16, 15);   
   g.drawString("" + rands[2], 31, 18);   
   g.drawString("" + rands[3], 46, 16);   
   //System.out.println(rands);   
 }   
     /**  
      * 画图片背景  
      * @param g  
      */   
 private void drawBackground(Graphics g) {   
   g.setColor(new Color(0xDCDCDC));   
   g.fillRect(0, 0, WIDTH, HEIGHT);   
   // 随机产生 120 个干扰点   
   for (int i = 0; i < 120; i++) {   
    int x = (int) (Math.random() * WIDTH);   
    int y = (int) (Math.random() * HEIGHT);   
    int red = (int) (Math.random() * 255);   
    int green = (int) (Math.random() * 255);   
    int blue = (int) (Math.random() * 255);   
    g.setColor(new Color(red, green, blue));   
    g.drawOval(x, y, 1, 0);   
   }   
 }   
 /**  
   * 验证用户输入的验证码  
   * 
   *       */   
 public boolean checkLook(HttpServletRequest request, HttpServletResponse response,String check){   
    response.setContentType("text/html;charset=GB2312");   
    try{   
           PrintWriter out = response.getWriter();   
           HttpSession session = request.getSession(false);   
           check = check.toLowerCase();    //这里把用户输入的验证码转换成小写   
           if(session == null)   
               return false;   
           String savedCode = (String)session.getAttribute("check_code");   
           savedCode = savedCode.toLowerCase();  //这里把存到session里的值转换成小写   
           if(savedCode == null)   
                return false;   
           if(!savedCode.equals(check))                       
                return false;   
    }catch(Exception e){   
     e.printStackTrace();   
    }   
    return true;   
 }   
 }   

 2.编写com/struts/forms/ LoginForm.java代码如下:

 

          package com.struts.forms;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class LoginForm extends ActionForm
{
     /**loginForm
      * @bob
      */
       private String username;
       private String password;
       private String checknum;
 public String getUsername() {
  return username;
 }
  public String getChecknum() {
  return checknum;
 }
 public void setChecknum(String checknum) {
  this.checknum = checknum;
 }

}

3.编写com/struts/actions/LoginFormAction.java代码如下

package com.struts.actions;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.struts.forms.LoginForm;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import servlet.AuthImg;
public class LoginFormAction extends Action
{

 /**用户登录判断
  * @bob
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception
   {
  LoginForm loginForm=(LoginForm)form;
          String  checknum=loginForm.getChecknum();
    if(checknum==null||"".equals(checknum))
    {
     request.setAttribute("login_form_checknum","请输入验证码!");
     return  mapping.findForward("error");
    }
    else
    {  AuthImg img=new  AuthImg();
     if(img.checkLook(request, response, checknum)==false)
     {
      request.setAttribute("login_form_checknum", "验证码错误!");
      request.getSession(false).removeAttribute("check_code");   
               return  mapping.findForward("error");
     }
     }
    
 }
              
}

4.web.xml的配置

  <servlet>
<servlet-name>AuthImg</servlet-name>
<servlet-class>servlet.AuthImg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AuthImg</servlet-name>
<url-pattern>/AuthImg</url-pattern>
</servlet-mapping>

5.struts-config.xml配置

   <form-beans>
<form-bean name="loginForm" type="com.struts.forms.LoginForm"/>
</form-beans>

 

  <action-mappings>
  <action path="/login"
          name="loginForm"
          type="com.struts.actions.LoginFormAction"
           validate="false"
          input="login.jsp"
  >
 <forward name="error" path="/login.jsp"/>
  
 </action>
  </action-mappings>

6.login.jsp部分代码如下

   <tr>
       <td>验证码</td><td><input type="text" name="checknum"  size="10"/><img src="AuthImg"/></td>   *注意此处为你在web.xml配置的映射路径,此处显示图片
       <td><font color="red">${login_form_checknum}</font></td>
       </tr>
       <tr>
       <td><input type="submit"  value="提交"></td> 
       <td><input type="reset"  value="重置"></td>

</tr>

       

         

原创粉丝点击