文档章节

过滤器 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");
			}
		}
	}
}


© 著作权归作者所有

共有 人打赏支持
上一篇: cookie
下一篇: MySql安装问题
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
807
2
第七章 过滤器基础 Filter

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

陈嘻嘻哈哈
2015/11/04
0
0
Struts2 整合Sitemesh中,怎么在jsp中拿到actionerror中的值?

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

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

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

Circleblog
2016/07/21
933
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
6分钟前
0
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
33分钟前
2
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部