Java Web之验证码
今天来模拟一下验证码,我们需要三个文件,两个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之验证码的更多相关文章
- Java Web模块——验证码模块
一.什么是验证码及它的作用 验 证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码. ...
- java web 实现验证码
验证码的作用:通常的登录或者注册系统时,都会要求用户输入验证码,以此区别用户行为和计算机程序行为,目的是有人防止恶意注册.暴力破解密码等. 实现验证码的思路:用 server 实现随机生成数字和字母组 ...
- java web中验证码生成的demo
首先创建一个CaptailCode类 package com.xiaoqiang.code; import java.awt.*; import java.awt.font.FontRenderCon ...
- Java web 学习之旅
java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...
- java web实现 忘记密码(找回密码)功能及代码
java web实现 忘记密码(找回密码)功能及代码 (一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮, ...
- Java Web整合开发(3) -- Servlet
Servlert基本程序架构: (FirstServlet.java + web.xml) FirstServlet.java package com.helloben.servlet; import ...
- Java web项目综合练习(Estore)
Java web项目综合练习(Estore) 复习day18: ajax代码的书写步骤 2)json格式文本,转js对象的方法是那个 项目开发流程介绍 这里学习的JavaWEB项目实战,主要是把前面学 ...
- java web 整合开发王者归来学习总结
第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
随机推荐
- BZOJ2463[中山市选2009]谁能赢呢?——博弈论
题目描述 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问 ...
- 微信小程序——代码片段汇集
导航栏 作者:beatzcs 链接:https://www.jianshu.com/p/c681007a6287 这个导航虽然已经很完善了,不过还是要根据自己的来进行修改的 tabs.wx ...
- HDU1251 字典树板子题
题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...
- UOJ276 [清华集训2016] 汽水 【二分答案】【点分治】【树状数组】
题目分析: 这种乱七八糟的题目一看就是点分治,答案有单调性,所以还可以二分答案. 我们每次二分的时候考虑答案会不会大于等于某个值,注意到系数$k$是无意义的,因为我们可以通过转化使得$k=0$. 合并 ...
- Going Home POJ - 2195(费用流)
就是一个简单题 四个月前a的一道题,今天又看到了,再a一遍吧. 好吧 我想多了 用了bfs求最短路 其实不用的 因为没有障碍物 #include <iostream> #include ...
- C/C++ 程序库
C/C++ 程序库 // --------------------------------------------- 来几个不常见但是很变态的库吧: bundle: 把几乎所有常见的压缩库封装成了一个 ...
- 【正睿oi省选十连测】第一场
四小时写了两个暴力??自闭 [原来这就是神仙们的分量Orz rank 56/75 可以说是无比垃圾了 下周目标:进步十名?[大雾 T1 题意:有n个点的图 点有点权Ai 也有点权Bi = A_1 + ...
- 自学华为IoT物联网_03 公共事业物联网常见问题及解决方案
点击返回自学华为IoT物流网 自学华为IoT物联网_03 公共事业物联网常见问题及解决方案 本文从以下六项公共事业,看看物联网的解决方案: 停车问题 路灯管理问题 消防栓管理问题 井盖管理问题 水表管 ...
- python3 集合set
set是一种集合的数据类型,使用{}表示 集合中元素是无序的,并且不可重复,集合最重要的作用就是可以去重 set是不可哈希的,set中的元素必须是可哈希的 可以切片,可以迭代 交集.并集.差集.对称差 ...
- html块、含样式的标签
html块 1.div标签 块元素,表示一块内容,没有具体的语义. 2.span标签 行内元素,表示一行中的一小段内容,没有具体的语义. 含样式和语义的标签 1.em标签 行内元素,表示语气中的强调词 ...