Web用户登录---验证码的设计与实现
在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式。
验证码生成步骤:
1、获得随机生成的颜色,画出随机线条生成背景底。
2、String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";随机选取4个字符构成验证码。随机字符集合中不包括0和o,O,1和l,因为这些不易区分。
3、选取4个字符进行旋转、伸缩后再单个单个绘制;生成4字符验证码。
示例源码:login.jsp---登录表单。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<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 type="text/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:80px;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>
LoginServlet---处理登录请求。
import java.io.IOException;
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 javax.servlet.http.HttpSession; /**
*处理登录请求
*/
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8"); String code = request.getParameter("checkCode");
HttpSession session = request.getSession();
if (!code.equalsIgnoreCase((String) session.getAttribute("randCheckCode"))) {
request.setAttribute("errormsg", "验证码不正确");
response.getWriter().println("<script> type='text/javascript'>window.alert('*验证码错误!');window.location.href='login.jsp'</script>");
}
response.getWriter().println("<script> type='text/javascript'>window.alert('*用户登录成功!');window.location.href='login.jsp'</script>");
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
PictureCheckCode---验证码生成与更新。
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.util.Random; 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 javax.servlet.http.HttpSession; /**
*验证码生成与更新
*/
@WebServlet("/pictureCheckCode")
public class PictureCheckCode extends HttpServlet { private static final long serialVersionUID = 1L; /* 该方法主要作用是获得随机生成的颜色 */
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);
} private Random r = new Random(); // 随机字符集合中不包括0和o,O,1和l,因为这些不易区分
private String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";
private char randomChar() {
int index = r.nextInt(codes.length());
return codes.charAt(index);
} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8"); // 设置不缓存图片
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); // 绘制直线
} //用来保存验证码字符串文本内容
StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; ++i) {// 随机生成4个字符
String sTemp = String.valueOf(randomChar());
sb.append(sTemp); 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(sTemp, 15 * i + 18, 14);
} HttpSession session = request.getSession(true);
session.setAttribute("randCheckCode", sb.toString());
System.out.println("sRand="+sb.toString());
g.dispose(); // 释放g所占用的系统资源
ImageIO.write(image, "JPEG", response.getOutputStream()); // 输出图片
} }
测试:

原文:https://blog.csdn.net/ljheee/article/details/72799746
Web用户登录---验证码的设计与实现的更多相关文章
- Java SSH框架系列:用户登录模块的设计与实现思路
1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...
- java web用户登录界面
做这次实验,主要用到了mysql java web 的 内容 实验代码: IUserDao.java package com.jaovo.msg.dao; import java.util.List ...
- Java Web实现登录验证码(Servlet+jsp)
1.生成验证码图片(Servlet) import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import j ...
- winform基本控件的使用2(用户登录界面的设计)
首先还是通过例子来讲解,这次的实验主要是使用messageBox的使用方法,关于messageBox的使用方法在我的博客里面有相关的转载,请自己查看,下面说一下实验要求. 功能要求:模拟一个用户登陆的 ...
- Java Web制作登录 验证码
具体操作如下: 新建一个servlet,代码如下:标记一个WebServlet, @WebServlet(urlPatterns = {"/checkCode"}) //验证码Se ...
- PHP用户登录与注册页面
PHP用户登录模块实现 项目包含的功能脚本: login.php//登录 reg.php//注册用户 user_add.php//注册校验脚本 user_login_check.php//登录校验脚本 ...
- Cookie中用户登录信息登录验证
public class FormServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...
- 实现Web上的用户登录功能
关于如何实现web上的自动登录功能 文章来源http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能 ...
- 你会做Web上的用户登录功能吗?
Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...
随机推荐
- javascript连连看
经测试,IE,Firefox,Chrome,Opera可用. 连接线最多2个拐角.秘籍为:开始后连续输入zycjwdss 还剩0对 对数字 高度: 宽度: // 0)return 1;//IE i ...
- 多任务fork、multiprocessing、进程池、进程间通信-Queue
并发:一个处理器同时处理多个任务. 并行:多个处理器或者是多核的处理器同时处理多个不同的任务. fork创建子进程 import os import time #fork出一个子进程,子进程也从这一行 ...
- 7.6 chcount.c -- 使用逻辑与运算符
include <stdio.h> #define PERIOD '.' int main(void) { char ch; int charcount = 0; while ((ch = ...
- web页面性能
一.资源压缩合并,减少HTTP请求 二.非核心代码异步加载 1.异步加载的方式 动态脚本加载 defer async 2.异步加载的区别 (1)defer是在HTML解析完之后才会执行,如果是多个,按 ...
- Shiro与基本web环境整合登陆验证实例
1. 用maven导入Shiro依赖包 <dependency> <groupId>org.apache.shiro</groupId> <artifactI ...
- hive 表新增字段后更新分区无法显示数据
解决方案: 1.删除分区后重新跑数据 alter table drop partition(分区字段=“”): 2.新增字段运行程序后其实数据已经有了,只是查询hive的时候无法显示出来, 这个时候只 ...
- [java,2019-01-25] 图片和二进制互转
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...
- mongo 高级操作
聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...
- Linux查看密码
Linux的账号是记录在/etc/passwd文件里面,密码则是保存在/etc/shadow 1.在如下图输入head -3 /etc/passwd可以看查前三密码,回车这后就可以看到前三行的密码保存 ...
- Lua学习之加载其他lua文件
Lua 中提供了模块的概念,模块类似一个封装库或者 C++ 中的一个类,可以将公用的部分提到一个文件中,以 API 的形式供其他 lua 文件调用. Lua 中的模块其实就是包含变量.函数等已知元素组 ...