JSP + Servlet实现生成登录验证码示例

随机生成四位数验证码,包括汉字,数字,英文大小写。

1.Servlet类

package servlet;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
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;
import javax.servlet.http.HttpSession;

public class PictureCheckCode extends HttpServlet {

   private static final long serialVersionUID = 1L; 

    public PictureCheckCode() {
      super();
    } 

    public void destroy() {
      super.destroy();
    } 

    public void init() throws ServletException {
      super.init();
    }
    /*该方法主要作用是获得随机生成的颜色*/
    public Color getRandColor(int s,int e){
      Random random=new Random ();
      if(s>255) s=255;
      if(e>255) e=255;
      int r,g,b;
      r=s+random.nextInt(e-s);  //随机生成RGB颜色中的r值
      g=s+random.nextInt(e-s);  //随机生成RGB颜色中的g值
      b=s+random.nextInt(e-s);  //随机生成RGB颜色中的b值
      return new Color(r,g,b);
    } 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    System.out.println("this is doGet method");
    this.doPost(request, response);

  }

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

    //设置不缓存图片
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "No-cache");
    response.setDateHeader("Expires", 0);
    //指定生成的响应图片,一定不能缺少这句话,否则错误.
    response.setContentType("image/jpeg");
    int width=80,height=35;   //指定生成验证码的宽度和高度
    BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片
    Graphics g=image.getGraphics();   //创建Graphics对象,其作用相当于画笔
    Graphics2D g2d=(Graphics2D)g;    //创建Grapchics2D对象
    Random random=new Random();
    Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式
    g.setColor(getRandColor(200,250));
    g.fillRect(0, 0, width, height);  //绘制背景
    g.setFont(mfont);          //设置字体
    g.setColor(getRandColor(180,200)); 

    //绘制100条颜色和位置全部为随机产生的线条,该线条为2f
    for(int i=0;i<100;i++){
      int x=random.nextInt(width-1);
      int y=random.nextInt(height-1);
      int x1=random.nextInt(6)+1;
      int y1=random.nextInt(12)+1;
      BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式
      Line2D line=new Line2D.Double(x,y,x+x1,y+y1);
      g2d.setStroke(bs);
      g2d.draw(line);   //绘制直线
    }
    //输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。
    String sRand="";
    String ctmp="";
    int itmp=0;
    //制定输出的验证码为四位
    for(int i=0;i<4;i++){
      switch(random.nextInt(3)){
        case 1:   //生成A-Z的字母
           itmp=random.nextInt(26)+65;
           ctmp=String.valueOf((char)itmp);
           break;
        case 2:   //生成汉字
           String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
           //生成第一位区码
           int r1=random.nextInt(3)+11;
           String str_r1=rBase[r1];
           //生成第二位区码
           int r2;
           if(r1==13){
             r2=random.nextInt(7);
           }else{
             r2=random.nextInt(16);
           }
           String str_r2=rBase[r2];
           //生成第一位位码
           int r3=random.nextInt(6)+10;
           String str_r3=rBase[r3];
           //生成第二位位码
           int r4;
           if(r3==10){
             r4=random.nextInt(15)+1;
           }else if(r3==15){
             r4=random.nextInt(15);
           }else{
             r4=random.nextInt(16);
           }
           String str_r4=rBase[r4];
           //将生成的机内码转换为汉字
           byte[] bytes=new byte[2];
           //将生成的区码保存到字节数组的第一个元素中
           String str_12=str_r1+str_r2;
           int tempLow=Integer.parseInt(str_12, 16);
           bytes[0]=(byte) tempLow;
           //将生成的位码保存到字节数组的第二个元素中
           String str_34=str_r3+str_r4;
           int tempHigh=Integer.parseInt(str_34, 16);
           bytes[1]=(byte)tempHigh;
           ctmp=new String(bytes);
           break;
        default:
           itmp=random.nextInt(10)+48;
           ctmp=String.valueOf((char)itmp);
           break;
      }
      sRand+=ctmp;
      Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));
      g.setColor(color);
      //将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示
      /*将文字旋转制定角度*/
      Graphics2D g2d_word=(Graphics2D)g;
      AffineTransform trans=new AffineTransform();
      trans.rotate((45)*3.14/180,15*i+8,7);
      /*缩放文字*/
      float scaleSize=random.nextFloat()+0.8f;
      if(scaleSize>1f) scaleSize=1f;
      trans.scale(scaleSize, scaleSize);
      g2d_word.setTransform(trans);
      g.drawString(ctmp, 15*i+18, 14);
    }
    HttpSession session=request.getSession(true);
    session.setAttribute("randCheckCode", sRand);
    System.out.println(sRand);
    g.dispose();  //释放g所占用的系统资源
    ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片
  }

}

