文档章节

过滤器 Filter

chenruibing
 chenruibing
发布于 2015/06/16 21:51
字数 1321
阅读 87
收藏 2
过滤器简介
  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
博文 203
码字总数 109101
作品 0
潮州
Servlet过滤器,Servlet过滤器创建和配置

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

别叫小伙
2016/10/13
0
0
Filter(过滤器)

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

晨曦之光
2012/05/16
797
2
Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值?

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

空云万里晴
2012/04/06
985
2
HBase–常用过滤器篇

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

Circleblog
2016/07/21
933
0
第七章 过滤器基础 Filter

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

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高三暑假我是怎么想开去学linux系统的

高三的时候,我有一句口头禅:“老了老了,现在做题越来越迟钝了”。当时整天日夜苦读,体重日益增加,脸色越来越黯淡,我在终于熬过了高考的时候,简直心里面乐得开了花。我终于可以去做自己...

linuxprobe16
24分钟前
0
0
Python 获得命令行参数的方法

需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2]

编程老陆
31分钟前
0
0
链队

队列用链表来表示时,需要用两个变量来记录队列两端的变化:theFront,theBack. 根据链接方向的不同,链队有两种链接方式(其实就是链表的头插入节点和尾插入节点,头删除节点和尾删除节点)。...

Frost729
35分钟前
0
0
IDEA toString() json模板

public java.lang.String toString() {java.lang.StringBuilder builder = new java.lang.StringBuilder();#set ($i = 0)#foreach ($member in $members)#if ($i == 0)builder.appen......

Mtok
45分钟前
0
0
Dubbo内核实现之SPI简单介绍

Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLo...

明理萝
49分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部