zoukankan      html  css  js  c++  java
  • filter的基本介绍和使用

    简介

       过滤器是处在客户端和服务器资源之间的一到过滤网,我们可以根据具体的需求来对请求头和数据就行预处理,也可以对响应头和和数据进行后处理。例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能

    生命周期

       filter的创建和销毁都是有服务器负责的。web服务器在启动时,创建filter实例对象,并调用其init方法,读取web.xml的配置,完成对象的初始化工作,为后续的用户请求做好拦截的准备工作。开发人员通过init方法的参数可以获取代表当前filter信息的FilterConfig对象。

    注意事项

    • init,detroy方法都是执行一次。在服务器启动时会执行init方法,初始化数据;在服务器停止前会执行detroy方法,释放filter所占用的资源。
    • 多个filter有执行顺序,执行顺序就是filter在web.xml中的配置顺序
    • 一个filter可以对应多个filter-mapping

    使用场景

       登录权限,编码设置,页面缓存,响应数据压缩

    基本使用

    • 先配置web.xml
    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>com.action.login.SessionFilter</filter-class>
        <init-param>
            <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 -->
            <param-value>/project/index.jsp;login.do</param-value>
        </init-param>
        <init-param>
            <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 -->
            <param-value>.do;.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->
            <param-value>/index.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>disabletestfilter</param-name><!-- Y:过滤无效 -->
            <param-value>N</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    • filter类代码
    package com.action.login;
    
    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;
    import javax.servlet.http.HttpServletResponseWrapper;
    
    /**
     *    判断用户是否登录,未登录则退出系统
     */
    public class SessionFilter implements Filter {
    
        public FilterConfig config;
    
        public void destroy() {
            this.config = null;
        }
    
        public static boolean isContains(String container, String[] regx) {
            boolean result = false;
    
            for (int i = 0; i < regx.length; i++) {
                if (container.indexOf(regx[i]) != -1) {
                    return true;
                }
            }
            return result;
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest hrequest = (HttpServletRequest)request;
            HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
    
            String logonStrings = config.getInitParameter("logonStrings");        // 登录登陆页面
            String includeStrings = config.getInitParameter("includeStrings");    // 过滤资源后缀参数
            String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 没有登陆转向页面
            String disabletestfilter = config.getInitParameter("disabletestfilter");// 过滤器是否有效
    
            if (disabletestfilter.toUpperCase().equals("Y")) {    // 过滤无效
                chain.doFilter(request, response);
                return;
            }
            String[] logonList = logonStrings.split(";");
            String[] includeList = includeStrings.split(";");
    
            if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 只对指定过滤参数后缀进行过滤
                chain.doFilter(request, response);
                return;
            }
    
            if (this.isContains(hrequest.getRequestURI(), logonList)) {// 对登录页面不进行过滤
                chain.doFilter(request, response);
                return;
            }
    
            String user = ( String ) hrequest.getSession().getAttribute("useronly");//判断用户是否登录
            if (user == null) {
                wrapper.sendRedirect(redirectPath);
                return;
            }else {
                chain.doFilter(request, response);
                return;
            }
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
            config = filterConfig;
        }
    }
    

      

     

  • 相关阅读:
    迁移数据到历史表,减少业务表中数据压力 Mysql
    windows server tomcat服务器部署内存占用高问题
    MySQL基于左右值编码的树形数据库表结构设计
    windows server 远程桌面连接问题。
    mysql数据库 ,java 代码巧妙结合提升系统性能。
    用户管理
    组管理命令--groupadd.groupmod.groupdel.gpasswd
    用户管理命令--passwd,usermod,userdel
    用户管理命令--useradd
    用户管理文件
  • 原文地址:https://www.cnblogs.com/htyj/p/8991970.html
Copyright © 2011-2022 走看看