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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Servlet制作简单登录验证,response下载文件与网页跳转相关的知识,希望对你有一定的参考价值。


制作一个登录验证:

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


使用到的工具和技术:

Tomcat、C3P0、JDBC、Servlet、mysqlhtml、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中调用一次,如果调用两次就会报错。




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

以上是关于使用Servlet制作简单登录验证,response下载文件与网页跳转的主要内容,如果未能解决你的问题,请参考以下文章

使用 @ControllerAdvice 制作简单的 servlet 过滤器

java登录验证码

JAVA WEB中的Servlet过滤器

从mysql数据库登录验证servlet

JDBC 制作简单的登录验证

Servlet过滤器---登录权限控制