2.web.xml配置

<servlet>
  <description>This is the description of my J2EE component</description>
  <display-name>This is the display name of my J2EE component</display-name>
  <servlet-name>PictureCheckCode</servlet-name>
  <servlet-class>servlet.PictureCheckCode</servlet-class>
 </servlet>

<servlet-mapping>
  <servlet-name>PictureCheckCode</servlet-name>
  <url-pattern>/pictureCheckCode</url-pattern>
 </servlet-mapping>

3.jsp页面输出验证码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>登录页面</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">
<script language="javascript">
  function myReload() {
    document.getElementById("CreateCheckCode").src = document
        .getElementById("CreateCheckCode").src
        + "?nocache=" + new Date().getTime();
  }
</script>

</head>

<body>
  <form action="loginServlet" method="get">
      <p class="font tdheight">
        验证码:<input type="text" name="checkCode"
          style="width:70px;height:35px;"> <img
          src="pictureCheckCode" id="CreateCheckCode" align="middle"
          style="margin-top:-10px;"> <br> <a href=""
          onclick="myReload()"
          style="font-size:12px;color:red;margin-left:156px;"> 看不清,换一个</a>
      </p>
      <br><input type="submit" value="提交"
            class="font" style="width:240px;height:35px;background:#f19e28">

    </form>
</body>
</html>

4.后台Servlet判断验证码是否与输入一致

