登录验证码编写(jsp+servlet+dao)
一.什么是验证码及它的作用
验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录。
二.图文验证码的原理
在 servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码。 为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器端将用户提交的验证码和Session保存的验证码进行比 较。
三.验证码所需的技术
i.因为验证码中的文字,数字,应为都是可变的,故要用到随机生成数技术。
ii.如果验证码中包含汉字,则要用到汉字生成技术.
iii.可以使用Ajax技术实现局部刷新
iv.可以使用图片的缩放和旋转技术,
vi.随机绘制干扰线(可以是折现,直线等)
vii.如果考虑到验证码的安全性,可以使用MD5加密.
操作代码有流程
1.代码先新建UserServlet.java也就是servlet文件
package controller; import java.awt.Color;
import java.awt.Font;
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 UseryanServlet extends HttpServlet {
//定义一个方法可以获取到a-z或A-Z或0-9的ASCII码值的随机数
public int ro() {
int b = 0;
Random r = new Random();
while (true) {
int a = (int) (r.nextDouble() * 123);
if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z')
|| (a > 47 && a < 58)) {
b = a;
break;
}
}
return b;
} public UseryanServlet() {
super();
} /**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义大小的值
int width = 120, height = 25;
// 在内存产生一个图片
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
//得到画笔
Graphics g = bimage.getGraphics();
//一个矩形
g.setColor(Color.blue);
g.drawRect(0, 0, width, height);
//画填充背景
g.setColor(Color.red);
g.drawRect(1, 1, width - 2, height - 2);
//画干扰线条 20条
g.setColor(Color.gray);
Random r = new Random();
for (int i = 1; i < 20; i++) {
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width),
r.nextInt(height));
}
// 画随机数字
g.setColor(Color.yellow);
g.setFont(new Font("黑体", Font.BOLD | Font.ITALIC, 20)); String code = "";//生成的随机数返回到code
// 生产4个随机数字
for (int i = 0; i < 4; i++) {
char a = (char)ro();
code += a+"";
g.drawString(a + "", 20 * i, 20);
}
request.getSession().setAttribute("captcha", code);//获取验证码到UserLoginServlet进行验证
// 输出图像到页面
response.setContentType("image/jpeg");
ImageIO.write(bimage, "jpg", response.getOutputStream());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response); } public void init() throws ServletException {
super.init();
}
}
2.在登录的UserLoginServlet对输入的验证码进行判断
String captcha = (String) request.getSession().getAttribute("captcha");
if(!captcha.equalsIgnoreCase(newCaptcha)) {
request.setAttribute("errorMsg", "验证码输入错误");
request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
return;
}
3..在web.xml文件找到对应的UseryanServlet方法
<servlet-mapping>
<servlet-name>UseryanServlet</servlet-name>
<url-pattern>/UseryanServlet</url-pattern>
</servlet-mapping>
4.在登录首页进行设置
<input name="captcha" type="text" placeholder="验证码"><img src="UseryanServlet"></td>
name="captcha"输入到UserLoginServlet对验证码进行判断后的String captcha = (String) request.getSession().getAttribute("captcha");
后台的验证码通过src="UseryanServlet"获取 在web.xml文件找到对应的UseryanServlet方法,
判断正确才允许登录。
登录验证码编写(jsp+servlet+dao)的更多相关文章
- JSP+Servlet+DAO+Javabean模式小记-20171029
1.Servlet的doPost方法使用request.getParameter()接收网页传送的form表单数据时,必须使用name属性,而不能使用id. 2.这是最简单的MVC模式,其中M(mod ...
- 我能不能理解成 ssh中service就相当于与jsp+servlet+dao中的servlet???
转文 首先解释面上意思,service是业务层,dao是数据访问层.(Data Access Objects) 数据访问对象 1.Dao其实一般没有这个类,这一般是指java中MVC架构中的model ...
- (详细)Eclips+jsp+servlet+mysql+登录实例+源代码
欢迎任何形式的转载,但请务必注明出处. 该教程较全,从软件的安装以及相关的环境配置我都放置了相关教程的链接,读者可直接点击进入.自己写电商网站作业时查找了很多资料,但都不是很全,所以趁着寒假写了这份教 ...
- jsp+servlet+mysql 实现简单的银行登录转账功能
jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...
- JSP+servlet简单登录实例
一个简单的jsp+servlet实例,实现简单的登录 转载▼ http://blog.sina.com.cn/s/blog_5c5bc9070100z7wb.html 开发环境myeclips ...
- jsp&servlet初体验——用户登录功能实现
数据库准备-创建db_login数据库 t_user表 1.创建web工程 2.创建用户model user.java package com.gxy.model; public class U ...
- Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题
日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...
- jsp+servlet登录框架模板
一.建立一个名叫jsp_servlet的工程 二.建立一个AcountBean类和CheckAccount类 1.AcountBean类包含登录名(username)和登录密码(password) p ...
- Java Web项目案例之---登录注册和增删改查(jsp+servlet)
登录注册和增删改查(jsp+servlet) (一)功能介绍 1.用户输入正确的密码进行登录 2.新用户可以进行注册 3.登录后显示学生的信息表 4.可以添加学生 5.可以修改学生已有信息 6.可以删 ...
随机推荐
- C#-WinForm-弹窗提示框-如何知道用户点击的是哪个按钮?
MessageBox.Show() 有21个重载 常用的弹窗提示框 1.一个参数,弹窗只有一个选项 2.三个参数,第一个参数是设置弹窗消息框中的文字内容:第二个参数是设置弹窗标题栏中显示的文本:第三个 ...
- C#中的集合有几种?
C#中的集合有几种? Array ArrayList List<T> Stack<T> Queue<T> Dictionary<K,V> HashTab ...
- OO(Object Oriented)思想和PO(Procedure-Oriented)思想
对象将需求用类一个个隔开,就象用储物箱把东西一个个封装起来一样,需求变了,分几种情况,最严重的是大变,那么每个储物箱都要打开改,这种方法就不见得有好处:但是这种情况发生概率比较小,大部分需求变化都是局 ...
- c# 百度api语音识别
public static string getStrAccess(string para_API_key, string para_API_secret_key) { //方法参数说明: //par ...
- Xcode 修改工程名以及注意事项
1.先把整个工程文件夹名改为新的工程名. 2.打开工程,单击,输入新的工程名,会出现,点击确定. 3.回到工程界面,在中选择 Manage Schemes,然后再弹出的对话框,把工程名改为新的名字. ...
- shell 常用小命令总结
1. 重命名 1) 较简单的处理命令:mv 原文件名 新文件名 如:mv myFile newName ### 将MyFile重命名为newN ...
- Stream篇
本文转自: http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html 什么是Stream? 什么是字节序列? Stream的构 ...
- POJ 1273 Drainage Ditches
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 67387 Accepted: 2603 ...
- Node.js使用Mongoose包操作MongoDB数据库
1. 安装Mongoose npm install mongoose 2. 使用 2.1 创建连接 var mongoose = require('mongoose'); mongoose.conne ...
- Spring MVC exception - Invoking request method resulted in exception : public static native long java.lang.System.currentTimeMillis()
最近在线上系统发现下面的异常信息: 2014-10-11 11:14:09 ERROR [org.springframework.web.servlet.mvc.annotation.Annotati ...