好久没写日志了,先在在温习Struts2,涉及到Filter,顺便在网上找到了一些Filter的简介,就顺便写点心得。
可以说Filter类似于servlet,但它与servlet又有本质的区别,Filter不能像servlet那样直接对用户生成响应。Filter完整的工作流程:Filter先对用户请求进行预处理,然后交给servlet进行处理并生成用户响应,最后Filter再对服务器响应进行后处理。
Filter有以下几大好处:
- 可以在HttpServletResquest到达servlet之前,拦截客户的HttpServletRequest。
- 根据用户需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
- 在HttpServletResponse到达客户端之前拦截HttpServletResponse。
- 可以根据需要检查HttpServletResponse,并修改HttpServletResponse头和数据。
Filter种类:
- 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
- 日志Filter:详细记录有些用户的特殊请求。
- 能改变xml内容的XSLT Filter等。
Filter可负责拦截一个或多个请求或响应,一个请求或响应也可以同时被多个Filter拦截。
创建一个Filter有两步:建Filter处理类;web.xml配制。
创建Filter类:
创建Filter类必须实现javax.servlet.Filter接口,该接口定义了三个方法:
- void init(FilterConfig config);负责初始化
- void destroy();负责Filter销毁前完成回收资源等操作
- void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain chain);处理过滤功能。
先介绍一个简单的Filter应用,用于拦截所有用户的请求并将请求记录在日志中。
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class FilterImpl implements Filter {
private FilterConfig config;
public void destroy() {
// 实现销毁方法
this.config=null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 实现过滤的核心方法
ServletContext context=this.config.getServletContext();
long before=System.currentTimeMillis();
System.out.println("filter start.....");
HttpServletRequest hrequest=(HttpServletRequest)request;
context.log("Filter has received the user's url:"+hrequest.getServletPath());
chain.doFilter(request,response);
long after=System.currentTimeMillis();
context.log("filter over...");
context.log("request被定位到"+hrequest.getRequestURI()+"所花费的时间为:"+(after-before));
}
public void init(FilterConfig config) throws ServletException {
// 实现初始化方法
this.config=config;
}
}
web.xml配制:
<filter>
<filter-name>log</filter-name>
<filter-class>com.filter.FilterImpl</filter-class>
</filter>
<filter-mapping>
<filter-name>log</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最终控制器窗口的实验结果:
filter start.....
2010-5-3 14:03:26 org.apache.catalina.core.ApplicationContext log
信息: Filter has received the user's url:/index.jsp
2010-5-3 14:03:28 org.apache.catalina.core.ApplicationContext log
信息: filter over...
2010-5-3 14:03:28 org.apache.catalina.core.ApplicationContext log
信息: request被定位到/FilterDemo/index.jsp所花费的时间为:1360
再来介绍一个功能稍微强大而且使用范围比较广的Filter类。该Filter用于设置request编码的字符集,从而避免每个Servlet都要设置;而且还会验证用户是否已经登录,如果没有登录将直接跳转到登录页面。
下面是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.HttpSession;
public class AuthorityFilter implements Filter {
private FilterConfig config;
public void destroy() {
this.config=null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encoding=config.getInitParameter("encoding");
String loginPage=config.getInitParameter("loginPage");
String proLogin=config.getInitParameter("proLogin");
request.setCharacterEncoding(encoding);
HttpServletRequest requ=(HttpServletRequest)request;
HttpSession session=requ.getSession(true);
String requestPath=requ.getServletPath();
if(session.getAttribute("user")==null
&&!requestPath.endsWith(loginPage)
&&!requestPath.endsWith(proLogin)){
System.out.println("cunge.........");
request.getRequestDispatcher(loginPage).forward(request, response);
}else{
chain.doFilter(request, response);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config=filterConfig;
}
}
web.xml配制如下:
<filter>
<filter-name>authority</filter-name>
<filter-class>com.filter.AuthorityFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>proLogin</param-name>
<param-value>/proLogin.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上面的web.xml为Filter类制定了三个配制参数。
分享到:
相关推荐
Vue filter介绍及其使用 VueJs 提供了强大的过滤器API,能够对数据进行各种过滤处理,返回需要的结果。 Vue.js自带了一些默认过滤器例如: capitalize 首字母大写 uppercase 全部大写 lowercase 全部小写 currency ...
本篇文章主要介绍了Vue filter介绍及其使用详解,VueJs 提供了强大的过滤器API,能够对数据进行各种过滤处理。一起跟随小编过来看看吧
NDIS Filter Drivers编写介绍 总共4个pdf,介绍了NDIS6下Filter Driver的用法。是NDIS5下PassThru的替代
MDN filter介绍 filter CSS属性将模糊或颜色偏移等图形效果应用于元素。滤镜通常用于调整图像,背景和边框的渲染。 CSS标准里包含了一些已实现预定义效果的函数。你也可以参考一个SVG滤镜,通过一个URL链接到SVG滤镜...
该资源是卡尔曼滤波(Kalman Filter)原理,内含实例代码,看了众多文章后,自己的理解。实例一个鼠标跟踪程序。
java中filter的用法(过滤器),介绍各种过滤方法
《电子滤波器设计》作为一本全面介绍电子滤波器设计的经典书籍,内容包括如何选择滤波器的响应曲线,低通、高通、带通及带阻滤波器的设计,LC滤波器的设计,数字滤波器设计,有限冲激响应滤波器设计,无限冲激响应...
介绍Bloom Filter(布隆过滤器)原理、实现及具体应用,包含9个不同PPT及PDF文档资料,对Bloom Filter感兴趣、想学习的同学可以下载查看下
叙述了MATLAB中几种相关函数的用法,对filter conv 和impz函数进行了介绍
筛选器Filter场景案例
j2ee Filter使用原理本代码里面首先是介绍了Filter实现的原理,然后模拟的了j2ee项目中Filter的使用原理,然后由此又延伸了Struts2的Interceptor实现原理,并且给予了详细的注释。
主要介绍matlab 中filter的设计及对信号滤波前后的对比过程。
主要介绍了Spring Boot使用Servlet及Filter过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
介绍如何在j2ee下的web应用,合理使用filter技术
本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证
3.初期(基本bloom filter介绍): 为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素...
详尽地介绍了JSP中Filter的使用方法,欢迎下载本资源,谢谢
主要介绍了SpringBoot拦截器Filter的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
详细地介绍如何使用TI公司的FilterPro。希望对你有所帮助!