一、概述

过滤器是servlet的一个重要特性,它提供一种机制,允许在过滤器中,即可以修改浏览器的请求信息,也可以对服务器处理后的响应信息进行修改。

一个过滤器是一个实现了Filter接口的java类。其关键的的方法是:

void doFilter(ServletRequest req, ServletResponse resp,  FilterChain chain)

在该方法中可以做如下动作:

1)通过参数req可以获取请求信息,并可以修改请求信息。当然也可以不做任何事情。

2)调用参数chain的方法 chain.doFilter(req, resp); 就是将请求传递给下一个filter或请求的目的地处理。

如果不调用该方法,则该请求就被终止往下传递,这种情况下,应该在过滤器中产生应该返回到客户端的响应信息。

3)通过参数resp获取请求被处理的返回结果,可以修改这个返回结果。

注意,一个url请求可以被多个过滤器匹配到,这时会按照匹配的顺序逐个由这些过滤器处理。

上面这张图描写了一个请求被多个过滤器处理,直至响应的过程。

二、一个最简单的例子

在web.xml中配置如下的filter及其匹配规则如下:

  <filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.nau.MyFilter</filter-class>
</filter> <filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

上面的匹配规则,表示任意的url请求都会被匹配到MyFilter过滤器。
编写一个MyFilter.java类,代码如下

package com.nau;
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; public class MyFilter implements Filter { @Override
public void destroy() { } @Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
String url = ((HttpServletRequest) req).getRequestURI();
System.out.println("filter:" + url);
chain.doFilter(req, resp);
} @Override
public void init(FilterConfig arg0) throws ServletException { } }

启动web服务器,打开浏览器,输入各种url,会发现任何的资源请求都会被该filter拦截。只是该filter只是打印了一下url,并没干任何事。注意doFilter方法中最后一句一定不要忘了 chain.doFilter(req, resp); 否则请求被Filter处理后就没法往下继续传递处理了。

需要说明的是,在web.xml中配置过滤器的匹配规则时,通过<url-pattern>标签配置的url地址的匹配规则。如果想要与某个被请求的servlet相匹配。则描写方式是如下:

  <filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>ActionServlet</servlet-name>
</filter-mapping>

上面的规则表示,所有对ActionServlet的请求都会被匹配到MyFilter上,从而被该过滤处理。

三、Filter的一个应用场景案例

在需要权限管理的应用中,jsp和servlet等动态资源比较好鉴权,可以在其中直接编写相关代码进行权限检查。

但对于静态资源如html文件,如果希望鉴权,比如希望如果当前没有登录,则希望跳转到登录页面。那这该如何处理呢?

这就可以利用过滤器来处理。

在web.xml中可配置:

  <filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.nau.MyFilter</filter-class>
</filter> <filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>

上面的配置意思是所有的扩展名为 html的请求都会被MyFilter过滤器处理。处理器的代码如:

package com.nau;

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;
import javax.servlet.http.HttpSession; import com.zte.boot.entry.UserInfo;
import com.zte.boot.service.UserService; public class MyFilter implements Filter { @Override
public void destroy() { } @Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest)req;
HttpServletResponse httpResp = (HttpServletResponse)resp;
String appPath = httpReq.getContextPath();
//通过session检查是否存在当前用户
HttpSession session = httpReq.getSession(true);
String userid = (String)session.getAttribute("userid");
//如果不存在则重定向到登录页面
if (userid == null) {
httpResp.sendRedirect(appPath+"/login");
return;
}
//如果已经登录,则正常由后续流程处理
chain.doFilter(req, resp);
} @Override
public void init(FilterConfig arg0) throws ServletException { } }

四、小结

本文介绍了servlet的Filter的使用,并举了个鉴权的案例。

应用Filter除了编写过滤器代码外,还需要配置过滤器的匹配规则,这个与Servlet的匹配规则一样,

具体可参考文章 《servlet的url-pattern匹配规则详细描述》

servlet的filter的使用的更多相关文章

  1. Servlet、Filter、Listener、Interceptor

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...

  2. JSP中的Servlet及Filter

    asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类 ...

  3. servlet、filter、listener、interceptor之间的区别和联系

    一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...

  4. j2ee Servlet、Filter、Listener

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...

  5. Servlet、Filter 生命周期

    Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...

  6. 【Servlet】Filter过滤器的编写和配置

    Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...

  7. java web.xml listener servlet 和filter加载顺序

    在该项目中总会遇到一些关于加载的优先问题.最近遇到了同样的类别似的,所以,如果你发现信息汇总下,以下是转载其他一些人,毕竟,人们写的不错.它不重复创建的轮.只是略作修改自己的观点. 首先能够肯定的是, ...

  8. Servlet、Filter、Listener、Interceptor基础

    第一:Servlet Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹 ...

  9. 在Servlet(或者Filter,或者Listener)中使用spring的IOC容器

    web.xml中的加载顺序为:listener > filter > servlet > spring. 其中filter的执行顺序是filter-mapping在web.xml中出 ...

随机推荐

  1. SSIS: 使用最大ID和最大日期来增量更新表

    简单三步: 1.  新增变量 MaxID和MaxCreateDate以及Variable 2.  放置一个 Execute SQL  Task ,用SQL 来获取 MaxID和MaxCreateDat ...

  2. 在VS2010上使用C#调用非托管C++生成的DLL文件

    背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...

  3. ibatis缓存配置

    一.sqlmapconfig.xml <sqlMapConfig> <settings useStatementNamespaces="true"  cacheM ...

  4. Laravel OAuth2 (一) ---简单获取用户信息

    前言 本来要求是使用微信进行第三方登陆,所以想着先用 github 测试成功再用微信测试,可是最近拖了好久都还没申请好微信开放平台的 AppID ,所以就只写 github 的第三方登陆吧,估计微信的 ...

  5. win7和ubuntu双系统,win7时间晚8小时解决办法。

    装了Win7和Ubuntu双系统后发现,使用Ubuntu后再登陆win7时系统显示时间不准确,比实际时间晚了8小时. 搜索后发现原来Linux和Windows的系统时间管理是不同的.Linux是以主板 ...

  6. JS使用合并数组

    var arr= [4,5,6]; var arr1 = [7,8,9]; var arr2=[1,2,3]; arr.concat(arr1,arr2); //或者使用Arry.prototype. ...

  7. 基于visual Studio2013解决C语言竞赛题之0301函数求值

     题目 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <math.h> void main() ...

  8. IT第四天 - 运算符、随机数、Math类

    IT第四天 上午 运算符 1.%运算符的应用 2.运算符优先级:小括号 ! 算数运算符 关系运算符 && ||   赋值运算符 3.三元运算符:?表示条件为true的结果,:表示条件为 ...

  9. linux下的压缩解压命令 tar 的简单描述

    命令名称:tar 命令所在路径:/bin/tar 语法:tar选项·「-zcf」·「压缩后文件名」「目录」 -c 打包 -v 显示详细信息 -f 指定文件名 -z 打包同时压缩 tar命令解压缩语法: ...

  10. ZIOZIA_百度百科

    ZIOZIA_百度百科 ZIOZIA