Filter详解

1.定义

Filter的翻译就是过滤器,可以认为它是一种加强版的Servlet。

几种常见Filter: 
1. 用户授权Filter。用于检查用户请求,根据请求过滤用户非法请求。 
2. 日志Filter。用于记录某些特殊的用户请求。 
3. 解码Filter 
4. 改变XML内容的XSLT Filter

2. Filter作用

  1. 对用户请求进行预处理:在HttpServletRequest到达Servlet之前进行拦截和修改。
  2. 对HttpServletResponse进行后处理:在HttpServletResponse到达客户端之前进行拦截和修改。
  3. 对用户请求生成响应(很少这么用)

3.创建 Filter

1. 创建Filter处理类

package com.zrgk.servlet;

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;
//通过注解方式配置,不需要在web.xml中再配置
@WebFilter(filterName="log",urlPatterns={"/*"})
public class MyFilter implements Filter {

    @Override
    public void destroy() {
        //在Filter销毁前,对某些资源进行回收      
    }

    //过滤所有请求:对每个请求和响应进行额外处理
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        //转换成HttpServletRequest请求,可多一些处理方法
        HttpServletRequest request = (HttpServletRequest)req;       
        HttpServletResponse response = (HttpServletResponse)resp;
        //设置所有路径都支持跨域请求
        response.setHeader("Access-Control-Allow-Origin", "*");
        //打印记录访问路径
        System.out.println("访问路径是:"+request.getServletPath());

        //放行。Filter是链式处理,只有放行后,才能继续往后执行
        //执行该方法前,是对用户请求进行预处理
        //执行该方法后,是对服务器响应进行后处理
        //说明chain.doFilter(...);后面的代码要在服务器生成响应后才能执行
        chain.doFilter(req, resp);

        System.out.println("放行后,还可执行后面的代码");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        //用于完成对Filter的初始化       
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

注:要拦截多个URL时,使用模式字符串来拦截。

2. web.xml文件中配置Filter

若不是采用的注解方式创建Filter就得在web.xml当中配置如下代码:

 <!-- 定义Filter -->
 <filter>
    <!-- Filter名字,相当于@WebFilter的filterName属性 -->
    <filter-name>log</filter-name>
    <!-- Filter实现类 -->
    <filter-class>com.zrgk.servlet.MyFilter</filter-class>
 </filter>

 <!-- 定义Filter拦截的URL -->
 <filter-mapping>
    <!-- Filter名字 -->
    <filter-name>log</filter-name>
    <!-- 要拦截的URL,相当于指定@WebFilter的urlPatterns属性 -->
    <url-pattern>/*</url-pattern>
 </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4.Filter注解(@WebFilter)的常用属性

属性说明
asyncSupported指定该Filter是否支持异步操作
dipatcherTypes指定该Filter仅对哪种dispatcher模式的请求进行过滤。该属性支持ASYNC、ERROR、FORWORD、INCLUDE、REQUEST这5个值的任意组合,默认同时过滤这5种。
displayName指定该Filter的显示名字
filterName指定该Filter的名称
initParams为该Filter配置参数
servletNames指定该Filter对哪些Servlet执行过滤,可多个值。
urlPatterns/value指定要拦截的URL。这两个属性作用是一样的。

5.Filter与Servlet比较

  1. 实际上,Filter只是在doFilter()方法里比Servlet多了个FilterChain类型的参数,该参数控制是否放行用户请求。
  2. 获取Filter初始化参数使用FilterConfig的getInitParameter()方法
  3. Filter和Servlet具有完全相同的生命周期
  4. Filter也可通过<init-param.../>或@WebFilter的initParams来配置初始化参数。代码片:
@WebFilter(
    filterName="log",
    urlPatterns={"/*"},
    initParams={
        @WebInitParam(name="encoding",value="GBK"),
        @WebInitParam(name="loginPage",value="/login.jsp")
    }
)
public class MyFilter implements Filter {
    //略.......
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6. 使用URL Rewrite实现网站静态

  1. 大部分搜索引擎优先考虑收录静态HTML页面,而不是这种动态的*.jsp、*.php页面
  2. 实现网站伪静态思路:通过Filter拦截所有发向*html的请求,然后将请求按某种规则forword(转发)到实际的*.jsp页面。
  3. 需要下载urlrewriterfilter-4.0.3.jar包
  4. web.xml中配置:
 <filter>
    <filter-name>UrlReWriterFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriterFilter</filter-class>
 </filter>

 <filter-mapping>
    <filter-name>UrlReWriterFilter</filter-name>
    <!-- 拦截所有的URL -->
    <url-pattern>/*</url-pattern>
 </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 在WEB-INF路径下添加一个urlrewrite.xml文件来定义伪静态映射规则:
<urlrewrite>
    <rule>
        <!-- 所有配置如下正则表达式的请求 -->
        <form>/userinf-(\w*).html</form>
        <!-- 转发到如下页面,$1代表上面第一个正则里所匹配的字符串 -->
        <to type="forword">/userinf.jsp?username=$1</to>
    </rule>
</urlrewrite>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

所以请求userinf-XXX.html页面都会转发到userinf.jsp页面。

版权声明:博主地址:http://blog.csdn.net/zcl_love_wx http://blog.csdn.net/zcl_love_wx/article/details/52027162
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`filter`是一个JavaScript数组方法,它可以用于过滤数组中的元素,返回一个新的数组,其中包含符合指定条件的元素。 具体来说,`filter`方法接受一个回调函数作为参数,该回调函数会被传递每个数组元素和它们的索引,并返回一个布尔值,用于指示该元素是否应该被包含在结果数组中。如果回调函数返回`true`,该元素将被包含在结果数组中,否则将被排除。 例如,假设有一个数组`[1, 2, 3, 4, 5]`,我们可以使用`filter`方法来过滤出其中的偶数元素: ```javascript const arr = [1, 2, 3, 4, 5]; const evenArr = arr.filter(num => num % 2 === 0); // evenArr === [2, 4] ``` 在上面的例子中,回调函数判断每个元素是否为偶数,如果是,则返回`true`,否则返回`false`,最终返回一个包含偶数元素的新数组。 除了过滤出符合条件的元素,`filter`方法还可以用于删除数组中的元素,例如: ```javascript const arr = [1, 2, 3, 4, 5]; arr.filter(num => num % 2 === 0); // 返回 [2, 4] // arr === [1, 3, 5] ``` 上面的代码过滤出了数组中的偶数元素并返回一个新数组,同时原数组中的奇数元素保持不变。 除了过滤出符合条件的元素,`filter`方法还可以用于删除数组中的元素,例如: ```javascript const arr = [1, 2, 3, 4, 5]; const oddArr = arr.filter(num => num % 2 !== 0); // oddArr === [1, 3, 5] ``` 在上面的例子中,回调函数判断每个元素是否为奇数,如果是,则返回`true`,否则返回`false`,最终返回一个包含奇数元素的新数组。 总之,`filter`方法是一个非常实用的数组方法,它可以用于过滤、删除和获取数组中符合条件的元素,可以提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值