jsp来实现 验证码 登录案例 有图 有码
适用学习 对象 : java的 初学者 仅供参考-----------
开发 工具 idea ---- jdk8 ------ javaEE7 服务器tomcat 8.5
涉及javaWeb 基础 : session request response
有图 有码
分析 需求
:使用jsp来实现的 验证码 的 实现 : login.jsp ------ LoginServlet -----
login.jsp -----------
form table 表单 : tr —td
======& jsp的预览 要在 服务器 里 运行 :
--------- action 的请求的 是 :
servlet :---------- LoginSrevlet ---------
设置请求request的 编码 :
所有的 request 的参数:
获取验证码 ??
将 用户用户的 信息
5 判断 用户
信息的 封装到user 对象 里
session 判断 用户 的 获取 程序 生成验证码 : 与 用户输入 是否 保持一致 先判断 验证码 在 判断 用户 :减少 的 数据库 的访问次数的 压力if 一致 : if 用户名与密码 正确就 的登录成功 else 1: 给提示 2: 重定向到登录页面 ========= 重定向这里 转发到Session 里 也是可以 的----- 门都 没有进 就得重来 了-------else 不一致 : 1: 提示验证 错误的 信息 2: 转发 跳转到 登录页面 里 ========= 转发
错误信息 只在jsp 里共享-----v 一次request 里 无需其他人知道
只是 起码都登录 了 验证码的错误
- 涉及
一个转发与 重定向 是的 区别 :
关于request 与的 使用与否request 域里就会 用转发 其他的就是 重定向
使用 中 路径与否:
转发---相对路径 重定向---绝对路径
---- 关于域对象的 使用场景 :
用户名 与登录 会 经常的使用 存在 Session 里 ------具体实施 : 将原来 一边写好 验证码的 servlet、 粘贴过来 : 据需要在 的改进 : 使用个的是StringBuild ===== 生成 验证码 在Session域 里 域 ------ 操作方法 Attribute防止空指针异常 ---=========验证码忽略大小写 -------
注意 :
form 表单 提交到servlet 里
先判断 :验证码错误就少判断一次数据库
也许: 可能看不出来的------ null 值得判断 :sjp 里直接的就进行的 三元判断式******* 用一次就是失效 : 前面一点获取就 后面就会removeAttribute() 是的 使用
============ 编码的实施 ===============
创建前端页面 :
--- from 表单的额 action 到指定的 servlet 里 method= post ---table 表格 里tr -- td 里input Type与name 的属性的 定义--- 分别定义的的是 ; ---------用户名 type text ----密码 type password---- 验证码 type text----img ----td 的 colspan=2 跨2行---- 图片 : img 的id =“img” src =“指定的servlet”---- submit -----value:“登录” td 的 colspan=2 跨2行
使用js 来进行 切换 验证码 :
Windows 调用 onload 的回调函数 ‘function(){} 里’
通过id 获取标签体 :getElementById(“img”)onlick=function(){
this 调用当前的获取的标签体的img
调用src 指定的 方法 里 拼接time 值参数 的时间戳 ?time”+:
new Date().getTime()
----- 后端的继续编写 ---------------
创建servlet 页面 : 获取所有请求的参数 :request.getPrimaterMap()获取Map --- 操作数据库 来做 ======这不用数据库的操作 ---- 需要你 完善 数据库的分别 获取参数 的: request.getParameter(“ username ”) 。。password 。。checkCode。。---- 因为 是2次请求 : from表单里面 的 增加 验证码 的这次请求将生成的码值 储存 到 Session 里 ------- 然后 在 loginServlet 里 对比判断 即可
CheckCodeServlet 里 ==========
用StringBuild 的 append( )方法 来咋for 里 进行拼接 ------ 用 toString () 转为字符串 : // 存入session 里 : ----request.getSession().setAttribute("",""); 键 定义名称 ,值 就是---- StringBuild 的值
loginServlet 里 :========== 继续
获取Session的 域里 储存的 刚才的 生成 的 验证码 ;
--- request.getSession().getAttribuet("参数名称") ;
----- 返回一个 object对象 强转为 String:
忽略大小写的 的equalsIgnoreCaes(checkCode)
–### 重定向 范围 域 基于Session 域 :
setAttribute(“”username)--### 重定向 到 成功的页面 : 参数里 ----获取 虚拟路径 的方法 request.getContextPath()+
-----else :转发的域 基于request 域里 ----- setAttribute()设置键值对的信息 : 转发到登录 页面 :
转发:
request.getRequestDispatcher("").forward(); ---- 转发的不写 虚拟路径 :
----- – 写到这里 就要准备 success.jspde信息 : 是 :
<h1><%=request.getSession().getAttribute("user")%>欢迎你</h1> 这里的 user 就是 要储存的 信息
------ 然后 在login.jsp 里 :----------------------------
-----编写的的2个div 获取2次判断 为错误 的 Attribute 里的 信息
效果 : 对于的用户名与 密码名 的 验证码 输入的错误的提示 :
test 测试 : ===============================
要优化的 的是
------ 在login。jsp 里做到的
1:---- null 的显示的 优化 : 使用 三元表达式 在login 的 这 里 三元表达式的 格式 : ?: ----- 2元 以 ? 问号的左右为 前后条件 条件逻辑----- 的前置成立 就执行 ?问号后面的: 冒号 为else 的条件
2: 验证码的优化 --------
bug描述 : 浏览器里 当前已经登录 后 当我们 建点击浏览器里 后退的 的时候 依然还是可以登录的
3: 然后要设置的 是: 空指针异常的 判断 字符串!=null
=============
完整代码 呈现
前端的代码的 呈现 —============
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><script>window.onload=function () {document.getElementById("img").onclick=function () {this.src="/fhw/image01?time="+new Date().getTime();}}</script><style>div{color:firebrick;}</style>
</head>
<body><form action="/fhw/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="/fhw/image01"></td></tr><tr><td colspan="2"><input type="submit" value="登录"></td></tr></table></form>
<%-- 直接用CSS 获取标签 给红色是的指示 --%>
<%-- 的验证码错误的信息 --%>
<%-- 登录错误的信息--%>
验证码的servlet ===================
package com.fhw.web.yanzhengma;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;
import java.io.IOException;@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//response.setContentType("text/html;charset=utf-8");/* 已知在前端里 请求到 的 参数在request 域 里 在数据库 里直接的 所有的请求 当前不用数据库的 就直接 进行的 */String username = request.getParameter("username");String password = request.getParameter("password");String checkCode = request.getParameter("checkCode");// 去 CheckCode 使用 改进获取 生成的 验证码 数据存储 到Session里 ===// 然后在 当前 Session 里获取 到 验证码 进行判断HttpSession session = request.getSession();String checkCoder_session = (String) session.getAttribute("check_code");session.removeAttribute("check_code");// 每次都是一个 新的// session 与的里获取生成的 验证码 equals 客户端里请求request 域 比较if (checkCoder_session!=null && checkCoder_session.equalsIgnoreCase(checkCode)){// 空指针异常的 判断 && 忽略 大小写,的比较// 验证码正确// 判断用户的 和密码 是否一致 : else :重定向 到if ("fhw".equals(username)&&"123".equals(password)){//需要UserDao 到数据库 里// 登录成功 : 重定向 :session.setAttribute("user",username);response.sendRedirect(request.getContextPath()+"/successLogin.jsp");}else{//登录失败request.setAttribute("login_error","用户或密码名错误");//转发到页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}else{// --------登录页面request.setAttribute("cc_error","验证码错误");//转发到页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");this.doPost(request, response);}
}
登录的loginservlet ===========
package com.fhw.web.yanzhengma;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;
import java.io.IOException;@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//response.setContentType("text/html;charset=utf-8");/* 已知在前端里 请求到 的 参数在request 域 里 在数据库 里直接的 所有的请求 当前不用数据库的 就直接 进行的 */String username = request.getParameter("username");String password = request.getParameter("password");String checkCode = request.getParameter("checkCode");// 去 CheckCode 使用 改进获取 生成的 验证码 数据存储 到Session里 ===// 然后在 当前 Session 里获取 到 验证码 进行判断HttpSession session = request.getSession();String checkCoder_session = (String) session.getAttribute("check_code");session.removeAttribute("check_code");// 每次都是一个 新的// session 与的里获取生成的 验证码 equals 客户端里请求request 域 比较if (checkCoder_session!=null && checkCoder_session.equalsIgnoreCase(checkCode)){// 空指针异常的 判断 && 忽略 大小写,的比较// 验证码正确// 判断用户的 和密码 是否一致 : else :重定向 到if ("fhw".equals(username)&&"123".equals(password)){//需要UserDao 到数据库 里// 登录成功 : 重定向 :session.setAttribute("user",username);response.sendRedirect(request.getContextPath()+"/successLogin.jsp");}else{//登录失败request.setAttribute("login_error","用户或密码名错误");//转发到页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}else{// --------登录页面request.setAttribute("cc_error","验证码错误");//转发到页面request.getRequestDispatcher("/login.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");this.doPost(request, response);}
}
success 成功 前端页面 :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1><%=request.getSession().getAttribute("user")%>欢迎你</h1>
</body>
</html>
============== 总结的提问 : ??? 用Session ==============
生成验证码 放到Session 域 里 的 原因 :
每次请求是可以 共享 request 域 i是 : 客户端每次输入的 请求:--- 在request 里 用 parameter () ?用Attribute 也可以吗 ??????
请求request 参数里的额 验证码: 客户端 === 再 对比 ===
Session 域 服务器 里的servlet 类生成 的验证码:
========= 形成验证的
=============Attribute 与 parameter 的区别 =========
------ Attribute(服务端 属性 : 4个域 中 的信息)
------ parameter(客户端 参数:get方法:URL post 请求是request请求体)
来源:
parameter参数()-----客户端(浏览器)由用户提供的,若是GET方法是从URL中 提供的,若是POST方法是从请求体(request body)中提供的; Attribute-属性----服务器端 组件(JSP或者Servlet)利用requst.setAttribute() 设置的
操作:
parameter参数--------值---只能读取不能修改,get读取用request.getParameter();
Attribute属性------值---既可以读取亦可以修改,读取可以使用request.setAttribute(),设置可使用request.getAttribute()
数据:
parameter参数--------String类型看待,并且客户端的参数值只能是简单类型的值,不能是复杂类型,比如对象。 Attribute 属性--------值可以是任意一个Object类型。
共同点
二者的值都被封装在request对象中。
============
request 是在 客户端吗
:============
不是 : request 是 服务器 创建 实现 HttpServlet 的HttpservletRequest类 -- 肯定在 服务端 里用来 在servlet 页面 ==编写程序 获取客户端 请求 的参数 : ----- 而 response 同样也是这样的
客户端 里Cookie 的都是怎样的 :==========
有Cookie 信息 java web 里 在servlet 页面里 创建的 Cookie 操作Cookie getName setValie Cookie 键,值 setMaxAge()里通过毫秒值的 正数 : 负数 一次性(Cookie的默认, 零0 就是删除
Cookie只能 局限: 存储 字符串, 大小有限 ,信息不安全,
cookie 就是 客户端的 请求 ;-------人机交流的基本就是 字符串 来进行的
写到cookie 在 到Session 的 :
Session 就是 基于Cookie 来的id 来创建 在服务端 的
细致的: 初次请求有了Cookie信息 : 请求 到了 服务端里 服务器会根据 请求里的cookie id 创建Session 建立本次会话
第一次请求 与 响应就 建立了 本次回话 的初始化
【基于】cookie与Session组成立 web的 会话 :
本次 会话 灰有许多 的请求 与响应(交流) : 每次 有求必应
==
jsp来实现 验证码 登录案例 有图 有码相关推荐
- Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)
注册登录界面尤为常见,我的界面尤为难看,勉为其难的写吧,前端不熟就是这样... 这个案例运用到了: 1.Jsp动态页面--->动态页面 2.Servlet逻辑判断后台---->实现界面与数 ...
- Jsp—02—项目:登录案例
运用Jsp技术和Servlet技术,完成一个注册登录退出模块: 一.开发文档编写 项目名称: 后台管理系统 项目需求: 实现用户登录 实现用户退出 实现用户注册 功能分析: 用户登录: 根据用户名和密 ...
- Django+Jquery+Ajax+验证码登录案例
1,创建项目test04 2,创建应用app为booktest 3,注册应用booktest 作用让创建的应用运行起来 4,在项目根目录下创建模板templates目录 作用就是存放html文件 在项 ...
- Spring Cloud OAuth2 扩展登录方式:帐户密码登录、 手机验证码登录、 二维码扫码登录
本文扩展了spring security 的登录方式,增长手机验证码登录.二维码登录. 主要实现方式为使用自定义filter. AuthenticationProvider. AbstractAuth ...
- 【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))
文章目录 1.cookie:再次时请求头携带cookie到服务端 2.登陆案例_记住我:js访问浏览器数据用document 3.session:根据sessionid,服务器才能找到session( ...
- 使用Jsp+Servlet的wlop官网(验证码登录+session自动登陆)
这个页面是我学习前端的时候自己使用JQuery写的轮播图,登录功能的后端判断未实现,现将登陆功能补充完整. 需求: 1,验证码登录# 2,账号密码登录# 3,登录失败在登录部分提示相应的信息# 3,登 ...
- Web登录小案例(含验证码登录)
文件结构 druidpool.properties driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/m ...
- 2.vue3医疗在线问诊项目 - _登录模块 ==> 代码片段、css变量主题定制、cp-nav-bar组件封装、svg打包精灵图插件、cp-icon组件封装、表单校验、密码登录、短信验证码登录及两者
2.医疗在线问诊项目 - _登录模块 ==> 代码片段.css变量主题定制.cp-nav-bar组件封装.svg打包精灵图插件.cp-icon组件封装.表单校验.密码登录.短信验证码登录及两者的 ...
- 测试案例:登录--手机号验证码登录
手机号验证码登录测试点 1.输入手机号码,待收到手机验证码后,输入验证码 ,成功 2.输入手机号码,待收到手机验证码后,输入错误的验证码,提示:失败 3.输入手机号码,待收到手机验证码后,更改原来手机 ...
- Java实现手机验证码登录和SpringSecurity权限控制
手机验证码登录和SpringSecurity权限控制 手机快速登录功能,就是通过短信验证码的方式进行登录.这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就 ...
最新文章
- Python大法之抛 异常
- linux C非阻塞延时,linux 非阻塞式socket编程求助。。
- python高斯函数表达式_Python实现高斯函数的三维显示方法
- js+正文规则 高亮搜索关键字(二)
- SpringMVC Mybatis Shiro RestTemplate的实现客户端无状态验证及访问控制【转】
- html文件很大,webpack打包之后的文件过大如何解决
- 计算机在线应用分为,在线计算器的分类和使用方法
- java项目 服务器部署Word转成PDF乱码
- Android 旋转木马轮播,ReactJs写旋转木马轮播图
- 出场顺序很重要下一句_一首年少有为告诉你:人生的出场顺序真的很重要
- [poj3130][半平面交]How I Mathematician Wonder What You Are!
- 二级c语言编译完程序如何运行,计算机二级C语言辅导:C++环境下编译和运行c语言...
- GO语言入门教程(二)
- 如何一步步实现异步上传图片并预览图片(异步加载图片)
- JavaScript设计模式之观察者模式(学习笔记)
- Android 模拟点击、滑动、返回
- java项目宕机出现原因,java服务宕机原因查询
- 刷脸支付广泛应用于无人领域
- 基于Java语言的Appium的使用讲义
- python女性素描_不给你的女朋友来张素描吗?使用python将图片转素描