JavaWeb总结(十)
Filter配置详解

web项目目录示意图
<!-- Filter配置 -->
<filter>
<display-name>Filter_one</display-name>
<filter-name>Filter_one</filter-name>
<filter-class>com.my.filter.Filter_one</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter_one</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<display-name>Filter_two</display-name>
<filter-name>Filter_two</filter-name>
<filter-class>com.my.filter.Filter_two</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter_two</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<display-name>Filter_three</display-name>
<filter-name>Filter_three</filter-name>
<filter-class>com.my.filter.Filter_three</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter_three</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- servlet配置 -->
<servlet>
<description></description>
<display-name>Servlet_one</display-name>
<servlet-name>Servlet_one</servlet-name>
<servlet-class>com.my.servlet.Servlet_one</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_one</servlet-name>
<url-pattern>/Servlet_one</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>Servlet_two</display-name>
<servlet-name>Servlet_two</servlet-name>
<servlet-class>com.my.servlet.Servlet_two</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_two</servlet-name>
<url-pattern>/Servlet_two</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>Servlet_three</display-name>
<servlet-name>Servlet_three</servlet-name>
<servlet-class>com.my.servlet.Servlet_three</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_three</servlet-name>
<url-pattern>/Servlet_three</url-pattern>
</servlet-mapping>
//Filter_one重写的doFilter语句
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("Filter_one前====>");
chain.doFilter(request, response);
System.err.println("Filter_one后====>");
}
//Filter_two重写的doFilter语句
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("Filter_two前====>");
chain.doFilter(request, response);
System.err.println("Filter_two后====>");
}
//Filter_three重写的doFilter语句
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("Filter_three前====>");
chain.doFilter(request, response);
System.err.println("Filter_three后====>");
}
//Servlet_one重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.err.println("Servlet_one===>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//Servlet_two重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.err.println("Servlet_two===>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//Servlet_three重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.err.println("Servlet_three===>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
已知:过滤器Filter_one、Filter_two、Filter_three都会对Servlet_one进行拦截,那么当我们在浏览器地址输入Servlet_one,客户端会打印什么呢?

输入Servlet_one地址

客户端打印结果

传递资源会经过Filter_one、Filter_two、Filter_three三个过滤器,到达Servlet_one,访问结束后响应又会经过Filter_one、Filter_two、Filter_three三个过滤器,所以才有上图的结果
修改Servlet_one代码
//Servlet_one重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.err.println("Servlet_one===>");
request.getRequestDispatcher("/Servlet_two").forward(request, response);
重定向到Servlet_two结果又会是怎样呢?结果是如下表左边还是右边呢?
|
Filter_one前====> Filter_two前====> Filter_three前====> Servlet_one===> Servlet_two===> Filter_three后====> Filter_two后====> Filter_one后====> |
Filter_one前====> Filter_two前====> Filter_three前====> Servlet_one===> Filter_one前====> Filter_two前====> Filter_three前====> Servlet_two===> Filter_three后====> Filter_two后====> Filter_one后====> Filter_three后====> Filter_two后====> Filter_one后====> |

结果如上表(结果左)所示
这是为什么呢?过滤器不是对项目内所有文件都要进行过滤吗?为什么这里没有对Servlet_two进行过滤?原因就在这里<dispatcher>标签,内含四个参数:FORWARD、ERROR、INCLUDE、REQUEST;REQUEST为默认标签,并且一个<filter-mapping>内可以包含多个<dispatcher>标签;
修改Filter_one代码
<filter-mapping>
<filter-name>Filter_one</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
修改后结果如图所示

结果示意图
这样就可以在Servlet_one跳转到Servlet_two的时候,对Servlet_two也进行过滤。
ERROR参数又有什么作用呢?已知我们在程序调试的时候难免出现异常,或者url路径填写错误,那么网页就会提示这些错误

Error Status 500

