过滤器

  • 过滤器属于Servlet规范,从2.3版本就开始有了。

  • 过滤器就是对访问的内容进行筛选(拦截)。利用过滤器对请求和响应进行过滤
    图片描述


过滤器执行过程

图片描述

生命周期

诞生:过滤器的实例是在应用被加载时就完成的实例化,并初始化的。
存活:和应用的生命周期一致的。在内存中是单例的。针对拦截范围内的资源访问,每次访问都会调用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() {

    }

}

SportCloud
157 声望9 粉丝

数据仓库


« 上一篇
JDBC

引用和评论

0 条评论