一、手写实现验证码

1.新建web项目,修改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>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  <script type="text/javascript">
      function reloadCode(){
          var time = new Date().getTime();
          document.getElementById("codeImage").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time;
      }
  </script>
  
  <body>
  <form action="<%=request.getContextPath()%>/servlet/loginServlet" method="post">
    <input type="text" name="checkCode">
    <input type="submit" value="提交">
  </form>
    <img name="codeImage" alt="验证码" src="<%=request.getContextPath()%>/servlet/ImageServlet">
      <a href="javascript:reloadCode();">换一张</a>
  </body>
</html>

 

2.生成图片的servlet

package com.servlet;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
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;

public class ImageServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    //生成图片
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        BufferedImage bi=new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);//创建图片
        Graphics g = bi.getGraphics();//获取画笔
        g.setColor(Color.LIGHT_GRAY);//设置画笔颜色
        g.fillRect(0, 0, 68, 22);//填充背景
        
        char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();//字符库
        Random r=new Random();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<4;i++){
            int index=r.nextInt(ch.length);//随机获取一个字符库里的字符库下标
            g.setColor(new Color(r.nextInt(100), r.nextInt(150), r.nextInt(250)));//给画笔设置随机颜色
            g.drawString(ch[index]+"", (i*15)+3, 15);//画刚才字符串下标的字符
            sb.append(ch[index]);//拼接,记录生成的字符内容
        }
        
        request.getSession().setAttribute("piccode", sb.toString());
        ImageIO.write(bi, "jpg", response.getOutputStream());
    }

}

 

3.登录验证

package com.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;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String userCode = request.getParameter("checkCode");//用户提交的字符串
        String imageCode=request.getSession().getAttribute("piccode").toString();//正确的字符串
        System.out.println(userCode+" "+imageCode);
        PrintWriter out = response.getWriter();
        try {
            if(userCode.toUpperCase().equals(imageCode)){//只要用户输入的正确(不论大小写)
                out.print("验证码正确");
            }else{
                out.print("验证码错误");
            }
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            out.flush();
            out.close();
        }
        
    }

}

 

4.配置servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    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_2_5.xsd">
  <servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.servlet.ImageServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.servlet.LoginServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/servlet/ImageServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/servlet/loginServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

5.项目源码

链接:https://pan.baidu.com/s/1mkh6f8k 密码:ie6z

posted @ 2018-02-13 12:19  菜鸡蔡文姬  阅读(283)  评论(0编辑  收藏  举报