专栏首页程序猿的大杂烩编写一个简单登录验证需要记录日志,Servlet中的Cookie

编写一个简单登录验证需要记录日志,Servlet中的Cookie

登录验证并记录日志

之前介绍了如何使用Server、mysql、tomcat等知识点编写了一个简单的登录验证。但是现在有了一个新的需求,我想要在登录成功的时候往数据库记录一条日志,登录失败的时候也要记录一下。这个日志要记录用户名、用户的IP地址、登录的时间、还有成功或失败的状态标识。

所以现在需要增加一个表格,用于存储日志信息,如图:

因为大部分思路和之前的写登录验证差不多,只是多了个记录日志,所以我这里就不赘述实现的思路了,直接上代码。

1. 首先需要使用html编写出页面,代码示例:

CSS代码:

2. 同样的需要编写一个管理数据库池的类:

3. 接收并处理响应用户的请求的Servlet类:

4. 最后是完成与数据库交互工作的类:

完成效果:

登录成功,跳转到目标页面:

登录失败:

Cookie

在介绍cookie之前先谈一谈http协议,http协议是一种无状态的协议,用户的访问请求一去一回就结束了,用户的第二次请求就是一个全新的请求,并不会记录用户的上一次是否有进行过请求。服务端会认为每一次的请求都是与上一次请求无关的,即便ip地址和访问目标、请求方式一致也是如此,所以http是无状态的:

而cookie技术,就是用来解决http的无状态特性所造成的问题的。

Cookie简介:

Cookie(复数形态Cookies),中文名称为“小型文本文件”或“小甜饼”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109,是网景公司的前雇员卢·蒙特利在1993年3月的发明。

目前定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265(可以叫做浏览器缓存)。

分类:

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie

用途:

一开始也说了,因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

(以上内容转自维基百科)

Cookie的缺陷:

虽然cookie能解决http的无状态特性所造成的问题,但是它也并非是完美的,它的主要缺陷有以下几项:

1. Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。

2. 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)

3. Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。

以上介绍cookie是啥玩意,也说明了cookie用途和它的一些缺陷,那么下面就演示如何在Servlet中使用cookie。

首先要介绍一下使用什么方法来获得和发送cookie:

  1. 想给浏览器一个Cookie信息,需要使用Response对象调用addCookie方法。

2. 想得到浏览器发送过来的Cookie, 则需要使用Request对象调用getCookies对方法。

Cookie的数据结构:

Cookie是以键/值对的方式存储数据的,就像数据库中的表格数据结构类似,而且在浏览器的控制台中显示的方式,也是以一个数据库表格的方式呈现。如果出现了重复的cookie数据,那么旧的数据会被新的数据所覆盖掉。

下面使用一个简单示例演示如何给浏览器响应cookie信息,代码示例:

这个Cookie过期时间的单位是秒,只要设置了过期时间就属于持久存储一类,因为哪怕只有一秒也会被写入到磁盘中。

使用浏览器访问这个Servlet后,打开调试查看Cookie信息:

如图,可以看到服务器将cookie数据响应到浏览器中了,显示的方式和表格类似。

如果不设置cookie过期时间的话,那么浏览器关闭,cookie就会被清空,示例:

运行结果:

关闭浏览器再次打开这个控制台:

可以看到,我们的cookie数据不存在了,这种就是非持久存储的cookie。

然后下来就是如何获得浏览器请求带过来的cookie数据,前提是你的浏览器要有这个cookie,所以得先访问A Servlet再访问B Servlet:

访问B Servlet,运行结果:

如图,可以看到将浏览器中所有的cookie数据都获得到手了。

最后我们使用以上所介绍的cookie知识点来做一个简单的登录,登录后能记录用户的登录信息,即便用户使用登录后的网址访问也仍是登录状态,html代码示例:

Servlet代码示例:

运行结果:

现在登录了之后就能够不用再次登录了,直接访问login就能显示欢迎登录:

如图,我是直接访问的login,并没有进行登录,依然会显示欢迎登录,因为通过了cookie让服务端记忆了我的登录状态。

以上这仅是一个简单的cookie在登录中的应用示例,实际的情况上要比这复杂得多,还需要加密啥的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简单使用saltstack

    saltstack的salt命令可以用于远程在minion端上执行命令,本节介绍一下salt的常用语法。

    端碗吹水
  • 编译安装大数据平台权限管理组件 - Apache Ranger 3.x

    进入源码目录:cd ranger,修改该目录下的pom文件,主要修改两个地方,第一是将仓库相关配置都给注释掉:

    端碗吹水
  • shell特殊符号cut命令,sort_wc_uniq命令,tee_tr_split命令

    4.\ 脱义字符,有些字符是命令,所以需要脱义符来让这个字符变成普通字符,而非命令字符:

    端碗吹水
  • Python接口自动化之cookie、session应用

    在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之post请求,介绍了post源码,data、json参数应用场景及实战...

    ITester软件测试小栈
  • Kali Linux Web渗透测试手册(第二版) - 3.10 - 从爬行结果中识别相关文件和目录

    thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt,

    7089bAt@PowerLi
  • ES6之class基本语法

    类这个概念对于做后台的应该是非常熟悉,JavaScript的类对于其他面向对象的语言差异很大,只能使用构造函数生成实例对象。为了接近传统语言,ES6引入了cla...

    wade
  • 数据结构与算法 -线性表顺序存储及其相关算法

    (2). 顺序表要求占用连续的空间,存储分配只能预先进 行,因此当表长变化较大时,难以确定合适的存储规模。

    越陌度阡
  • python 通过元类控制类的创建

    在上面这张图中,A是我们平常在python中写的类,它可以创建一个对象a。其实A这个类也是一个对象,它是type类的对象,可以说type类是用来创建类对象的类,...

    py3study
  • 10.python递归函数

    一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionErro...

    猿说编程[Python和C]
  • hdu 4405Aeroplane chess(概率DP)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32...

    Gxjun

扫码关注云+社区

领取腾讯云代金券