javaweb之Filter过滤器详解

快速入门
1、新建一个类,实现Filter接口
2、实现doFilter()方法,打印一句话,来证明能够进行拦截
3、在web.xml中进行配置(参照Servlet配置)
4、访问一个页面,看看能不能拦截

例子:

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;

public class UserFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 获取session对象,判断是否登录
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse res=(HttpServletResponse)response;
		HttpSession session = req.getSession();
		if(session.getAttribute("user")==null){
			// 非法访问,没有登录,跳转到登录页面
			session.setAttribute("error","非法访问");
			// 保存客户想要去的地址, 登录成功后则直接跳转,而不是到首页
			// 获取请求的地址, 包括工程名,但是不包括参数
			System.out.println(req.getRequestURI());
			// 获取请求的参数
			System.out.println("参数:" + req.getQueryString());
			// 获取当前项目的绝对路径,方法已过时,不推荐使用 推荐使用  request.getServletContext().getRealPath("")
			System.out.println(req.getRealPath(""));
			// 获取请求的地址, 但是不包括工程名和参数
			System.out.println(req.getServletPath());
			// 此方法需要在servlet 3.0的版本上使用, 开发的环境需要J2EE6 运行需要Tomcate7.0
			//System.out.println("request.getServletContext().getRealPath:" +request.getServletContext().getRealPath(""));
			String goURL=req.getServletPath();
			if(req.getQueryString()!=null){
				goURL += "?" + req.getQueryString();
			}
			System.out.println(goURL);
			session.setAttribute("goURL", goURL);
			res.sendRedirect(req.getContextPath() + "/login.jsp");
			System.out.println(req.getContextPath());
		}else{
			// 如果有下一个过滤器则跳转到下一个过滤器否则目标页面
			chain.doFilter(request, response);
		}
	}
}

在web.xml中进行配置

<filter>
  	<filter-name>userFilter</filter-name>
  	<filter-class>
  		cn.***.UserFilter
  	</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>userFilter</filter-name>
  	<url-pattern>/user/*</url-pattern>    <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> 
      <dispatcher>FORWARD</dispatcher> 
      <dispatcher>ERROR</dispatcher> 
      <dispatcher>INCLUDE</dispatcher>
  </filter-mapping>

四、Filter的应用场景
   通过对filter过滤器的了解,可以得知在以下三种情况下可以做些处理:
    1> 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。
  比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
    2> 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
  比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相  应的request.getParameter方法)。
    3> 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
  比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写
getOutputStream和重写getWriter方法。在类A内部中,将输出  内容缓存进ByteArrayOutputStream流中,然后在
chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行
压缩下。
五、Filter实现拦截的原理
    Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服
务器每次在调用web资源的service方法之前  (服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
六、Filter生命周期
    和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是

  1>在应用启动的时候就进行装载
Filter类(与Servlet的load-on-startup配置效  果相同)。

  2>容器创建好Filter对象实例后,调用init()方
法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

  3>当用户访问的资源正好被Filter的url-pattern拦截
时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调  用
doFilter方法(Filter对象常驻留Web容器了)。

  4>当应用服务被停止或重新装载了,则会执行Filter的destroy方
法,Filter对象销毁。
  注意:init方法与destroy方法只会直接一次。
七、Filter部署应用注意事项
   1> filter-mapping标签中servlet-name与url-pattern。
  Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应    Servlet的相关配置)。
  2> filter-mapping标签中dispatcher。
  指定过滤器所拦截的资源被 Servlet
容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多
个<dispatcher> 子元素  用来指定 Filter 对资源的多种调用方式进行拦截。

REQUEST:
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。
INCLUDE:
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:
如若在A.jsp页面page指令中指定了error属性=examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。

时间: 2024-12-11 14:50:54

javaweb之Filter过滤器详解的相关文章

Filter过滤器详解(转)

web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链. 优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请

Java 中的 Filter 过滤器详解

Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理.使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将

JavaWeb中filter的详解及应用案例

一:Filter介绍 Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链.它与Servlet的区别在于:它不能直接向用户生成响应.完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理. 二:Filter的几个用处 在HttpServletRequest到达

Shiro的Filter机制详解---源码分析

Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). 2, 为什么两个url规则都可以匹配同一个url,只执行第一个呢. 下面分别从这两个问题入手,最终阅读源码得到解答. 问题一解答 相同url但定义在不同的行,后面覆盖前面 如 /usr/login.do=test3 /usr/login.do=test1,test2 不会执行test3的filter

HTML5移动开发之路(35)——jQuery中的过滤器详解

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(35)--jQuery中的过滤器详解 1.基本过滤选择器 :first:last:not(selector) :selector匹配的节点之外的节点:even :偶数:odd :奇数:eq(index):gt(index) :比他大的 :lt(index) :比他小的 [html] view plain copy print? <html> <head> <script src=&quo

过滤器详解

过滤器详解 注:继承接口的过滤器需要先继承 FilterAttribute类才行 过滤器头部      [AttributeUsage(AttributeTargets.Method, AllowMultiple = true,Inherited=true)] (1)validOn使用按位"或"运算符组合的一组值,用于指示哪些程序元素是有效的.可以是:程序集.字段.事件.方法.模块.参数.属性.返回值.类型. (2)AllowMultiple 附加属性,它表示是否允许将定制特性的实例多

springboot扫描自定义的servlet和filter代码详解_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下: /** * Created by xiaxuan on 16/11/1. */ @WebFilter(urlPatterns = "/*",filterName="CharacterEncodeFilter", initParams={ @WebInitParam(name=&

angular-ngSanitize模块-linky过滤器详解

本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个链接没有被a标签嵌套,linky能把它找出来,然后给它加上a标签并且给a链接添加正确的href属性,还可以设置打开的方式(_blank,_self,等...). 它查找链接是根据这些关键词来的: http/https/ftp/mailto/,或者就直接是一个email地址. 下面来看栗子: html

JavaWeb的Filter过滤器

过滤器Filter 过滤器概述 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter"放行",那么会继承执行用户请求的Servlet:如果Filter不"放行",那么就不会执行用户请求的Servlet. 其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否