分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

使用Servlet制作简单登录验证,response下载文件与网页跳转

发布时间:2023-09-06 01:24责任编辑:苏小强关键词:暂无标签

制作一个登录验证:

之前已经介绍过Servlet的开发,和HttpServletRequest、HttpServletResponse中的大部分常用方法。现在我们可以通过这几个知识点制作一个简单的登录验证,这个登录验证需要连接数据库,因为用户名和密码存储在数据库中。


使用到的工具和技术:

Tomcat、C3P0、JDBC、Servlet、mysql、html、css


大概思路:

首先在mysql数据库中创建一个库和用户数据表,在表格里先存储一个用户和密码(毕竟没有做注册功能)。

使用html、css编写一个登录页面,用户密码通过表单提交到服务端的Servlet上。

编写一个可以从c3p0连接池获得数据库连接对象的类,然后再编写一个Servlet类,在Servlet类中通过HttpServletRequest对象来获得表单数据,得到用户密码后需要验证一下合法性(服务端的二次验证),通过验证后连接mysql数据库进行查询,查询有这个数据后,就通过HttpServletResponse对象响应登录成功,否则响应登录失败。


实现代码示例:

Mysql数据库:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE7709487C18ED4B8499778B09B5FBBBCB/4674" alt="4674" />


表格中的数据:

650) this.width=650;" style="width:492px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE6291C934256F4964BD0C8BB01FA248FA/4675" alt="4675" />

密码是使用password()函数加密过的。


页面代码:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE876FA79321D74CA1A2C06056E6251D7D/4676" alt="4676" />

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE0FD7C899162842B1826135C02B2077FE/4677" alt="4677" />

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEF66EDCD131DF43DEAA03B4BFF10E2F4F/4678" alt="4678" />


编写Servlet前需要下载两个jar包,一个是c3p0一个是jdbc的包,然后把这两个包放在WEB-INF里的lib目录(注意不要放错):

650) this.width=650;" style="width:332px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE8D433D6ED49E4AA5A42BD52B04D4C749/4679" alt="4679" />


然后编写一个可以从连接池中获得对象的类:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE74B2E20814F641DB92A40847B088C52B/4680" alt="4680" />

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICED3CA9A3FEDE641A0818EF868B46DBD04/4681" alt="4681" />



Servlet代码:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE71EFDA024381451DA94327C7F881B440/4682" alt="4682" />

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEEC5E4D786B4A4681AA4EDA40272C3B79/4683" alt="4683" />


运行效果:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE5049317D285842F3BD222236F12F0E99/4685" alt="4685" />


输入用户名和密码:

650) this.width=650;" style="width:444px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE707EE350744E46F1AB46FE41A7C236C0/4686" alt="4686" />


登录成功:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEE7574F9CE55044D49C610C8CFE919706/4687" alt="4687" />


登录失败:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE4A7C9F16792B4FCD9236DD964ABEF39B/4688" alt="4688" />


从以上的实现代码中,可以看到我在html的表单代码中,声明了required必填属性作为表单的验证,然后又在js代码里进行了判断验证,除此之外还在服务端的Servlet类上又用代码验证了一次,如此算来验证了三次数据的合法性。

可能会有人有疑问,为什么在前端中验证了数据的合法性,还要在服务端再验证多一次,这是因为他喵的网页源码是可以更改的,我可以把网页代码中的required属性去掉,而且在一些浏览器上还可以禁用js的解释器(手动滑稽)。不信的话,看一下就知道了:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEFA1D679D886444AA9D4C19D7B52BA033/4689" alt="4689" />


这时候我就可以跳过html的表单验证了:

650) this.width=650;" style="width:520px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE15F383AC697F4BC395048369493FAAB2/4690" alt="4690" />

因为我在js里还写了一次验证,所以会显示账户密码为空,但是html中的验证就是跳过了。


然后我在浏览器设置中把js给禁用:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEEA753C4A251640B6B30F58C7A7120774/4691" alt="4691" />


这时候就只剩服务端那一层验证了:

650) this.width=650;" style="width:476px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE239421546258408ABEDD4C7278538120/4692" alt="4692" />

所以说服务端的验证是必不可少的,如果不在服务端写多一层验证就是在搞事情。





通过response实现简单的文件下载:

其实就算不通过response也可以让浏览器下载文件,只需要把要下载的文件放在WebContent目录下即可:

650) this.width=650;" style="width:323px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE7F6A271E9A264E8BA491E42956DCD8B0/4693" alt="4693" />


然后通过浏览器访问这个文件的名称就可以下载了:

650) this.width=650;" style="width:483px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE7878DE2375614076B3928B2A06163497/4694" alt="4694" />

650) this.width=650;" style="width:295px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEF13E75EA5CAA4E06A6E60ACDA46D0DDF/4695" alt="4695" />

这是因为Tomcat可以自动响应对应的文件类型给浏览器,浏览器接收发现是不可以直接打开的文件后就会自动下载了。

但是在实际开发中不要这么做,因为不安全,如果是一些不重要的文件或者能够提供公共下载的文件还好说,但是重要的数据文件或者客户的资料被这样盗链下载的话,会造成客户的隐私泄露,所以这一类文件的下载必须要通过服务端的验证后才能下载。



例如我们可以做一个简单的实验,结合上面那个登录验证的例题,先登录成功后才能开始下载文件,在Servlet中通过HttpServletResponse对象我们可以响应出一个需要浏览器进行下载的文件类型,然后再通过I/O流将本地文件文件输出给浏览器下载。

