博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
过滤器 Filter
阅读量:2396 次
发布时间:2019-05-10

本文共 7500 字,大约阅读时间需要 25 分钟。

过滤器简介
  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都进行设置

  
FilterDemo3
cn.itcast.web.filter.FilterDemo3
encoding
UTF-8
FilterDemo3
/*
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
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
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");			}		}	}}

转载于:https://my.oschina.net/u/2356176/blog/467535

你可能感兴趣的文章
Linux网络资源
查看>>
Android对Kernel的改动汇总
查看>>
WGET 通过代理下载
查看>>
JITTER BUFFER
查看>>
IP协议报头学习笔记
查看>>
关于SIGPIPE导致的程序退出
查看>>
基于MTD的NAND驱动开发
查看>>
linux mtd源码分析(好东西)
查看>>
关于SIGBUS的总结
查看>>
JSP--9大隐式对象
查看>>
Servelt中主要对象的使用
查看>>
EL表达式的深刻认识
查看>>
JSP技术的学习总结
查看>>
JavaBean的初步认知
查看>>
重识java反射
查看>>
Spring的核心中IOC、DI
查看>>
Spring中注解的使用
查看>>
Spring的认识
查看>>
maven项目出现如下错误,求指点;CoreException: Could not calculate build plan:
查看>>
理解Paxos算法的证明过程
查看>>