过滤器属于Servlet规范,从2.3版本就开始有了。html
过滤器就是对访问的内容进行筛选(拦截)。利用过滤器对请求和响应进行过滤缓存
诞生:过滤器的实例是在应用被加载时就完成的实例化,并初始化的。 存活:和应用的生命周期一致的。在内存中是单例的。针对拦截范围内的资源访问,每次访问都会调用void doFIlter(request,response.chain)进行拦截。 死亡:应用被卸载。
public class FilterDemo1 implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //对请求进行拦截,代码写在这里 System.out.println("过滤前"); chain.doFilter(request, response);//放行,访问过滤文件 //对响应进行拦截,代码写在这里 System.out.println("过滤后"); } public void init(FilterConfig arg0) throws ServletException { System.out.println("初始化方法"); } public void destroy() { } }
public class SetCharacterEncodingFilter implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String encoding = filterConfig.getInitParameter("encoding");//用户可能忘记了配置该参数 if(encoding==null){ encoding = "UTF-8";//默认编码 } request.setCharacterEncoding(encoding);//只能解决(表单提交)POST请求参数的中文问题 response.setCharacterEncoding(encoding);//输出流编码 response.setContentType("text/html;charset="+encoding);//输出流编码,通知了客户端应该使用的编码 chain.doFilter(request, response); } public void destroy() { } }
//控制servlet,jsp不要缓存过滤器 public class NoCacheFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // HttpServletRequest request = (HttpServletRequest)req; // HttpServletResponse response = (HttpServletResponse)resp; HttpServletRequest request = null; HttpServletResponse response = null; try{ request = (HttpServletRequest)req; response = (HttpServletResponse)resp; }catch(Exception e){ throw new RuntimeException("not-http request or response"); } response.setHeader("Expires", "-1"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); chain.doFilter(request, response); } public void destroy() { } }