专栏首页程序猿的大杂烩使用Servlet制作简单登录验证,response下载文件与网页跳转

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

制作一个登录验证:

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

使用到的工具和技术:

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

大概思路:

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

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

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

实现代码示例:

Mysql数据库:

表格中的数据:

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

页面代码:

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

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

Servlet代码:

运行效果:

输入用户名和密码:

登录成功:

登录失败:

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

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

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

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

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

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

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

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

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

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

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

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

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

代码示例:

登录成功:

登录失败:

就这样我们,

网页跳转:

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

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

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

重定向跳转代码示例:

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

AServlet:

BServlet:

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

控制台打印结果:

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

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

AServlet:

BServlet:

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

控制台打印结果:

内部转发代码示例:

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

AServlet:

BServlet:

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

控制台打印结果:

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

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

AServlet:

BServlet:

浏览器访问结果:

控制台打印结果:

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

运行结果:

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tomcat性能监控与调优

    Tomcat是目前被应用得最多的一款Java Web服务器,很多人都会使用Tomcat来作为项目的服务器。也经常需要在开发的时候对Tomcat进行debug。在...

    端碗吹水
  • CentOS7下LNMP环境搭建Discuz论坛

    2.检查selinux是否已关闭,防火墙的80端口是否已打开,或者是否清空了防火墙规则:

    端碗吹水
  • python基本数据类型

    在python中变量不需要声明数据类型,但是每个变量使用前都必须先赋值,只有赋值后变量才会被创建。所以在python中变量就是变量没有类型,我们所说的类型是变量...

    端碗吹水
  • 云从孙庆凯:不能盈利再多技术也是枉然,2018年将是市场洗牌期 | 镁客请讲

    镁客网
  • 2 分钟搞定 3 个现代 CSS 特性

    Clip Paths 能把元素元素“裁剪”成特定形状,使用 CSS 提供的 polygon、circle、ellipse 等这些函数实现。举个例子:

    Javanx
  • 30分钟开发一款抓取网站图片资源的浏览器插件

    由于业务需求, 笔者要为公司开发几款实用的浏览器插件,所以大致花了一天的时间,看完了谷歌浏览器插件开发文档,在这里特地总结一下经验, 并通过一个实际案例来复盘插...

    徐小夕
  • 7. 整数反转

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 −231,  231 − 1。请根据这个假设,如果反转后整数溢出那么就返回 0。

    Michel_Rolle
  • 使用matlab生成sine波coe文件

    在xilinx ISE中我们使用ROM经常会用到.coe文件,coe文件为xilinx ROM的初始化文件。

    FPGA开源工作室
  • Linux下搭建Hadoop详细步骤

    1:在Linux下输入命令vi /etc/profile 添加HADOOP_HOME

    用户5166556
  • IE、Chrome、Firefox修改http header信息

    在测试系统交互时,可能会碰到需要修改header信息的要求,下面介绍下如何在IE、Chrome、Firefox修改http header信息。

    一笠风雨任生平

扫码关注云+社区

领取腾讯云代金券