前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Servlet制作简单登录验证,response下载文件与网页跳转

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

作者头像
端碗吹水
发布2020-09-23 11:34:28
1.8K0
发布2020-09-23 11:34:28
举报

制作一个登录验证:

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

使用到的工具和技术:

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

大概思路:

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

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

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

实现代码示例:

Mysql数据库:

4674
4674

表格中的数据:

4675
4675

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

页面代码:

4676
4676
4677
4677
4678
4678

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

4679
4679

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

4680
4680
4681
4681

Servlet代码:

4682
4682
4683
4683

运行效果:

4685
4685

输入用户名和密码:

4686
4686

登录成功:

4687
4687

登录失败:

4688
4688

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

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

4689
4689

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

4690
4690

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

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

4691
4691

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

4692
4692

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

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

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

4693
4693

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

4694
4694
4695
4695

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

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

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

代码示例:

4696
4696
4697
4697
4698
4698

登录成功:

4699
4699

登录失败:

4700
4700

就这样我们,

网页跳转:

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

4701
4701

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

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

重定向跳转代码示例:

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

AServlet:

4702
4702

BServlet:

4703
4703

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

4704
4704

控制台打印结果:

4705
4705

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

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

AServlet:

4706
4706

BServlet:

4707
4707

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

4708
4708

控制台打印结果:

4709
4709

内部转发代码示例:

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

AServlet:

4710
4710

BServlet:

4711
4711

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

4712
4712

控制台打印结果:

4713
4713

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

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

AServlet:

4714
4714

BServlet:

4715
4715

浏览器访问结果:

4716
4716

控制台打印结果:

4717
4717

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

4718
4718

运行结果:

4719
4719

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档