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. 使用dva脚手架(dva-cli)快速构建React项目

    安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具, ...

  2. Oracle EBS 新增OAFM个数

    在 $INST_TOP/ora/10.1.3/opmn/conf/opmn.xml中找到<process-type id="oafm" module-id="OC4 ...

  3. RHEL7系统管理之网络管理

    1. RHEL7的网络介绍 在RHEL7中, NetworkManager 提供的默认联网服务是一个动态网络控制和配置守护进程, 支持ifcfg类型的配置文件. NetworkManager 可用于连 ...

  4. buff/cache 内容释放

    oscache远程服务器特别卡,top命令查看获得 buff/cache 占据内存特别大,使用以下命令清理缓存: swap清理: swapoff -a && swapon -a 注意: ...

  5. python常见释疑(有别于报错)(不定时更新)

    文:铁乐与猫 01.在cmd运行py脚本后,直接回到了提示符,没有任何输出,看起来像是并没有运行一样. 答:你的感觉很可能是对的,但脚本很可能己经正常运行,只是你的代码里面很可能没有给出print提示 ...

  6. php 代码编写规范

    1 编写目的为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范.开发团队根据自己的实际情况,可以对本规范进行补充或裁减. 2 整体要 ...

  7. zabbix日常监控项mysql(七)

    参考文档: percona官方文档:https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html za ...

  8. notepad快捷键大全

    Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...

  9. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分

    C++计算器项目初始部分 零.项目源文件地址 传送门:calculator 一.项目信息相关: 项目:Calculator 版本:1.0 日期:2016.2.16 实现: 基本的操作界面 对四则运算表 ...

  10. PAT 1001 A+B 解题报告

    PAT 1001 A+B 代码链接:传送门 题目链接:传送门 题目简述: 给定两个值a,b: 范围-1000000 <= a, b <= 1000000: 按指定格式输出a+b的结果,例: ...