通过request.getParameter(“checkCode”)获取输入验证码,与session.getAttribute(“randCheckCode”)比较是否一致。

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

    String code = request.getParameter("checkCode");
    HttpSession session = request.getSession();
    if (!code.equals(session.getAttribute("randCheckCode"))) {
      request.setAttribute("errormsg", "验证码不正确");
    }
    System.out.println(request.getAttribute("errormsg"));
  }

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript登录验证基础教程

    本文实例为大家分享了js登录验证的具体代码,供大家参考,具体内容如下 1.<script></script>的三种用法: 1.放在<body>中 2.放在<head>中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>欢迎你,请先登陆!</title> &l

  • js实现登录验证码

    Js代码: /** * 验证码 */ function yzm(){ var codeChars = new Array(0, 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', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',

  • node.js+captchapng+jsonwebtoken实现登录验证示例

    提到登录验证,大家肯定能想到的就是12306的验证码了吧.12306为了防止刷票,可以说是煞费苦心,验证码也越来越难识别,最终即使是人也可能识别不了了. 今天,小编就给大家说一下node如何实现图片验证码,以及使用token验证登录.学习本文你将学到: 1.使用captchapng生成图片验证码 2.使用jsonwebtoken实现登录验证 一.图片验证码生成(最后有全部代码) 首先,我们理一下流程,第一步服务器要随机生成一组四位数. 第二步,将这四位数用canvas绘图生成图片. 第三步,我们

  • 用JS实现简单的登录验证功能

    实现过程示意图 代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> <style> .ok { color: green; border: 1px solid green; } .error { color: red; border: 1px solid red; } </style> <s

  • JavaScript登录验证码的实现

    废话不多说,实现js登录验证码的功能需要下面两步,具体实现过程如下所示: 1.js var code="" ; //在全局 定义验证码 function createCode(){ code = ""; var codeLength = 6;//验证码的长度 var checkCode = document.getElementById("checkCode"); checkCode.value = ""; var selec

  • javascript和jquery分别实现用户登录验证

    在上一篇文章http://www.jb51.net/article/83504.htm中,用javascript实现了用户验证,但并没有对密码进行验证,这次追加了这个功能,并分别用javascript和jquery实现. 一.用jquery的ajax实现的关键代码 实现如下 /*jquery实现 $(document).ready(function(){ $("#account").blur(function(event) { $.ajax({ type:"GET"

  • JSP + Servlet实现生成登录验证码示例

    随机生成四位数验证码,包括汉字,数字,英文大小写. 1.Servlet类 package servlet; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; i

  • JSP+Servlet+JavaBean实现登录网页实例详解

    本文实例讲述了JSP+Servlet+JavaBean实现登录网页的方法.分享给大家供大家参考.具体如下: 这里涉及到四个文件: 1. 登录页面:login.html 2. 登录成功欢迎页面:login_success.jsp 3. 登录失败页面:login_failure.jsp 4. Servlet处理文件:LoginServlet.java 其实还涉及到一个文件:web.xml,这个后面再说: 下面分别介绍这几个文件: 1. 登录页面:login.html <!-- 该Login页面是一个

  • Jsp+Servlet实现简单登录注册查询

    本文实例为大家分享了Jsp+Servlet实现简单登录注册查询的具体代码,供大家参考,具体内容如下 1.注册功能: 制作一个注册页面 用户输入: 用户名 密码 年龄 注册成功:-->跳转至登录页面进行登录 注册失败:-->文字或其他形式的提示皆可 2.简易查询: 制作一个查询页面 输入用户名 显示该用户的用户名.密码.年龄 演示 1.启动进入登陆页面 2.点击注册,进入注册页面,成功跳转到登录页面 失败则提示 回到登录页面,登录成功进入查询页面 登录失败显示提示信息 输入用户名->显示该

  • jsp+servlet实现简单登录页面功能(附demo)

    目录 实现功能: 开发环境: 预备知识: 1.登录界面login.jsp: 2.登录成功界面hello.jsp: 3.登录失败信息回显Login.jsp: 思路简述: 具体代码Code: 实现功能: 模拟简单登录功能,登录成功跳转新页面,登录失败在原登录界面提示登录失败信息 开发环境: eclipse Tomcat-8.0 预备知识: HTML标签,Servlet相关知识--请求的转发与重定向,jsp相关知识,EL表达式 思路实现:共2个jsp,一个servlet 1.登录界面login.jsp

  • 利用iOS绘制图片生成随机验证码示例代码

    先来看看效果图 实现方法 .h文件 @property (nonatomic, retain) NSArray *changeArray; @property (nonatomic, retain) NSMutableString *changeString; @property (nonatomic, retain) UILabel *codeLabel; -(void)changeCode; @end .m文件 @synthesize changeArray = _changeArray;

  • jsp引用servlet生成的验证码代码演示

    此演示代码主要包括以下三部分:1.checkCode.java:用于生成验证码2.checkCodeServler3.check.jsp 验证 下面是checkCode.java的内容: 复制代码 代码如下: //用于获取四位随机数     private char mapTable[] = {'0','1','2','3','4','5','6','7','8','9'}; //生成验证码,并返回随机生成的数字     public String getEnsure(int width, in

  • Java 生成随机验证码图片的示例

    1.情景展示 登录时,生成随机验证码图片,如何实现?  2.原因分析 后台生成验证码并生成图片返回至前台 3.解决方案 导包 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.Ser

  • Springboot+SpringSecurity实现图片验证码登录的示例

    这个问题,网上找了好多,结果代码都不全,找了好多,要不是就自动注入的类注入不了,编译报错,要不异常捕获不了浪费好多时间,就觉得,框架不熟就不能随便用,全是坑,气死我了,最后改了两天.终于弄好啦; 问题主要是: 返回的验证码不知道在SpringSecurity的什么地方和存在内存里的比较?我用的方法是前置一个过滤器,插入到表单验证之前. 比较之后应该怎么处理,:比较之后要抛出一个继承了AuthenticationException的异常 其次是捕获验证码错误异常的处理? 捕获到的异常交给自定义验证

  • vue生成随机验证码的示例代码

    本文介绍了vue生成随机验证码的示例代码,分享给大家,具体如下: 样式自调,最终效果如图: 实现效果: 点击右边input框会自动切换,如果输入的值与字不同,则清空换一串随机数 HTML <input type="text" placeholder="请输入验证码" class="yanzhengma_input" @blur="checkLpicma" v-model="picLyanzhengma"

  • jsp+Servlet编程实现验证码的方法

    本文实例讲述了jsp+Servlet编程实现验证码的方法.分享给大家供大家参考,具体如下: 这里用到两个类,一个用于验证码实现,一个为后台Servlet验证输入是否正确: CodeUtil.java--------验证码具体实现: package util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.

随机推荐