今天来模拟一下验证码,我们需要三个文件,两个Servlet,一个jsp

  直接贴代码吧

  

RandomCodeServlet:主要负责生产验证码
package com.vae.RandomCode;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import java.util.UUID;
@WebServlet("/randomcode")
public class RandomCodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//生成随机数
String randomCode= UUID.randomUUID().toString().substring(0,5);
//把随机数放进session,作为对比的凭证
req.getSession().setAttribute("RANDOM_IN_SESSION",randomCode); //创建图片对象
int width=80;
int height=40;
int imageType=BufferedImage.TYPE_INT_RGB;
BufferedImage image=new BufferedImage(width,height,imageType); //画板
Graphics g=image.getGraphics();
g.setColor(Color.YELLOW);
//绘制一个实心的矩形
g.fillRect(1,1,width-2,height-2); //把随机数画进图片中
g.setColor(Color.BLACK);
Font font=new Font("宋体",Font.BOLD+Font.ITALIC,20);
g.setFont(font);
g.drawString(randomCode,10,20);
//干扰线,这个的目的就是为了防止黑客去用软件识别验证码
g.setColor(Color.GRAY);
Random r=new Random();
for (int i = 0; i < 100; i++) {
g.fillRect(r.nextInt(width),r.nextInt(height),2,2);
} //关闭
g.dispose();
//把图片对象以流的方式保存出去
ImageIO.write(image,"jpg",resp.getOutputStream()); }
}
LoginServlet:主要负责接收JSP传来的参数,验证码和用户输入的验证码进行一个对比
package com.vae.RandomCode;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/randomlogin")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接收参数
String name=req.getParameter("username");
String email=req.getParameter("email");
String randomcode=req.getParameter("randomcode");
//2.获取session中的随机数,判断验证码是否正确
String randomcodesession=req.getSession().getAttribute("RANDOM_IN_SESSION").toString();
if (!randomcode.equalsIgnoreCase(randomcodesession)) {
req.setAttribute("errogMsg","验证码不对,请重新输入");
req.getRequestDispatcher("/randomcode/randomlogin.jsp").forward(req,resp);
return;
}
System.out.println("验证码正确");
req.getSession().removeAttribute("RANDOM_IN_SESSION"); //删除缓存 } }

最后一个是我们的JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>验证码登录</title>
</head>
<body>
<h3>用户登录</h3>
${errogMsg}
<form action="/randomlogin" method="post">
账号:<input type="text" name="username" id="username" required/><br>
邮箱:<input type="email" name="email" id="email" required><br>
验证码:<input type="text" name="randomcode" id="randomcode" size="5" maxlength="5">
<img src="/randomcode" id="randomcodeImg" title="看不清,换一张"
style="cursor: pointer;" onclick="change()" > <input type="submit" value="注册">
</form> <script type="text/javascript">
function change() {
//刷新验证码的图片
document.getElementById("randomcodeImg").src="/randomcode?"+new Date().getTime();
}
</script> </body>
</html>

  看看效果

就这么简单,但是有一个问题啊,就是表单重复提交了怎么办?我们不能表单重复提交,这个问题下篇文章专门来介绍一下

Java Web之验证码的更多相关文章

  1. Java Web模块——验证码模块

    一.什么是验证码及它的作用 验 证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码. ...

  2. java web 实现验证码

    验证码的作用:通常的登录或者注册系统时,都会要求用户输入验证码,以此区别用户行为和计算机程序行为,目的是有人防止恶意注册.暴力破解密码等. 实现验证码的思路:用 server 实现随机生成数字和字母组 ...

  3. java web中验证码生成的demo

    首先创建一个CaptailCode类 package com.xiaoqiang.code; import java.awt.*; import java.awt.font.FontRenderCon ...

  4. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  5. java web实现 忘记密码(找回密码)功能及代码

    java web实现 忘记密码(找回密码)功能及代码 (一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮, ...

  6. Java Web整合开发(3) -- Servlet

    Servlert基本程序架构: (FirstServlet.java + web.xml) FirstServlet.java package com.helloben.servlet; import ...

  7. Java web项目综合练习(Estore)

    Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...

  8. java web 整合开发王者归来学习总结

    第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...

  9. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

随机推荐

  1. 解决Error:com.intellij.util.indexing.StorageException

    删除 C:\Users\Nihaorz\.IntelliJIdea2017.1\system\compile-server 目录下的所有内容即可

  2. Mysql partition by

    一,看原表 select * from `user`; 二,查询同组年级最大的 select username ,SUBSTRING_INDEX( GROUP_CONCAT(age order by ...

  3. 慢腾腾的Quartus prime16.0加快编译速度

    前言 当一个工程反复修改的时候,可能有时候源代码没有更改,为了加快编译速度可以配置quartus一些选项.当然,初次编译的速度是否会提升,未验证.更高级的设计分区以及逻辑锁区提升速度,以后阐述. 流程 ...

  4. VueCLI3如何更改安装时的包管理器为yarn或npm

    在执行 vue create project 后如果显示如下 npm run serve 则表示你使用的是npm创建的项目. 如果显示如下 yarn serve 则表示此项目为yarn创建. 那如何切 ...

  5. 【hihocoder 1424】 Asa's Chess Problem(有源汇上下界网络流)

    UVALive-7670 ICPC北京2016-C题 hihocoder 1424 题意 有个 \(N\times N\) 的棋盘,告诉你每个格子黑色(1)或白色(0),以及每对能相互交换的同行或同列 ...

  6. BZOJ2961 共点圆[CDQ分治]

    题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...

  7. python3基础概念

    数: str:使用单引号或双引号表达,不可变的,一旦创建不可更改,可以使变量赋予不同的字符串,但字符串本身是没有更改的: list:有序的集合,可变的基础数据类型: clear(),copy(),ap ...

  8. nc 使用实例

    nc.exe -h即可看到各参数的使用方法.基本格式:nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostna ...

  9. bzoj2554: Color

    Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一 ...

  10. C# DateTimePicker控件获取他的年,月,日,时,分,秒

    CustomFormat属性设置为: yyyy-MM-dd HH:mm:ss 记住还要修改一个属性值,DateFormat属性 可选项改为Custom,默认是Long