Filter内容
1.利用Filter来过滤的时候大都是Http请求和Http响应,在doFilter()方法中,参数类是ServletRequest和ServletResponse ,使用的时候一般需要强制转换为HttpServletRequest和HttpServletResponse 。针对这个问题,可以仿照GenericServlet 的做法,来定义一个HttpFilter,用作所有Filter的父类。
HttpFilter.java
package com.javaweb.Filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public abstract class HttpFilter implements Filter {
@Override
public void destroy() { }
/*
* 原生的doFilter方法,在方法内部把ServletRequest和ServletResponse转为了HttpServletRequest和HttpServletResponse,
* 并调用了doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain filterchain)方法。
* 若编写Filter的过滤方法不建议直接继承该方法,而建议继承doFilter(HttpServletRequest request,HttpServletResponse response,
* FilterChain filterchain)方法。
* */
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterchain)
throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
doFilter(request,response,filterchain);
}
//抽象方法,为Http请求定制必须实现的方法。
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain filterchain) throws IOException, ServletException;
private FilterConfig filterconfig;
//不建议子类直接覆盖,若直接覆盖,将可能会导致filterConfig成员变量初始化失败。
@Override
public void init(FilterConfig filterconfig) throws ServletException {
this.filterconfig =filterconfig;
init();
}
//供子类继承的初始化方法,可以通过getFilterConfig()获取FilterConfig对象。
public void init(){}
//直接返回init(ServletConfig)的ServletConfig对象。
public FilterConfig getFilterConfig(){
return filterconfig;
}
}
2.理解多个Filter代码的执行顺序
示例代码:
index.html
<body>
<a href="http://localhost:8080/MyWebProject/jspTest/test.jsp">to test jsp page</a>
</body>
test.jsp
<body>
<%
System.out.println("5. Test page");
%>
</body>
过滤器拦截:
filterTest.java
package com.javaweb.Filter; import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class filterTest implements Filter {
@Override
public void destroy() {
System.out.println("destroy...");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("1. before filterTest's chain.doFilter...");
chain.doFilter(request,response);
System.out.println("2. after filterTest's chain.doFilter...");
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init...");
} }
secondFilter.java
package com.javaweb.Filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class secondFilter implements Filter {
@Override
public void destroy() {
System.out.println("secondFilter's destroy..."); } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("3. before secondFilter's chain doFilter...");
chain.doFilter(request,response);
System.out.println("4. after secondFilter's chain doFilter...");
} @Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("secondFilter's init..."); } }
在web.xml中进行配置:
<filter>
<filter-name>filterTest</filter-name>
<filter-class>com.javaweb.Filter.filterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>filterTest</filter-name>
<url-pattern>/jspTest/test.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>secondFilter</filter-name>
<filter-class>com.javaweb.Filter.secondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>secondFilter</filter-name>
<url-pattern>/jspTest/test.jsp</url-pattern>
</filter-mapping>
执行顺序:

index.html页面点击链接时去test.jsp页面,被第一个过滤器filterTest拦截,
①首先执行其中的doFilter()方法,执行方法体中的System.out.println("1. before filterTest's chain.doFilter...");
②之后chain.doFilter(request,response);将拦截传递给下一个过滤器secondFilter,执行其中的doFilter()方法,同样执行方法体中的System.out.println("3. before secondFilter's chain doFilter...");
③接着chain.doFilter(request,response);因为没有过滤器,所以将请求转发到test.jsp,执行<% System.out.println("5. Test page"); %>;
④接下来执行方法体中的System.out.println("4. after secondFilter's chain doFilter...");
⑤最后回到filterTest的doFilter()方法中,执行System.out.println("2. after filterTest's chain.doFilter...");
3.<dispatcher>
<dispatcher></dispatcher>指定过滤器所拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认为REQUEST。可以设置多个<dispatcher>子元素来指定Filter对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将会被调用,除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将会被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将会被调用,除此之外,过滤器不会被调用。
Filter内容的更多相关文章
- Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)
Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...
- 【Dubbo 源码解析】03_Dubbo Protocol&Filter
Protocol & Filter Dubbo 服务暴露和服务引用都是通过的 com.alibaba.dubbo.rpc.Protocol 来实现的.它是一个 SPI 扩展. @SPI(&qu ...
- Servlet、Filter、Listener总结
servlet规范提供了一组标准的servlet api.servlet容器就是servlet规范的实现. 1.In Action (1)写一个类继承HttpServlet: (2)重写其中的方法. ...
- Dubbo Filter详解
转载:https://www.jianshu.com/p/c5ebe3e08161 Dubbo的Filter在使用的过程中是我们扩展最频繁的内容,而且Dubbo的很多特性实现也都离不开Filter的工 ...
- dubbo-源码阅读之Filter实现原理
最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印 打印不出traceI,然后百度搜索如何重写Filter 参 ...
- (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案
在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...
- 在quasar 注册全局filter
A common use case for Quasar applications is to run code before the root Vue app instance is instant ...
- 4_jquery
官网:www.jquery.com 兼容: 1.jquery-3.1.0.js :form.attr("checked","false")无效 2.firefo ...
- salesforce 零基础学习(三十一)关于LookUp字段点击Save时的Validation
今天在群里大概遇到了这样一个问题,明明这个User存在,但是save的时候提示信息说Value不存在,大概的意思如下图所示,目前认为这种问题常见的可能情况有两种. 一.此字段设置Validation ...
随机推荐
- BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...
- Windows Server 2008 R2 下 Core界面
Windows Server 2008 R2 下 Core界面 关于 sc 以及 net 命令 Sc 命令较不全面,仅仅是给服务发送一个开启或者关闭就结束了 Net 命令比较安全,它监视了整个服务的启 ...
- uC/OS-II 函数之内存管理相关函数
上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC ...
- JAVA将秒的总和转换成时分秒的格式
public static void main(String[] args) { String str = "221"; int seconds = Integer.parseIn ...
- J15W-J45W铜截止阀厂家,J15W-J45W铜截止阀价格 - 专题栏目 - 无极资讯网
无极资讯网 首页 最新资讯 最新图集 最新标签 搜索 J15W-J45W铜截止阀 无极资讯网精心为您挑选了(J15W-J45W铜截止阀)信息,其中包含了(J15W-J45W铜截止阀)厂家,(J15 ...
- activeMQ入门+spring boot整合activeMQ
最近想要学习MOM(消息中间件:Message Oriented Middleware),就从比较基础的activeMQ学起,rabbitMQ.zeroMQ.rocketMQ.Kafka等后续再去学习 ...
- Unity QualitySettings.SetQualityLevel 设置质量级别
QualitySettings.SetQualityLevel 设置质量级别 public static void QualitySettings.SetQualityLevel(int index) ...
- opencv-python 读入带有中文的图片路径
windows 下读入带有中文的图片路径使用cv2.imread() 不能读入.使用如下代码可以. def cv_imread(filePath): cv_img = cv2.imdecode(np. ...
- How do I use screen on the Linux systems?
Scope The screen utility provides a way to run a command on a Linux system, detach from it, and then ...
- linux磁盘分区fdisk命令详解
1.什么是分区? 分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁硬使用.分区表是一个硬盘分区的索引,分区的信息都会写进分区表.2.为什么要有多个分区? 防止数 ...