过滤器 Filter
过滤器 Filter
chenruibing 发表于2年前
过滤器 Filter
  • 发表于 2年前
  • 阅读 82
  • 收藏 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");
			}
		}
	}
}


共有 人打赏支持
粉丝 11
博文 201
码字总数 109101
×
chenruibing
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: