JavaWeb Filter浅析

一、Filter简介

Filter,过滤器,用于在servlet以外对request 和response 进行修改。Filter 有一个 FilterChain 的概念,一个FilterChain 包括多个 Filter。客户端请求 request在抵达servlet 以前,会通过 FilterChain 里面全部的 Filter,服务器响应 response 从servlet抵达客户端浏览器以前也会通过 FilterChain 里面全部的 Filter 。java

过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件以前,经过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也能够对响应进行过滤,拦截或修改响应。
如下是一张经典的过滤器链示意图:浏览器

二、Filter应用场景

Filter通常用于:登陆权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换、压缩响应信息等操做,便于代码重用,没必要每一个servlet中还要进行相应的操做。服务器

三、Filter实现步骤

自定义一个Filter须要实现如下操做:编码

​ a.建立一个类实现javax.servlet.Filter接口;url

​ b.实现doFilter()方法;code

​ c.配置blog

四、Filter实例

如下是一个简单的filter demo接口

@WebFilter(urlPatterns = "/myServlet2", initParams = {@WebInitParam(name = "username", value = "MyFilter")})
public class MyFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("---------doFilter-----------");
        System.out.println(req.getServletContext().getInitParameter("username"));
        resp.getWriter().println("---------doFilter-----------");
        chain.doFilter(req, resp);
        System.out.println("---------doFilter------over-----");
    }

    //filter初始化方法,经过FilterConfig能够获取到filter配置的初始化参数
    public void init(FilterConfig config) throws ServletException {
        Enumeration<String> parameters = config.getInitParameterNames();
        while (parameters.hasMoreElements()) {
            String element = parameters.nextElement();
            System.out.println(element + " = " + config.getInitParameter(element));
        }

    }

}

能够看到,filter是在容器启动的时候就初始化的。utf-8

五、Filter应用举例

5.一、设置字符编码集

@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("gbk");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

5.二、权限校验

@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String username = (String) req.getParameter("username");
        if (!"张三".equals(username)) {
            resp.getWriter().println("--------权限不足,没法访问---------");
            return;
        }
        chain.doFilter(req, resp);

    }

    public void init(FilterConfig config) throws ServletException {

    }

}


相关文章
相关标签/搜索