美文网首页
8、Filter过滤器

8、Filter过滤器

作者: bigpeng个人博客 | 来源:发表于2021-04-15 14:22 被阅读0次

    1、什么是过滤器?

    Filter也称之为过滤器。Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、设置统一编码格式等一些高级功能。

    2、Filter的工作原理

    filter工作原理.jpg
    • 客户端发起请求
    • web容器(tomcat)接受到请求后会到web.xml中查找是否有配置过滤器。如果有则进入过滤器
    • 执行过滤器的doFilter方法。
    • 执行过滤器前半段请求处理。
    • 执行FilterChain.doFilter()放行
    • 执行过滤器的后半段响应处理

    3、Filter 怎么写?
    实现Filter接口,该接口有三个方法,分别为:

    • init(FilterConfig) 初始化
    • doFilter()过滤处理方法
    • destory()销毁方法
    1. 写Filter 类
    /**
     * 登录过滤器
     */
    public class LoginFilter implements Filter {
        //不过滤的请求
        private String [] excludeUrl;
        //过滤的请求
        private String[] filterUrl;
        //跳转的页面
        private String redirectUrl;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            excludeUrl=filterConfig.getInitParameter("excludeUrl").split(";");
    //        filterUrl=filterConfig.getInitParameter("filterUrl").split(";");
            redirectUrl=filterConfig.getInitParameter("redirectUrl");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request=(HttpServletRequest) servletRequest;
            HttpServletResponse response=(HttpServletResponse) servletResponse;
            User user=(User) request.getSession().getAttribute("user");
    
            String uri=request.getRequestURI();
            System.out.println("uri="+uri);
            //如果用户存在,则放行
            if(user!=null||StringUtils.contains(uri,excludeUrl)){
                filterChain.doFilter(request,servletResponse);
            }else{
                //跳转页面
                response.sendRedirect(request.getContextPath()+redirectUrl);
            }
        }
    
    
        @Override
        public void destroy() {
            System.out.println("登录过滤器销毁");
        }
    
    

    2)在web.xml中配置Filter

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <filter>
            <filter-name>encodeFilter</filter-name>
            <filter-class>filter.EncodeFilter</filter-class>
            <init-param>
                <param-name>encode</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        
        <filter-mapping>
            <filter-name>encodeFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <filter>
            <filter-name>loginFilter</filter-name>
            <filter-class>filter.LoginFilter</filter-class>
            <init-param>
                <param-name>excludeUrl</param-name>
                <param-value>/login.jsp;/index.jsp;/login</param-value>
            </init-param>
            <init-param>
                <param-name>redirectUrl</param-name>
                <param-value>/index.jsp</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>loginFilter</filter-name>
            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>
    
    
    </web-app>
    

    Filter应用

    • 登录验证
    • 过滤敏感词汇
    • 编码格式统一设置

    @WebFilter(filterName = "FImgCacheilter",value = {".jpg",".png",".bmp",".html",".css",".js"})
    public class FImgCacheilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
    
        //将浏览器缓存设置为10分钟
        response.setDateHeader("Expires",System.currentTimeMillis()+600000);
        //cache-control :
        //           max-age>0 时 直接从游览器缓存中 提取
        //           max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改
        //有的话 返回200 ,无的话 返回304。
        //
        //通俗解释:
        //    响应头中的Cache-Control:max-age=600是通知浏览器:600秒之内不要烦我,自己从缓冲区中刷新。
        response.setHeader("Cache-control","max-age=600");
        chain.doFilter(req, resp);
    }
    
    public void init(FilterConfig config) throws ServletException {
    
    }
    

    }

    相关文章

      网友评论

          本文标题:8、Filter过滤器

          本文链接:https://www.haomeiwen.com/subject/qfozuftx.html