过滤器生命周期
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根据Cookie自动登陆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.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 值 Enumerationenums = 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"); } } }}