代码示例:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE0274A571B3C0427AA0790D8BED47618A/4696" alt="4696" />

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE3020954E5A134947AA13F1CFF5DA2BC1/4697" alt="4697" />

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE4729F6A59D1446E0839A1F766D62C569/4698" alt="4698" />


登录成功:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEB15BD9903EE34007855AD86E4E1E28EE/4699" alt="4699" />


登录失败:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE7AC28ECDA90E48A69337A5FA33C6EC79/4700" alt="4700" />

就这样我们,




网页跳转:

在Request和Response对象中各有一个方法,可以实现请求跳转的功能,这个跳转分为重定向跳转,和内部转发跳转,示意图:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE9AAEF633A32A44BDA9B091C69B4AB13F/4701" alt="4701" />

如图可以看到重定向与内部转发的区别,重定向是会访问AServlet,然后AServlet再告诉浏览器去访问BServlet,所以浏览器会访问两次Servlet。

而内部转发浏览器则是只需要访问一次Servlet,因为AServlet会在内部将请求转发给BServlet,所以HttpServletRequest和HttpServletResponse对象依然还是同一个,重定向则反之,因为访问了两次Servlet所以生成了两次对象。

重定向跳转代码示例:

重定向跳转需要使用HttpServletResponse对象来调用sendRedirect方法,这个方法需要传递一个参数,传递的是要跳转的Servlet的web访问名称。

AServlet:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE0A317549246A409E902604D2AEA5B6B0/4702" alt="4702" />


BServlet:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE8CBA3D8EA0FF464E8B0E93356A892185/4703" alt="4703" />


浏览器访问AServlet的时候会跳转到BServlet上:

650) this.width=650;" style="width:402px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEE3F0635B4A2E48AD9BEDEE6530868185/4704" alt="4704" />


控制台打印结果:

650) this.width=650;" style="width:184px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE6449C4FFE308409D86130E673FE9C155/4705" alt="4705" />

从打印顺序可以看到是先访问了AServlet再访问的BServlet。


重定向的转发方式可以在转发的时候在URL中添加一些参数,代码示例:

AServlet:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEB6777098251B47E78A4388D27B415E5B/4706" alt="4706" />


BServlet:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEF75F5AF2614B47E7827348CDA246795E/4707" alt="4707" />


浏览器访问AServlet跳转后会发现多了几个参数:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE00A26D369389445CB302558FD7E4B5E2/4708" alt="4708" />


控制台打印结果:

650) this.width=650;" style="width:220px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE69BF60B08A4C47159E1F095CA2402A9E/4709" alt="4709" />



内部转发代码示例:

内部转发需要使用HttpServletRequest对象来调用getRequestDispatcher方法,这个方法同样的需要传递一个参数,传递的是要跳转的Servlet的web访问名称。但是这个方法会返回一个RequestDispatcher对象,然后还需要通过这个对象调用forward方法将HttpServletRequest和HttpServletResponse对象一并传递过到目标Servlet上去,代码示例:

AServlet:

650) this.width=650;" style="width:552px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE81480BA0189E4D5E99C8F46B7A8EBBFC/4710" alt="4710" />


BServlet:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEC7FF0C29A085410889A54A34F903047E/4711" alt="4711" />


浏览器访问AServlet的时候URL不会显示跳转到了BServlet上,但是会接收到BServlet的响应结果,这是内部转发与重定向跳转不同的一点:

650) this.width=650;" style="width:353px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEC7FF46B66C324716BA7E16D63B328818/4712" alt="4712" />


控制台打印结果:

650) this.width=650;" style="width:185px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE5643FFB78D984D37B85666816369F47B/4713" alt="4713" />

从打印顺序可以看到是先访问了AServlet再访问的BServlet。


由于内部转发会将请求和响应对象一并传递到目标Servlet,所以我们可以在转发的时候往请求数据中添加一个属性什么的:

AServlet:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEDCC4A307121D487BA9EAD857AB618C1D/4714" alt="4714" />


BServlet:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE197EBD480C49498B89D046E67B2F88BD/4715" alt="4715" />


浏览器访问结果:

650) this.width=650;" style="width:330px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEFBBB0CE98DC747079E09ECB626490C00/4716" alt="4716" />


控制台打印结果:

650) this.width=650;" style="width:240px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICE3C29F79A948F43F4B70FEE84EB58950C/4717" alt="4717" />


以上的示例只是演示了简单的跳转,除了可以跳转自己工程下的页面,还可以通过重定向跳转到别人的页面,例如百度、Google 什么的,代码示例:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICECFDB6168BEB742FEAC8B6FD384A93EEC/4718" alt="4718" />


运行结果:

650) this.width=650;" style="width:553px;" src="https://note.youdao.com/yws/public/resource/63cb50ee186ab78e34e2aada9d4a4193/xmlnote/OFFICEF54B7FBDDC3846F68FC212FE938C9B49/4719" alt="4719" />


注意:只有重定向类型的跳转才能跳别人的网页,内部转发只能跳转自己工程下的网页,而且实现重定向的sendRedirect方法只能在一个Servlet中调用一次,如果调用两次就会报错。




本文出自 “zero” 博客,请务必保留此出处http://zero01.blog.51cto.com/12831981/1981476

使用Servlet制作简单登录验证,response下载文件与网页跳转

原文地址:http://zero01.blog.51cto.com/12831981/1981476

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved