使用Servlet制作简单登录验证,response下载文件与网页跳转
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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中调用一次,如果调用两次就会报错。
本文出自 “zero” 博客,请务必保留此出处http://zero01.blog.51cto.com/12831981/1981476
以上是关于使用Servlet制作简单登录验证,response下载文件与网页跳转的主要内容,如果未能解决你的问题,请参考以下文章