美文网首页
Java Web之过滤器

Java Web之过滤器

作者: MVBin | 来源:发表于2017-05-23 11:06 被阅读49次

    知识点

    1、 含义:过滤器是指对客户端向服务器端的web目标资源发出的请求,以及服务器端所做出的响应进行截取并处理。
    2、 生命周期:①实例化(Web容器在部署Web应用程序时对所有过滤器进行实例化,也就是调用过滤器的构造方法)②初始化(实例化完成后立马对其进行初始化,也就是调用过滤器的init())③工作(也就是进行过滤URL,调用过滤器的doFilter())④销毁(web容器关闭时调用过滤器的destroy())
    3、 分类:①request过滤器(过滤重定向请求,至少进行两次请求,两次响应,默认的过滤方式)②forward过滤器(过滤请求转发,进行一次请求,一次响应)③include过滤器(针对jsp页面的<jsp:include></jsp:include>里的路径进行过滤)④error过滤器(过滤web.xml文件中的<error-page></error-page>里的路径进行过滤)⑤async过滤器(异步过滤器)

    字符编码过滤器

    首先,在web.xml文件中进行过滤器的配置

    <filter>
        <!-- 过滤器的名字 -->
        <filter-name>encodingFilter</filter-name>
        <!-- 过滤器类的完全限定名-->
        <filter-class>com.mvbin.filter.CharacterEncodingFilter</filter-class>
        <!-- 过滤器类的初始化参数 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>   
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <!-- 过滤器要过滤的请求路径:/* 表示过滤所有路径 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    其次,编写过滤器类的代码,过滤器继承javax.servlet.Filter,并实现其三个方法

    import *****;
    
    //字符过滤器类
    public class CharacterEncodingFilter implements Filter {
    
        private String encoding;
    
        //过滤器的销毁方法,在web容器关闭时执行
        @Override
        public void destroy() {
    
        }
    
        //过滤器真正的核心方法,在这里对响应的请求进行过滤处理
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            //将所有的请求的编码格式转化为UTF-8
            request.setCharacterEncoding(encoding);
            //调用FilterChain的doFilter方法,进行放行
            chain.doFilter(request, response);
        }
    
        //过滤器的初始化方法,在web容器启动时进行执行
        @Override
        public void init(FilterConfig config) throws ServletException {
            //通过FilterConfig的getInitParameter方法获取web.xml中配置的初始化参数
            this.encoding = config.getInitParameter("encoding");
            System.out.println("init: " + encoding);
        }
    }
    

    验证是否登录过滤器

    首先,web.xml文件中进行配置

    <!-- 验证是否登录过滤器 -->
    <filter>
        <filter-name>checkLoginFilter</filter-name>
        <filter-class>com.mvbin.filter.CheckLoginFilter</filter-class>
        <!-- 配置不进行过滤验证的路径 -->
        <init-param>
            <param-name>noCheckUrl</param-name>
            <param-value>index.jsp,user.jspx</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>checkLoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>   
    

    其次,编写过滤器代码

    import ***;
    
    //CheckLoginFilter类
    public class CheckLoginFilter implements Filter {
    
        private String noCheckUrl;
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            //进行强制类型转换
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            //根据,进行字符串分割
            String[] urls = noCheckUrl.split(",");
            //获取session中是否存在loginUser
            User user = (User) req.getSession().getAttribute("loginUser");
            //foreach循环进行验证,包含不过滤的路径的话就放行
            for (String str : urls) {
                String uri = req.getRequestURI();
                //css文件及js文件也要可以通过过滤
                if(uri.indexOf(str) != -1 || uri.endsWith("css") || uri.endsWith("js")) {
                    chain.doFilter(request, response);          
                    return;
                }
            }
            //判断user是否为空
            if(user == null) {
                resp.sendRedirect("index.jsp");
            } else {
                //不为空则放行
                chain.doFilter(request, response);          
            }
        }
    
        @Override
        public void init(FilterConfig config) throws ServletException {
            //获取不过滤的路径
            this.noCheckUrl = config.getInitParameter("noCheckUrl");
        }
    }

    相关文章

      网友评论

          本文标题:Java Web之过滤器

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