模拟用户登录,内含验证码验证和request等操作
模拟用户登录,内含验证码验证和jsp等操作
1.案例需求:
1. 访问带有验证码的登录页面login.jsp
2. 用户输入用户名,密码以及验证码。
* 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
* 如果验证码输入有误,跳转登录页面,提示:验证码错误
* 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
2.案例分析:

3.代码实现
1. 登录界面的设置:
设计思想:
1. 先写出页面的基本框架:一个基本的表单,其中采用el表达式来表达虚拟目录,动态生成虚拟目录。
<form action="${pageContext.request.contextPath}/loginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>验证码</td>
<td><input type="text" name="checkCode"></td>
</tr>
<tr>
<td colspan="2"><img id="img" src="/day16/checkCodeServlet"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
2. 用于显示验证码正确和错误之后的定向问题:主要codes:
采用el表达式是用来显示的,如果没有返回值或者返回值为空的话,如果采用request.getAttribute()的方法会产生null,但是如果采用el表达式,直接返回空字符串,不用返回null,简化了代码。
<div>
${requestScope.cc_error}
/*这里也可以采用三目操作符来表示:
<%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%> */
</div>
<div>
${requestScope.login_error}
</div>
2. 获取验证码的设置:
使用servlet来获取验证码,具体过程如下:
1. 先创建一个对象,用来画图:
int width=100;
int height=50;
BufferedImage image=new BufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
解释:第1,2行代码不用解释。使用BufferdImage对象来创造一个图像的对象,刚开始显示一个小方框,长100px,宽50px,采用RGB来涂色
2. 进一步美化照片,先填充色来填充背景
Graphics graphics = image.getGraphics();
graphics.setColor(Color.PINK);//
graphics.fillRect(0,0,width,height);
3. 到这一步,会发现下和右没有图上颜色,再进一步梅花:
graphics.setColor(Color.blue);
graphics.drawRect(0,0,width-1,height-1);
4. 定义显示在图片上的字符和数字的库---》由大写A~Z小写的a~z和0~9组成:
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
5. 创建随机类来生成随机的角标
Random ran=new Random();
StringBuilder sb=new StringBuilder();
for (int i = 1; i <=4 ; i++) {
int index = ran.nextInt(str.length());
//获取字符
char ch = str.charAt(index);
sb.append(ch);
//2.3写验证码
graphics.drawString(ch+"",width/5*i,height/2);
}
6. 再将生成的动态验证码字符串交个session来保存,共客户端访问数据
String checkCode_session = sb.toString();
//存入session
request.getSession().setAttribute("checkCode_session",checkCode_session);
7. 生产干扰线
graphics.setColor(Color.GREEN);
//随机生成坐标
for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
graphics.drawLine(x1,x2,y1,y2);
}
8. 将图片输出到页面展示
ImageIO.write(image,"jpg",response.getOutputStream());
至此,验证码的servlet生成;
3. 登录servlet的设置:
TIP:这里采用写死的方法,简化了开发,读者可以采用sql的数据库连接上去动态生成用户名和密码。
1. 首先设置代码的编码格式为utf-8;
**request.setCharacterEncoding("utf-8");**
注意是request,请求用来设置编码。response一般是用来服务器的发送信息(用于给客户端发送回应)
2.采用request请求来获取username,password和验证码的元素:
String username = request.getParameter("username");
String password = request.getParameter("password");
String checkCode = request.getParameter("checkCode");
3. 获取session进行验证:
HttpSession session = request.getSession();
String checkCode_session = (String) session.getAttribute("checkCode_session");
//删除验证码session中存储的
session.removeAttribute("checkCode_session");
4. 判断验证码,用户名和密码是否都正确,首先需要先判断验证码是否正确,这样可以避免数据库的消耗。(如果先验证用户名和密码的话,需要去数据库查询,查询完了如果验证码不对,也无法登录,所以需要先验证验证码)
判断获取的字符串是否为空然后和在login.jsp页面中输入的字符串去掉大小写进行比较
如图在login.jsp中定义的:

这是在CheckCodeServlet中保存在session中的验证码字符串

String checkCode = request.getParameter("checkCode");
表示把数据从请求中去了出来并且赋给了checkCode。

