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总结(十)的更多相关文章

  1. javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  2. JavaWeb总结(十)—文件上传和下载

    一.文件的上传 1.文件的基本上传 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择 ...

  3. JavaWeb 后端 <十四> 文件上传下载

    1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: ...

  4. JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

    一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤

  5. JavaWeb 后端 <十> 之 数据池 C3P0 DPCB JNDI

    一.数据库连接池原理:(理解) //模拟数据库连接池的原理 public class ConnectionPoolDemo { private static List<Connection> ...

  6. JavaWeb学习 (十九)————JavaBean

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  7. JavaWeb学习 (十八)————JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  8. JavaWeb学习 (十六)————JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  9. JavaWeb学习 (十五)————JSP指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  10. JavaWeb学习 (十四)————JSP基础语法

    一.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素.  JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. 二.JSP表达式 JSP脚本表达式(expression)用于将 ...

随机推荐

  1. SQL SERVER常用语法汇总

    阅读目录 一.SQL分类 二.基础语句 三.sql技巧 四.(MS SQL Server)SQL语句导入导出大全 回到目录 一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,D ...

  2. MVC $.Ajax()+Json实现数据库访问并显示数据

    我们在使用搜索引擎时经常会看到这样一个效果 在输出输入相关文字时会有与之对应的相关提醒,作为一个MVC初学者我也做了一个简单版的“搜索工具”,分享给初学mvc和ajax的童鞋(各位大神勿喷),也加深我 ...

  3. 理解 Linux 的平均负载和性能监控

      在本文中,我们将解释 Linux 系统中最关键的管理任务之一——关于系统 / CPU 的负载load和平均负载Load average的性能监控. 首先来看所有的类 UNIX 系统中两个重要的表述 ...

  4. iOS开发中常用的数学函数

    iOS开发中常用的数学函数 /*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(,)); //result 9 NSLog(,)); //result 27 //开平方 ...

  5. django使用LDAP验证

    1.安装Python-LDAP(python_ldap-2.4.25-cp27-none-win_amd64.whl)pip install python_ldap-2.4.25-cp27-none- ...

  6. 阿里云全球首次互联网8K直播背后的技术解读

    3月28日,云栖大会·深圳峰会现场,阿里云发布并现场演示了阿里视频云最新8K互联网直播解决方案.这是全球发布的首个8K视频云解决方案,也是全球首次8K互联网视频直播. 视频地址:https://v.q ...

  7. November 20th 2016 Week 47th Sunday

    Learn from yesterday, live for today, look to tomorrow. 学习昨天,活在今天,展望明天. There is always room at the ...

  8. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  9. 个人技术博客(1/2)android布局技巧

    (1)weight属性的合理应用 当使用match_parent(fill_parent)时,需要经过计算,否则会出现如下情况 代码: <LinearLayout xmlns:android=& ...

  10. 自定义shell命令--闪烁的字母(PIL实现)

    之前看到shell命令行,有人写过漫天下字母的cmatrix,想自己动手用python写一个类似,但是比较有自己风格的shell屏保 大致效果如下: 制作这个的大体思路比较简单: 1.利用python ...