Error Status 404
这样的错误提示信息较为相信,明眼人一眼就能看见错误信息,这样你的后台信息就会暴露出来,这样是非常不好。那么怎么替代这些错误信息呢?就要用到<dispatcher>标签中的ERROR参数。
修改Filter_one代码
<!--在标签<filter-mapping>中添加子标签<dispatcher>并且参数为ERROR-->
<dispatcher>ERROR</dispatcher>
<!--在标签<web-app>中添加子标签<error-page>-->
<error-page>
<!--状态码-->
<error-code>404</error-code>
<!--连接路径-->
<location>/Test/WebContent/jsp/error_404_page.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/Test/WebContent/jsp/error_500_page.jsp</location>
</error-page>
当程序再出现异常的时候,就会跳转到我们自己设计的错误提示页面,不会将源代码错误信息显示在页面上。既美化又更加安全、健壮!

Error Status 500

Error Status 404
Filter配置详解

web项目目录示意图
|
<!-- Filter配置 --> <filter> <display-name>Filter_one</display-name> <filter-name>Filter_one</filter-name> <filter-class>com.my.filter.Filter_one</filter-class> </filter> <filter-mapping> <filter-name>Filter_one</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <display-name>Filter_two</display-name> <filter-name>Filter_two</filter-name> <filter-class>com.my.filter.Filter_two</filter-class> </filter> <filter-mapping> <filter-name>Filter_two</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <display-name>Filter_three</display-name> <filter-name>Filter_three</filter-name> <filter-class>com.my.filter.Filter_three</filter-class> </filter> <filter-mapping> <filter-name>Filter_three</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
|
<!-- servlet配置 --> <servlet> <description></description> <display-name>Servlet_one</display-name> <servlet-name>Servlet_one</servlet-name> <servlet-class>com.my.servlet.Servlet_one</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet_one</servlet-name> <url-pattern>/Servlet_one</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>Servlet_two</display-name> <servlet-name>Servlet_two</servlet-name> <servlet-class>com.my.servlet.Servlet_two</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet_two</servlet-name> <url-pattern>/Servlet_two</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>Servlet_three</display-name> <servlet-name>Servlet_three</servlet-name> <servlet-class>com.my.servlet.Servlet_three</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet_three</servlet-name> <url-pattern>/Servlet_three</url-pattern> </servlet-mapping> |
|
//Filter_one重写的doFilter语句 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.err.println("Filter_one前====>"); chain.doFilter(request, response); System.err.println("Filter_one后====>"); } //Filter_two重写的doFilter语句 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.err.println("Filter_two前====>"); chain.doFilter(request, response); System.err.println("Filter_two后====>"); } //Filter_three重写的doFilter语句 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.err.println("Filter_three前====>"); chain.doFilter(request, response); System.err.println("Filter_three后====>"); } //Servlet_one重写doGet方法 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.err.println("Servlet_one===>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Servlet_two重写doGet方法 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.err.println("Servlet_two===>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Servlet_three重写doGet方法 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.err.println("Servlet_three===>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } |
已知:过滤器Filter_one、Filter_two、Filter_three都会对Servlet_one进行拦截,那么当我们在浏览器地址输入Servlet_one,客户端会打印什么呢?

输入Servlet_one地址

客户端打印结果
|
|
|
传递资源会经过Filter_one、Filter_two、Filter_three三个过滤器,到达Servlet_one,访问结束后响应又会经过Filter_one、Filter_two、Filter_three三个过滤器,所以才有上图的结果。 |
修改Servlet_one代码
|
//Servlet_one重写doGet方法 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.err.println("Servlet_one===>");request.getRequestDispatcher("/Servlet_two").forward(request, response); } |
|
|
重定向到Servlet_two结果又会是怎样呢? 结果是如左边还是右边呢? |
|
|
Filter_one前====> Filter_two前====> Filter_three前====> Servlet_one===> Servlet_two===> Filter_three后====> Filter_two后====> Filter_one后====> |
Filter_one前====> Filter_two前====> Filter_three前====> Servlet_one===> Filter_one前====> Filter_two前====> Filter_three前====> Servlet_two===> Filter_three后====> Filter_two后====> Filter_one后====> Filter_three后====> Filter_two后====> Filter_one后====> |

结果如上表(结果左)所示
这是为什么呢?过滤器不是对项目内所有文件都要进行过滤吗?为什么这里没有对Servlet_two进行过滤?原因就在这里<dispatcher>标签,内含四个参数:FORWARD、ERROR、INCLUDE、REQUEST;REQUEST为默认标签,并且一个<filter-mapping>内可以包含多个<dispatcher>标签;
修改Filter_one代码
|
<filter-mapping> <filter-name>Filter_one</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> |
修改后结果如图所示

