JavaEE基础(05):过滤器、监听器、拦截器,应用详解-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

JavaEE基础(05):过滤器、监听器、拦截器,应用详解

简介:

本文源码:GitHub·点这里 || GitEE·点这里

一、Listener监听器

1、概念简介

JavaWeb三大组件:Servlet,Listener,Filter。监听器就是指在应用程序中监听相关对象状态变化的组件。

2、事件源对象

指被监听对象。

  • ServletContext

ServletContextListener生命周期监听,它有两个方法,出生时调用contextInitialized(),销毁时调用contextDestroyed();

ServletContextAttributeListener属性监听,它有三个方法,添加属性attributeAdded(),替换属性attributeReplaced(),移除属性时attributeRemoved()

  • HttpSession

HttpSessionListener生命周期监听:它有两个方法,出生时调用sessionCreated(),销毁时调用sessionDestroyed()

HttpSessioniAttributeListener属性监听:它有三个方法,添加属性attributeAdded(),替换属性attributeReplaced(),移除属性attributeRemoved()

  • ServletRequest

ServletRequestListener生命周期监听:它有两个方法,出生时调用requestInitialized(),销毁时调用requestDestroyed()

ServletRequestAttributeListener属性监听:它有三个方法,添加属性attributeAdded(),替换属性attributeReplaced(),移除属性attributeRemoved()

3、编码案例

  • 相关监听器

TheContextListener

public class TheContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("初始化:TheContextListener");
        ServletContext servletContext = servletContextEvent.getServletContext() ;
        servletContext.setAttribute("author","cicada");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("销毁:TheContextListener");
    }
}

TheRequestListener

public class TheRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("初始化:TheRequestListener");
    }
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("销毁:TheRequestListener");
    }
}

TheSessionListener

public class TheSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("初始化:TheSessionListener");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("销毁:TheSessionListener");
    }
}

RequestAttributeListener

public class RequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent evt) {
        System.out.println("Request添加属性:"+evt.getName()+";"+evt.getValue());
    }
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent evt) {
        System.out.println("Request移除属性:"+evt.getName()+";"+evt.getValue());
    }
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent evt) {
        System.out.println("Request替换属性:"+evt.getName()+";"+evt.getValue());
    }
}
  • web.xml配置文件
<!-- 监听器相关配置 -->
<listener>
    <listener-class>com.node05.servlet.listener.TheContextListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.TheSessionListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.TheRequestListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.RequestAttributeListener</listener-class>
</listener>
<session-config>
    <!-- 设置session失效时间为1分钟 -->
    <session-timeout>1</session-timeout>
</session-config>
  • 测试接口
public class ListenerServletImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 1、获取TheContextListener初始化数据
        ServletContext servletContext = this.getServletContext() ;
        String author = String.valueOf(servletContext.getAttribute("author")) ;
        System.out.println("TheContextListener Author:"+author);
        // 2、Request属性设置
        request.setAttribute("mood","smile");
        request.setAttribute("mood","agitated");
        // 3、Session创建,1分钟失效,调用销毁
        HttpSession session = request.getSession(true) ;
        session.setAttribute("casually","casually");
        response.getWriter().print("Hello:Listener");
    }
}

二、Filter过滤器

1、过滤器简介

客户端请求Servlet时,先执行相关Filter,如果Filter通过,则继承执行请求的Servlet;如果Filter不通过,则不会执行用户请求的Servlet。过滤器可以动态地拦截请求和响应。

2、Filter接口

Filter接口定义了三个核心方法。

  • init()

应用程序启动时,服务器实例化Filter对象,并调用其init方法,读取web.xml配置,完成对象的初始化加载。

  • doFilter()

实际的过滤操作,请求达到服务器时,Servlet容器将先调用过滤器的doFilter方法。

  • destroy()

容器在销毁过滤器前调用该方法,释放过滤器占用的资源。

3、编码案例

  • 编写过滤器
public class ThePrintLogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String myName = filterConfig.getInitParameter("myName") ;
        System.out.println("myName:"+myName);
    }
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest ;
        HttpServletResponse response = (HttpServletResponse)servletResponse ;
        String name = request.getParameter("name") ;
        if (!name.equals("cicada")){
            response.getWriter().print("User Error !");
            return ;
        }
        chain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
        System.out.println("ThePrintLogFilter destroy()");
    }
}
  • web.xml配置文件
<!-- 过滤器相关配置 -->
<filter>
    <filter-name>thePrintLogFilter</filter-name>
    <filter-class>com.node05.servlet.filter.ThePrintLogFilter</filter-class>
    <init-param>
        <param-name>myName</param-name>
        <param-value>cicada</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>thePrintLogFilter</filter-name>
    <url-pattern>/filterServletImpl</url-pattern>
</filter-mapping>
  • 测试接口
public class FilterServletImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("Hello:Filter");
    }
}

三、Interceptor拦截器

Spring框架中的拦截器Interceptor类似于Servlet中的过滤器Filter,主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。请求转发不执行拦截、过滤;重定向执行拦截和过滤。

---END---

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章