zoukankan      html  css  js  c++  java
  • jsp验证码页面笔记

    首先在网上搜了下jsp生成验证码的代码,如下:

    package com.servlet;


    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;


    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    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 static final long serialVersionUID = 4008416931787800531L;


    /**
     * Constructor of the object.
     */
    public ValidateCodeServlet() {
     super();
    }


    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
     super.destroy(); // Just puts "destroy" string in log
    }


    /**
     * The doGet method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {


     //设置页面不缓存
     response.setHeader("Pragma", "No-cache");
     response.setHeader("Cache-Control", "no-cache");
     response.setDateHeader("Expires", 0);


     // 在内存中创建图象
     int width = 60, height = 20;
     BufferedImage image = new BufferedImage(width, height,
       BufferedImage.TYPE_INT_RGB);


     // 获取绘画对象
     Graphics g = image.getGraphics();
     // 设定背景色
     g.setColor(getRandColor(225, 250));
     g.fillRect(0, 0, width, height);
     //设定字体
     g.setFont(new Font("Times New Roman", Font.BOLD, 20));


     // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
     Random random = new Random();
     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);
     }


     // 取随机产生的认证码(4位数字)
     String sRand = generateWord();
     byte[] cs = sRand.getBytes();
     for (int i = 0; i < 4; i++) {
    String a = new String(cs, i, 1);
    //   String rand = String.valueOf(random.nextInt(10));
      String rand = a;
    //   sRand += rand;
      // 将认证码显示到图象中
      g.setColor(new Color(20 + random.nextInt(110), 20 + random
        .nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
      g.drawString(rand, 13 * i + 6, 16);
     }


     // 将认证码存入SESSION
     HttpSession session = request.getSession();
     session.setAttribute("valicode", sRand);


     // 图象生效
     g.dispose();


     // 输出图象到页面
     ImageIO.write(image, "JPEG", response.getOutputStream());


    }


    /**
     * The doPost method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to post.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
    }


    /**
     * 给定范围获得随机颜色
     * @param fc
     * @param bc
     * @return
     */
    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);
    }
    private  String generateWord() {  
           String[] beforeShuffle = new String[] {"1", "2", "3", "4", "5", "6", "7",  
                   "8", "9", "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" };  
           List list = Arrays.asList(beforeShuffle);  
           Collections.shuffle(list);  
           StringBuilder sb = new StringBuilder();  
           for (int i = 0; i < list.size(); i++) {  
               sb.append(list.get(i));  
           }  
           String afterShuffle = sb.toString();  
           String result = afterShuffle.substring(5, 9);  
           return result;  
       }  
    }

    自己加工了下,原先是产生随机数,这里我就用一个list集合了

    然后是在jsp页面中引用这个servlet,如下:

    <img id="servletimg" src="<%=path %>/ValidateCodeServlet" flush="true" onclick="reloadImage()" style="vertical-align: bottom;cursor:pointer"></img>


    注:cursor:pointer是变手形,reloadImage()是js方法

    function reloadImage(){
    document.getElementById('servletimg').src="<%=path %>/ValidateCodeServlet";
    }

    把相同地址再设置一遍就ok了

  • 相关阅读:
    JSF大概介绍
    专门用于swing显示的工具类
    oracle 中查某表的所有列字段
    从实例谈OOP、工厂模式和重构
    C#中结构或类的嵌套 的方法
    怎样成为优秀的软件模型设计者
    Asp.NET编程时的几个小技巧
    在.net安装程序中部署oracle客户端全攻略
    在.NET中调用Oracle9i存储过程经验总结
    使用JNDI的一个容易忽略的错误
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215652.html
Copyright © 2011-2022 走看看