进行比较
if(checkCode_session!=null&&checkCode_session.equalsIgnoreCase(checkCode)){
//忽略大小写比较字符串,判断用户名和密码是否一致
//正确
if("zhangsan".equals(username)&&"123".equals(password)){
//登录成功
//存储信息,用户信息
session.setAttribute("user",username);
//重定向到success.jsp
response.sendRedirect(request.getContextPath()+"/success.jsp");
}else{
//不一致,存储提示信息到request
request.setAttribute("login_error","用户名或者密码错误");
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}else{
//不一致,存储提示信息到request
request.setAttribute("cc_error","验证码错误");
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
3.界面如下:

4.测试用例:略
codes from GitHub-----》》》》》登录简单案例-验证码
模拟用户登录,内含验证码验证和request等操作的更多相关文章
- jdbc封装模拟用户登录
dao层 接口 package com.qu.dao; public interface ILoginDAO { /** * 模拟用户登录 * 验证用户名 密码是否正确 * select * from ...
- scrapy模拟用户登录
scrapy框架编写模拟用户登录的三种方式: 方式一:携带cookie登录,携带cookie一般请求的url为登录后的页面,获取cookie信息应在登录后的页面获取,cookie参数应转成字典形式 # ...
- python小练习--模拟用户登录,(3次重试机会,登录成功展示登录账号密码)
知识点使用:1.格式化输出的两种方法---% .formate 2.while循环的使用,及跳出循环的两种方法---break(跳出循环体).continue(结束本次循环,继续下次循环) 3.if条 ...
- python用scrapy模拟用户登录
scrapy模拟登录 关注公众号"轻松学编程"了解更多. 注意:模拟登陆时,必须保证settings.py里的COOKIES_ENABLED(Cookies中间件) 处于开启状态 ...
- 运用String类实现一个模拟用户登录程序
package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...
- java.net.URL 模拟用户登录网页并维持session
java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...
- python 初学习 模拟用户登录
#!/usr/bin/env python#coding:utf-8''' 2017年8月19日 模拟用户登录,userfile 文件保存字典 用户名,和密码 sorryname 文件保存字典 登录过 ...
- python3.0 模拟用户登录,三次错误锁定
# -*- coding:utf-8 -*- #需求模拟用户登录,超过三次错误锁定不允许登陆 count = 0 #realname passwd Real_Username = &quo ...
- xpath技术解析xml以及案例模拟用户登录效果
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! xpath就在此情况下产生了--主要是用于快速获取所需的[节点对象]. 在dom4j中如何使用xPath技术 1) ...
随机推荐
- winform picturebox设置布局样式
这里分背景图和直接显示的图片的布局 背景图的布局为BackgroundImageLayout设置为strecth即为自动拉伸 图片的布局为SizeMode 设置为StretchImage即自动拉伸
- 使用Disk2VHD进行P2V转换需要知道的一些事
据不可靠统计,有「无数」工具可以实现物理机到虚拟机的(P2V)转换,虽然有很多此类工具都被开发商帖上了高价标签,但至少来自微软 Sysinternals 工具集中的 Disk2VHD 还是可以免费使用 ...
- 使用百度网盘+Git,把版本控制托管到云端,附精彩评论
http://www.cnblogs.com/vajoy/p/3929675.html 我试过多个这种双向同步的网盘,在网络状况不好.系统卡顿以及某些程序BUG的情况下,同步会有错乱现象,尤其是多个电 ...
- C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面 ...
- MySQL5.7.19版本压缩包安装方式的一些坑
ySQL社区版下载地址:https://dev.mysql.com/downloads/mysql/,在这里也可以选择之前的版本下载. MySQL进入5.7.7版本以后,压缩包安装需要注意一些地方: ...
- 关于这次KPL春季决赛的感悟
QG 4:0 横扫AG超玩会,关于这一点想写一些自己的感悟,AG超玩会一直都是 4:0 横扫别人,这次在冠军赛被别人横扫,一点喘息的机会都没有. 1.QGhappy 跟本没把AG超玩会放在眼里,很 ...
- [2017.02.15] 《C++Primer5》 复习笔记
编程语言主要是提供一个框架,用计算机能够处理的方式来表达问题的解决方法. 自定义数据类型class的基本思想是数据抽象dataabstraction和封装encapsulation.数据抽象是一种依赖 ...
- uni-app $refs的基本用法
$refs的基本用法 一个对象(Object),持有注册过 ref 特性 的所有 DOM 元素和组件实例. <template> <view class="containe ...
- 基于python实现的三方组件----Celery
一.基于python实现的三方组件----Celery 1.作用 用于异步周期任务的处理 2.Celery的组成 (1)任务 app (2)记录任务的缓存(通常用redis或rabbitMQ) 任务记 ...
- vi,etc目录文件,环境变量,别名功能
1 vi命令使用技巧补充 1.1 如何快速编辑文本内容 yy ---快速复制文件内容 3yy ---复制三行内容 p ---快速粘贴文本内容 3p ---粘贴三行内容 dd ---快速删除文件内容 ...