文档章节

过滤器 Filter

chenruibing
 chenruibing
发布于 2015/06/16 21:51
字数 1321
阅读 87
收藏 2
点赞 0
评论 0
过滤器简介
  a)Filter是SUN公司提供的一个资源过滤器接口,不同的Web容器有着不同的实现
  b)Filter位于Web服务器和Web资源(Servlet/Jsp/Html)之间    过滤器可以多个,并不是只能有一个
  c)过滤请求和响应二者     过滤器的web.xml配置要放在servlet之前,但是他们的配置是很相似的
  d)Filter可以进行简单判段,是否将请求放行给Web资源
  e)Filter的开发过程:
    >>类 implements javax.servlet.Filter接口
        >>在web.xml文件配置Filter过滤器,告之Web服务器有过滤器的存在
        web.xml中的配置信息如下:
    <filter>
        <filter-name>FilterDemo1</filter-name>(过滤器,可以随意,但要和filter-mapping中的name一致)
        <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>(过滤器全路径)
        </filter>
        <filter-mapping>
        <filter-name>FilterDemo1</filter-name>(过滤器名,同上)
        <url-pattern>/*</url-pattern>(过滤器能够过滤的资源路径,不是用户在URL中访问的路径)
        </filter-mapping>
 
过滤器链
  a)一个Web应用可以有0个或多个Filter,多个Filter的组合就是过滤器链
  b)多个Filter的执行先后顺序,与web.xml文件中配置的顺序有关
  c)chain.doFilter(request,response)具有二义性:  A->C->D->B
    >>如果有下一个Filter时,将请求转发给下一个Filter
        >>如果无下一个Filter时,将请求转发给Web资源(serlvet/jsp/html)
  d)可以将web资源中的一些公共代码,提取出来,放入Filter中   
    放在那个Filter都是一样的效果,但是不管放在那个Filter,都一定要放在调用方法之前,要不就被忽略了,所以Filter开发的位置非常重要
     在  <url-pattern>/*</url-pattern>  这里配置对什么web资源进行过滤拦截


过滤器生命周期   

destory->空参->init->doFilter       但发现在前面有用过Filter,要删除 ,所以要先destory

  空参构造() 1次
  init() 1次
  doFilter(请求,响应,过滤器链) N次,与请求次数有关
  destory() 1次
  Filter是一个单例


过滤器应用:

对form表单的请求参数进行处理+在web.xml中配置初始化参数

配置后以后如果再写servlet,只要是post请求,都遵循这个规则,不需要每个serlvet都进行设置

  <filter>
  	<filter-name>FilterDemo3</filter-name>
  	<filter-class>cn.itcast.web.filter.FilterDemo3</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>FilterDemo3</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
package cn.itcast.web.filter;

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//针对POST请求和响应的编码方式处理
public class FilterDemo4 implements Filter {
	private FilterConfig filterConfig;
	public FilterDemo4(){
	}
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;  //代表初始化参数的对象
	}
	//Web容器调用
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
		String encoding = filterConfig.getInitParameter("encoding"); //获取在web中配置的初始化参数
		//POST请求编码设置
		request.setCharacterEncoding(encoding);
		//响应编码设置
		response.setContentType("text/html;charset="+encoding);
		chain.doFilter(request,response);
	}
	public void destroy() {
	}
}

Filter的案例

所有动态资源都不缓存,例如jsp等,所以静态资源就缓存一定时间

package cn.itcast.web.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.HttpServletResponse;

//禁止浏览器缓存动态资源,例如JSP资源
public class FilterDemo5 implements Filter {
	private FilterConfig filterConfig;
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}
	public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {

		//NO将父子接口强转
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		
		//NO1取得客户端访问的资源的URI,形式/day19/login.jsp
		String uri = request.getRequestURI();
		
		//NO2判段是否以jsp结尾,即动态资源
		if(uri!=null && uri.endsWith("jsp")){
			//NO3如果是动态资源,设置三个响应头通知浏览器不缓存
			response.setHeader("expires","-1");
			response.setHeader("cache-control","no-cache");
			response.setHeader("pragma","no-cache");
		}else if(uri!=null && uri.endsWith("html")){
			//NO4如果是静态资源,缓存一定的时间
			String strHtml = filterConfig.getInitParameter("html");//86400
			long time = System.currentTimeMillis()+Integer.parseInt(strHtml)*1000;
			//time为毫秒值
			response.setDateHeader("expires",time); //毫秒
			response.setHeader("cache-control",time/1000+""); //秒
			response.setHeader("pragma",time/1000+""); //秒
		}
		
		//NO5放行资源
		chain.doFilter(request,response);
	}
	public void destroy() {
	}
}
获取所有的初始化参数 key 值
package cn.itcast.web.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//单例
public class FilterDemo3 implements Filter {
	private FilterConfig filterConfig;
	public FilterDemo3(){
	}
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}
	//Web容器调用
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
		// 获取所有的初始化参数 key 值
		Enumeration<String> enums = filterConfig.getInitParameterNames();
		while(enums.hasMoreElements()){
			String key = enums.nextElement();
			String value = filterConfig.getInitParameter(key);
			System.out.println(key+":"+value);
		}
		//根据 key 获取初始化参数值
		String encoding = filterConfig.getInitParameter("encoding");
		response.setContentType("text/html;charset="+encoding);
		chain.doFilter(request,response);
	}
	public void destroy() {
	}
}
根据Cookie自动登陆
package cn.itcast.web.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//单例
public class FilterDemo3 implements Filter {
	private FilterConfig filterConfig;
	public FilterDemo3(){
	}
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}
	//Web容器调用
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
		// 获取所有的初始化参数 key 值
		Enumeration<String> enums = filterConfig.getInitParameterNames();
		while(enums.hasMoreElements()){
			String key = enums.nextElement();
			String value = filterConfig.getInitParameter(key);
			System.out.println(key+":"+value);
		}
		//根据 key 获取初始化参数值
		String encoding = filterConfig.getInitParameter("encoding");
		response.setContentType("text/html;charset="+encoding);
		chain.doFilter(request,response);
	}
	public void destroy() {
	}
}


package cn.itcast.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//用户自动登录
public class LoginServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		if(username!=null && password!=null && username.trim().length()>0 && password.trim().length()>0){
			if(username.equals("jack") && password.equals("123")){
				//登录成功,将信息绑定到HttpSession域对象中      存放个人信息
				request.getSession().setAttribute("username",username);
				request.getSession().setAttribute("password",password);
				//向浏览器写入Cookie
				Cookie cookie = new Cookie("usernameAndPassword",username+"_"+password);
				int time = Integer.parseInt(request.getParameter("time"));
				cookie.setMaxAge(time);
				response.addCookie(cookie);
				//重定向到welcome.jsp页面
				response.sendRedirect(request.getContextPath()+"/welcome.jsp");
			}
		}
	}
}


© 著作权归作者所有

共有 人打赏支持
chenruibing
粉丝 12
博文 201
码字总数 109101
作品 0
潮州
Servlet过滤器,Servlet过滤器创建和配置

第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法。 第一方法是过滤器中的init()方法用于对过滤器的初始值进行处理,第二...

别叫小伙 ⋅ 2016/10/13 ⋅ 0

Filter(过滤器)

Filter简介: 可以使用户改变一个Request和修改一个Response,Filter不是Servlet,他不能产生一个Response。但他能够在Request到达Servlet之前预处理Request,也可以在离开Request时处理Res...

晨曦之光 ⋅ 2012/05/16 ⋅ 2

Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值?

Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值呢?表单的值能注入到action中,但在jsp页面中拿不到actionerror的值。是web.xml的配置问题,还是....? 下面是web.xml文件的配置...

空云万里晴 ⋅ 2012/04/06 ⋅ 2

第七章 过滤器基础 Filter

简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter)。WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行...

陈嘻嘻哈哈 ⋅ 2015/11/04 ⋅ 0

HBase–常用过滤器篇

比较过滤器 (1) 比较过滤器的操作符 LESS < LESSOREQUAL <= EQUAL = NOT_EQUAL <> GREATEROREQUAL >= GREATER > NO_OP 排除所有 (2) 常用比较过滤器的比较器 BinaryComparator 按字节索引顺序......

Circleblog ⋅ 2016/07/21 ⋅ 0

JAVA_web_filter

什么是filter? filter 翻译为过滤器;在处理一个事物的时候进行提前处理一些事情; 什么时候用filter? 在client request service的时候对request做预处理; 在service response client的时...

天呀鲁哇 ⋅ 2015/02/10 ⋅ 0

spring security2.X 添加验证码

ps:这个是spring security 2.x适用! 如何搭建struts2+hibernate+spring+spring security ,可以看我以前写的一篇文章:http://my.oschina.net/BeyondBit/blog/64465 今天我们来介绍一下sprin...

Beyond-Bit ⋅ 2013/02/18 ⋅ 0

过滤器(Fileter)执行流程

Servlet过滤器的概念: Servlet过滤器是在 java Servlet 2.3 中定义的,它能够对Servlet容器中的请求和响应对象,进行检查和修改 Servlet过滤器并不会生成request和response对象,它只起到过...

狼行-狼行 ⋅ 2013/11/22 ⋅ 0

Servlet过滤器工作过程

Servlet过滤器工作过程 需注意,Filter不是一个Servlet,它不能产生一个response,它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。 将多个过滤器组成...

秋风醉了 ⋅ 2014/10/01 ⋅ 0

spring DelegatingFilterProxy管理过滤器(转)

安全过滤器链 Spring Security的web架构是完全基于标准的servlet过滤器的。它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有与任何特定的web技术强行关联...

blooms ⋅ 2012/09/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 23分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部