zoukankan      html  css  js  c++  java
  • Java Web三大组件之过滤器(Filter)

    什么是过滤器?有什么用?

    过滤器JavaWeb三大组件之一,它与Servlet很相似。不过滤器是用来拦截请求的,而不是处理请求的。过滤,顾名思义,就是留下我们想要的,丢掉我们不需要的。例如:某个网站的用户通过/login.jsp登录成功后会跳转到/pages/user/index.jsp页面。但是如果用户并没用通过/login.jsp页面登录,而是直接请求/pages/user/index.jsp页面,显然这样做是没道理的,应该阻止这种行为。过滤器就是负责处理这种情况的,过滤器收到/pages/user/index.jsp请求的时候,会将该请求先拦截下来,然后判断是不是处于登录状态的用户,如果是就允许这种请求,放行。如果是非登录状态,则不会放行这个请求,相当于过滤掉了。

    过滤器的工作原理

    过滤器的生命周期

    Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。每一次请求都会执行一次doFilter方法

    Filter的应用

    1、定义XxxFilter类,实现Filter接口,重写init()、doFilter()、destroy()方法。多数情况下只用具体实现doFilter()方法即可。

    2、在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。Servlet3.0提供@WebFilter注解将一个实现了javax.servlet.Filter接口的类定义为过滤器,这样我们在web应用中使用过滤器时,也不再需要在web.xml文件中配置过滤器的相关描述信息了。

    登录检查过滤器

    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.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    //注解方式标识过滤器
    //过滤器名称:loginFilter
    //过滤器过滤的路径:http://localhost:8080/webdemo/pages/ 下的所有请求都会被拦截
    @WebFilter(filterName="loginFilter",urlPatterns="/pages/*")
    public class LoginFilter implements Filter {
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            HttpSession session = request.getSession();
            if (session.getAttribute("username") != null) {  // 如果处于登录状态
                // 过滤器放行
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                response.sendRedirect(request.getContextPath() + "/login.jsp");
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
    
    }

    编码转换过滤器

    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.annotation.WebFilter;
    
    @WebFilter(filterName="EncodingFilter",urlPatterns="/*")
    public class EncodingFilter implements Filter {
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("UTF-8");
            filterChain.doFilter(servletRequest, servletResponse);
            servletResponse.setCharacterEncoding("UTF-8");
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub    
        }
    }

    参考:

    1、https://www.cnblogs.com/xdp-gacl/p/3948353.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/binaway/p/8921720.html
Copyright © 2011-2022 走看看