结果示意图
这样就可以在Servlet_one跳转到Servlet_two的时候,对Servlet_two也进行过滤。
ERROR参数又有什么作用呢?已知我们在程序调试的时候难免出现异常,或者url路径填写错误,那么网页就会提示这些错误

Error Status 500

Error Status 404
这样的错误提示信息较为相信,明眼人一眼就能看见错误信息,这样你的后台信息就会暴露出来,这样是非常不好。那么怎么替代这些错误信息呢?就要用到<dispatcher>标签中的ERROR参数。
修改Filter_one代码
|
在标签<filter-mapping>中添加子标签<dispatcher>并且参数为ERROR <dispatcher>ERROR</dispatcher> 在标签<web-app>中添加子标签<error-page> <error-page> <!--状态码--> <error-code>404</error-code> <!--连接路径--> <location>/Test/WebContent/jsp/error_404_page.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/Test/WebContent/jsp/error_500_page.jsp</location> </error-page> |
当程序再出现异常的时候,就会跳转到我们自己设计的错误提示页面,不会将源代码错误信息显示在页面上。既美化又更加安全、健壮!

Error Status 500

Error Status 404
JavaWeb总结(十)的更多相关文章
- javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- JavaWeb总结(十)—文件上传和下载
一.文件的上传 1.文件的基本上传 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择 ...
- JavaWeb 后端 <十四> 文件上传下载
1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: ...
- JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器
一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤
- JavaWeb 后端 <十> 之 数据池 C3P0 DPCB JNDI
一.数据库连接池原理:(理解) //模拟数据库连接池的原理 public class ConnectionPoolDemo { private static List<Connection> ...
- JavaWeb学习 (十九)————JavaBean
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- JavaWeb学习 (十八)————JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- JavaWeb学习 (十六)————JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb学习 (十五)————JSP指令
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
- JavaWeb学习 (十四)————JSP基础语法
一.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. 二.JSP表达式 JSP脚本表达式(expression)用于将 ...
随机推荐
- vue-cli的webpack模板项目配置文件说明
如果没有vue-cli,那么进行vue项目的开发环境配置将是很费力的一件事情,现在脚手架可以快速构建一个开发环境,是很不错的.不过对于脚手架构建的配置,还是要大概了解一下,方便自己调试配置. 初始化一 ...
- 用C#自定义一个简单的集合
闲来无聊来自己做了一个简单的'集合',用来加深自己对集合的理解 class listNode { private object value; public listNode(object _value ...
- September 27th 2017 Week 39th Wednesday
We both look up at the same stars, yet we see such different things. 我们仰望同一片星空,却看见了不同的事物. Looking up ...
- MyISAM和innoDB对比,覆盖索引简单回顾
MyISAM Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam. 它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以 ...
- spring中MessageSource的配置使用方法2--ReloadableResourceBundleMessageSource【转】
本文转载仅供自己学习收录,不做任何商业用途,如有需要可访问原地址:http://blog.csdn.net/qyf_5445/article/details/8124362 如何在spring mvc ...
- log4jnet不记录日志的问题解决
背景:dll文件从别人项目里复制过来的,配置文件是从别的项目里配置过来的.然后就是不写日志. 最后经过搜索原项目,发现需要在AssemblyInfo.cs文件里加一段话, [assembly: log ...
- Uva10048 Audiophobia (Floyd)
题意:有一个无向带权图,求出两点之间路径的最大边权值最小能为多少. 思路:使用floyd算法跑一边以备查询,每一次跑的过程中dp[i][j]=min(dp[i][j],max(dp[i][k],dp[ ...
- laravel框架之blade模板引擎
## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...
- CF97B Superset
嘟嘟嘟cf 嘟嘟嘟luogu 刚开始我看成了对于一个点\(i\),存在一个点\(j\)满足三个条件之一,而不是任意的\(j\).结果自然\(gg\)了,第二个点就\(WA\)了. 也不知怎么来的思路: ...
- Error: Couldn't find preset "env" relative to directory "/Users/user/ethereumjs-vm"
运行npm run build时遇见这个问题,解决办法是安装: npm install --save-dev babel-preset-env 就解决了












过滤示意图