您的位置:首页 > Web前端 > JavaScript

简单登陆页面验证码制作和jsp中获取验证码内容

2016-09-11 18:53 661 查看
jsp登陆页面:

<html>

  <head>

    <title>验证码</title>

    <script type="text/javascript">

    function again(obj) {

        obj.src = "imageServlet?"+Math.random();

    }

    </script>

  </head>

  <body>

  <center>

    <form action="checkServlet.jsp" method="post">

       <label>用户名:</label><input type="text" name="user"/><br><br>

      <label>密    码:</label><input type="password" name="pwd"/><br>

      <label>验证码:</label>

        <input type="text" name="randomCode" value="区分大小写"/> <img title="点击更换" onclick="javascript:again(this);" src="imageServlet"><br/>

        <input type="submit" value="submit">

    </form>

    </center>

  </body>

</html>

jsp的验证页面(部分):

 <body>

       <sql:query var="result" dataSource="${dbs }">

        select name,password from user 

       </sql:query>

       

          <c:set var="user" value="${result.rows[0].name }"></c:set>      

          <c:set var="password" value="${result.rows[0].password }"></c:set>

       

           <c:set var="checkcode" value="${param.randomCode }"></c:set>

           <c:set var="session" value="${sessionScope.RANDOMVALIDATECODEKEY }"></c:set>

           <c:if test="${password==param.pwd }">

                <c:if test="${user==param.user }">

                    <c:if test="${session==checkcode }">

                         <c:redirect url="http://localhost:8080/ToTal/Alltogether.jsp"></c:redirect>

                    </c:if>

                </c:if>

          </c:if>

    </body>

验证码的制作(借鉴他人的):

serlet:

package com.wf.web;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片

        response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容

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

        response.setDateHeader("Expire", 0);

        RandomValidateCode randomValidateCode = new RandomValidateCode();

        try {

            randomValidateCode.getRandcode(request, response);//输出图片方法

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }

}

生成随机数字和字母图片:

package com.wf.web;

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;

public class RandomValidateCode {

    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key

    private Random random = new Random();

    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串

    

    private int width = 80;//图片宽

    private int height = 26;//图片高

    private int lineSize = 40;//干扰线数量

    private int stringNum = 4;//随机产生字符数量

    /*

     * 获得字体

     */

    private Font getFont(){

        return new Font("Fixedsys",Font.CENTER_BASELINE,18);

    }

    /*

     * 获得颜色

     */

    private Color getRandColor(int fc,int bc){

        if(fc > 255)

            fc = 255;

        if(bc > 255)

            bc = 255;

        int r = fc + random.nextInt(bc-fc-16);

        int g = fc + random.nextInt(bc-fc-14);

        int b = fc + random.nextInt(bc-fc-18);

        return new Color(r,g,b);

    }

    /**

     * 生成随机图片

     */

    public void getRandcode(HttpServletRequest request,

            HttpServletResponse response) {

        HttpSession session = request.getSession();

        //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类

        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);

        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘
8d05
制操作

        g.fillRect(0, 0, width, height);

        g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));

        g.setColor(getRandColor(110, 133));

        //绘制干扰线

        for(int i=0;i<=lineSize;i++){

            drowLine(g);

        }

        //绘制随机字符

        String randomString = "";

        for(int i=1;i<=stringNum;i++){

            randomString=drowString(g,randomString,i);

        }

        session.removeAttribute(RANDOMCODEKEY);

        session.setAttribute(RANDOMCODEKEY, randomString);//将生成的随机数字和字母图片放在session中,

                                                                                                         //以供在验证登陆中取出和用户输入的文本内容比较(大小写区分)

        System.out.println(randomString);

        g.dispose();

        try {

            ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /*

     * 绘制字符串

     */

    private String drowString(Graphics g,String randomString,int i){

        g.setFont(getFont());

        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));

        String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));

        randomString +=rand;

        g.translate(random.nextInt(3), random.nextInt(3));

        g.drawString(rand, 13*i, 16);

        return randomString;

    }

    /*

     * 绘制干扰线

     */

    private void drowLine(Graphics g){

        int x = random.nextInt(width);

        int y = random.nextInt(height);

        int xl = random.nextInt(13);

        int yl = random.nextInt(15);

        g.drawLine(x, y, x+xl, y+yl);

    }

    /*

     * 获取随机的字符

     */

    public String getRandomString(int num){

        return String.valueOf(randString.charAt(num));

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: