servlet的filter的使用
一、概述
过滤器是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的使用的更多相关文章
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
- JSP中的Servlet及Filter
asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类 ...
- servlet、filter、listener、interceptor之间的区别和联系
一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...
- j2ee Servlet、Filter、Listener
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...
- Servlet、Filter 生命周期
Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...
- 【Servlet】Filter过滤器的编写和配置
Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...
- java web.xml listener servlet 和filter加载顺序
在该项目中总会遇到一些关于加载的优先问题.最近遇到了同样的类别似的,所以,如果你发现信息汇总下,以下是转载其他一些人,毕竟,人们写的不错.它不重复创建的轮.只是略作修改自己的观点. 首先能够肯定的是, ...
- Servlet、Filter、Listener、Interceptor基础
第一:Servlet Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹 ...
- 在Servlet(或者Filter,或者Listener)中使用spring的IOC容器
web.xml中的加载顺序为:listener > filter > servlet > spring. 其中filter的执行顺序是filter-mapping在web.xml中出 ...
随机推荐
- Maven导入时,Cannot change version of project facet Dynamic Web Module to 3.0.
今天手贱,在eclipse里面把项目删掉了,重新maven导入时,报出Cannot change version of project facet Dynamic Web Module to 3.0. ...
- excel条型图示例
不怎么用这个功能,今天同事问我,研究了半天,有的地方还是有糊涂的地方,网上,书上都介绍的比较少.比如一张表里没有数据内容时,形成表时会有问题.但形成表后,再删除单元格数据,表却没有问题. 有点矛盾.
- linux驱动调试--段错误之oops信息分析
linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...
- 对面向对象的理解—— SAP电面(1)
对于C++面向对象的理解 面向对象是在结构化设计方法出现很多问题的情况下应运而生的.结构化设计方法求解问题的基本策略是从功能的角度审视问题域.它将应用程序看成实现某些特定任务的功能模块,其中子过程是实 ...
- .NET中DLL“没有可放置在工具箱的组件”—FreeTextBox
主要针对在VS2012.VS2013的工具箱中,通过“选择项”添加自定义的Dll,如.NET类型时,出现“没有可放置在工具箱的组件”问题的常见解决方案.例如在线编辑工具:FreeTextBox 解决方 ...
- ASP.NET jQuery 随笔 显示CheckBoxList成员选中的内容
通过jQuery来获取CheckBoxList成员内容. <%@ Page Language="C#" AutoEventWireup="true" Co ...
- kinect for windows - DepthBasics-D2D详解之一
Depth在kinect中经常被翻译为深度图,指的是图像到摄像头的距离,这些距离数据能让机器知道物理距离有多远.kinect通过两个红外摄像头来实现这个功能的.在这个例子里,就实现了深度图的提取和现实 ...
- BZOJ 1610: [Usaco2008 Feb]Line连线游戏
1610: [Usaco2008 Feb]Line连线游戏 Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 &l ...
- 响应式Web图形篇 —— icon fonts 的探析及应用
前言 像素完美(Pixel Perfection).分辨率无关(Resolution Independent)和多平台体验一致性是设计师们的追求. 可访问性(Accessability).加载性能和重 ...
- IOS算法(三)之插入排序
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其keyword大小插入到前面已经排好序的子序列中的适当位置,直到所有记录插入完毕为止. 设数组为a[0-n-1]. ...