制作一个登录验证:
之前已经介绍过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