zoukankan      html  css  js  c++  java
  • Java监听器中ServletRequestListener监听Request的创建和销毁

    ServletRequestHttpServletRequest的区别

    HttpServletRequestServletRequest都是接口,HttpServletRequest继承自ServletRequest
    HttpServletRequestServletRequest多了一些针对于Http协议的方法。如getHeader()getMethod()getSession()等等。

    HttpServletRequest

    客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。

    工作原理:当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其他的Servlet/Jsp处理。

    ServletRequestListener

    用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口,request创建时调用requestInitialized()request销毁时调用requestDestroyed()

    ServletRequestListener源码

    public interface ServletRequestListener extends EventListener {
        default void requestDestroyed(ServletRequestEvent sre) {
        }
        default void requestInitialized(ServletRequestEvent sre) {
        }
    }
    

    HttpSessionListener监听器实现代码

    非SpringBoot下

    public class RequestListener implements ServletRequestListener{
        private final Logger log = LoggerFactory.getLogger(getClass());
        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            log.info("请求发送");
        }
        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            log.info("请求销毁");
        }
    }
    

    然后在web.xml中配置监听器

    <listener>
          <listener-class>监听器类所在路径.监听器名字</listener-class>
    </listener>
    

    在SpringBoot中需要加上@WebListener

    @WebListener
    public class RequestListener implements ServletRequestListener{
        private final Logger log = LoggerFactory.getLogger(getClass());
        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            log.info("请求发送");
        }
        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            log.info("请求销毁");
        }
    }
    

    需要在启动类加上@ServletComponentScan

    controller层演示发送请求

    @RestController
    public class IndexController {
        @RequestMapping("/hello")
        public String hello(){
            return "hello";
        }
    }
    

    启动测试

    访问http://localhost:8080/hello,刷新再请求次

     
    image.png

    控制台输出

     
    image.png

    Request(HttpServletRequest)

    request是表示一个请求,只要发出一个请求就会创建一个request
    它的作用域:仅在当前请求中有效。(比sessionapplication小)
    只在一次请求上(转发不算请求,因为转发是服务器端的行为)生效,当把信息返回给客户端,该对象就被摧毁

    HttpServletRequest具体方法和使用可参考官方文档:
    https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletRequest.html



    作者:意识流丶
    链接:https://www.jianshu.com/p/378c5d035fb9
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati
    了解燃尽图
    hibernate错误org.hibernate.AnnotationException: No identifier specified for entity:
    JGit的常用功能(提交、回滚,日志查询)
    CoverageBuilder
    IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again
    jacoco-实战篇-增量覆盖率
    代码覆盖率-JaCoCo
    Hard voting and Soft Voting
    AP聚类
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11217579.html
Copyright © 2011-2022 走看看