zoukankan      html  css  js  c++  java
  • 生成并验证 验证码

    首先给出显示页面:index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>My JSP 'index.jsp' starting page</title>
      </head>
      
      <body>
        <h3>带有验证码的登录页面</h3>
        <form action="servlet/LogonFormServlet" method="post">
            用户名:<input type="text" name="name" ><br>
            密     码:<input type="text" name="password"><br>
            验证码:<input type="text" name="check_code"><br>
            <img src="servlet/CheckCodeServlet"><br>
            <input type="submit" value="登录">
        </form>
      </body>
    </html>

    效果就是显示用户名、密码、验证码,以及给出对应的输入框,不多说

    然后给出验证码生成的servlet并且将随机生成的验证码保存到session中去。

    package com.cjg.servlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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 CheckCodeServlet extends HttpServlet {
        
        private static int WIDTH=60;
        private static int HEIGHT=20;
    
        /**
             * 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 {
    
            //PrintWriter out = response.getWriter();
            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);
            sos.write(buf);
            bos.close();
            sos.close();
            session.setAttribute("check_code", new String(rands));
            
        
        }
        
        
        //把随机产生的字符画成图片
        private void drawRands(Graphics g, char[] rands) {
            g.setColor(Color.black);
            g.setFont(new Font(null,Font.ITALIC|Font.BOLD,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);
        }
    
        //制作背景
        private void drawBackground(Graphics g) {
            //制作背景
            g.setColor(new Color(0xDCDCDC));
            g.fillRect(0, 0, WIDTH, HEIGHT);
            
            //产生干扰点 num个
            int num=120;
            for(int i=0;i<num;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);
            }
            
        }
        //生成随机验证码
        private char[] generateCheckCode() {
            String chars="0123456789abcdefghijklmnopqrstuvwxyz";
            char rands[]=new char[4];
            for(int i=0;i<4;i++){
                int rand=(int)(Math.random()*36);
                rands[i]=chars.charAt(rand);
            }
            return rands;
        }
    
        /**
             * 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 {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            
        }
    
    }

    登录验证,这里由于没有进行相应的数据库开发,所以不对用户名和密码进行验证,仅仅演示验证码的验证。

    package com.cjg.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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 LogonFormServlet extends HttpServlet {
    
        /**
             * 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.setContentType("text/html");
            PrintWriter out = response.getWriter();
            
        }
    
        /**
             * 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 {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            
        }
        
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            HttpSession session = request.getSession(false);
            if(session==null){
                out.println("验证码生成失败,请刷新重试,session 错误");
                return ;
            }
            
            //获取session中的验证码
            String saveCode = (String)session.getAttribute("check_code");
            if(saveCode==null){
                out.println("验证码生成失败,请刷新重试");
                return;
            }
            
            //获取requset中提交的验证码
            String checkCode=request.getParameter("check_code");
            System.out.println("输入的是:"+checkCode+"保存的验证码是:"+saveCode);
            if(!saveCode.equals(checkCode)){
                out.println("验证码错误");
                return;
            }
            session.removeAttribute("check_code");
            out.println("登录成功");
        }
    }

    最后给出 声明servlet配置的web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <servlet>
        <servlet-name>CheckCodeServlet</servlet-name>
        <servlet-class>com.cjg.servlet.CheckCodeServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>LogonFormServlet</servlet-name>
        <servlet-class>com.cjg.servlet.LogonFormServlet</servlet-class>
      </servlet>
    
      
      <servlet-mapping>
          <servlet-name>CheckCodeServlet</servlet-name>
          <url-pattern>/servlet/CheckCodeServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>LogonFormServlet</servlet-name>
        <url-pattern>/servlet/LogonFormServlet</url-pattern>
      </servlet-mapping>
    
    
    </web-app>

    小实例总结:

      到现在我明白了servlet配置的含义:声明servlet,给出路径,给出映射。

    这么说其实也不是很明白,但是,相信我,写几个servlet应用程序就可以理解了,

    因为这几个配置都是死的,定式的。不难理解。你可以这么想,总比泰勒展开式简单

    吧。fighting。

    下次记的把代码不展开。不然太多了。

    关于控制台:在调试的时候,有时候控制台没有日志显示出来,气得我想砸电脑,其实那是你的程序没有执行。

    肯定是配置存在问题。

    比如:from 的action 路径没有设置,或者是设置之后没有实现。(我就是这样错的)

  • 相关阅读:
    short-path problem (Spfa) 分类: ACM TYPE 2014-09-02 00:30 103人阅读 评论(0) 收藏
    short-path problem (Floyd) 分类: ACM TYPE 2014-09-01 23:58 100人阅读 评论(0) 收藏
    short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏
    Binary Indexed Tree 2D 分类: ACM TYPE 2014-09-01 08:40 95人阅读 评论(0) 收藏
    博弈论入门小结 分类: ACM TYPE 2014-08-31 10:15 73人阅读 评论(0) 收藏
    快速幂取模 分类: ACM TYPE 2014-08-29 22:01 95人阅读 评论(0) 收藏
    Segment Tree 扫描线 分类: ACM TYPE 2014-08-29 13:08 89人阅读 评论(0) 收藏
    Binary Indexed Tree 分类: ACM TYPE 2014-08-29 13:08 99人阅读 评论(0) 收藏
    Segment Tree 分类: ACM TYPE 2014-08-29 13:04 97人阅读 评论(0) 收藏
    Segment Tree with Lazy 分类: ACM TYPE 2014-08-29 11:28 134人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/5808360.html
Copyright © 2011-2022 走看看