精华内容
下载资源
问答
  • servlet加载过程
    2018-03-15 18:19:12

    web.xml

    <display-name>javawebdemo</display-name>
      <context-param>
      	<param-name></param-name>
      	<param-value></param-value>
      </context-param>  
      
      <listener>
      	<listener-class>myServlet.MyServletContextListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.SessionListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.FirstServletRequestListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.SecondServletRequestListener</listener-class>  	
      </listener>     
      
      <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>myServlet.FirstFilter</filter-class>   
      </filter>  
      <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/MyServlet</url-pattern>
      </filter-mapping>
      
      <filter>
        <filter-name>SecondFilter</filter-name>
        <filter-class>myServlet.SecondFilter</filter-class>    
      </filter>  
      <filter-mapping>
        <filter-name>SecondFilter</filter-name>
        <url-pattern>/MyServlet</url-pattern>
      </filter-mapping>
      
      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>javawebdemo.MyServlet</servlet-class>
        <load-on-startup>1</load-on-startup>    
      </servlet>
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
      </servlet-mapping>

    启动日志:

    MyServletContextListener.contextInitialized
    FirstFilter.init
    SecondFilter.init
    MyServlet.init

    请求/javawebdemo/MyServlet日志

    FirstServletRequestListener.requestInitialized
    SecondServletRequestListener.requestInitialized
    FirstFilter.doFilter Begin
    SecondFilter.doFilter Begin
    MyServlet.doGet
    SessionListener.sessionCreated   //HttpSession session = request.getSession(true);需要强制创建session
    SecondFilter.doFilter End
    FirstFilter.doFilter End
    SecondServletRequestListener.requestDestroyed
    FirstServletRequestListener.requestDestroyed
    以上看出启动流程

    启动阶段:contextInitialized->Filter.init->Servlet.init(web.xml设置<load-on-startup>1</load-on-startup>)
    访问阶段:RequestListener.requestInitialized->FirstFilter.doFilter->SecondFilter.doFilter->Servlet->返回SecondFilter.doFilter->返回FirstFilter.doFilter->RequestListener.requestDestroyed
    简单:Listener->Filter->Servlet->Filter->Listener

    配置说明

    listener:不配置url请求过滤
    filter:需要配置url或servlet过滤
    servlet:需要配置url或servlet过滤

    按监听的对象划分

    ServletContext对象监听器
    HttpSession对象监听器
    ServletRequest对象监听器

     按监听的事件划分

    对象自身的创建和销毁的监听器
    对象中属性的创建和消除的监听器
    session中的某个对象的状态变化的监听器


    更多相关内容
  • servlet加载过程

    2021-03-04 12:18:57
    1:用户发出一个请求,浏览器先从本地host文件中,查找域名和ip的对应关系,如果没有,则去dns服务器去查,得到目标服务器ip...3:解析URL,去web.xml通过servletMapping找到对应的servlet,然后找到对应的servlet-cl.

    总结步骤

    > 0.用户发出一个请求,浏览器先从本地host文件中,查找域名和ip的对应关系,如果没有,则去dns服务器去查,
    > 	得到目标服务器ip地址后,发送一个探测包,看目标服务器是否有回应,如果有,则向目标服务器发送http请求
    > 1:Web服务器接收到Http请求
    > 2:Web服务器将请求转发给Servlet容器,然后Servlet容器产生两个对象:
    > 	请求对象(HttpServletRequest),	响应对象(HttpServletResponce)
    > 3:Servlet容器解析url,去容器中找对应的servlet,如果容器中不存在所需的servlet,容器就会通过web.xml或者webServlet注解,
    > 找到对应的用户自己编写的servlet类,然后加载并初始化,并将其加载到servlet容器中
    > 4:Servlet容器根据url找到目标Servlet,然后Servlet容器创建一个线程/从线程池里取出一个线程
    > 	,并且将刚才创建的请求对象和响应对象传递给线程
    > 5:容器调用Servlet的service()方法来处理Http请求,并传入请求对象(HttpServletRequest),响应对象(HttpServletResponce)> 	根据请求类型调用doGet()doPost()方法
    > 6:Web服务器将动态生成的结果返回到正确的地址,然后创建的线程被销毁或者放到线程池中。
    > 	注意:servlet对象在服务器运行期间只会被创建一次,即是单例的,当服务器关闭的时候,销毁已经初始化的Servlet对象。
    > 	如果不是第一次访问这个路径,则直接取出提前初始化好的servlet的对象(应该是存在一个hash<url,servlet>里)。
    

    在这里插入图片描述

    在这里插入图片描述

    如果是第一次加载,需要执行servlet的init的方法

    在这里插入图片描述

    ①:对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
    ②:我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)
    注意: 在GenericServlet中执行public void init(ServletConfigconfig)方法的时候,又调用了自己无惨无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

    服务器调用Servlet的Service方法

    在这里插入图片描述

    接着,在调用service方法之前,服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据
    ①:接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找
    ②:到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入
    ③:然后将传入的两个参数强转,并调用HttpServlet下的另外个service方法
    ④:接着执行service(HttpServletRequest req, HttpServletResponseresp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法

    HttpServlet的service方法

         protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String method = req.getMethod();
            long lastModified;
            if (method.equals("GET")) {
                lastModified = this.getLastModified(req);
                if (lastModified == -1L) {
                    this.doGet(req, resp);
                } else {
                    long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                    if (ifModifiedSince < lastModified) {
                        this.maybeSetLastModified(resp, lastModified);
                        this.doGet(req, resp);
                    } else {
                        resp.setStatus(304);
                    }
                }
            } else if (method.equals("HEAD")) {
                lastModified = this.getLastModified(req);
                this.maybeSetLastModified(resp, lastModified);
                this.doHead(req, resp);
            } else if (method.equals("POST")) {
                this.doPost(req, resp);
            } else if (method.equals("PUT")) {
                this.doPut(req, resp);
            } else if (method.equals("DELETE")) {
                this.doDelete(req, resp);
            } else if (method.equals("OPTIONS")) {
                this.doOptions(req, resp);
            } else if (method.equals("TRACE")) {
                this.doTrace(req, resp);
            } else {
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[]{method};
                errMsg = MessageFormat.format(errMsg, errArgs);
                resp.sendError(501, errMsg);
            }
        }
    
    展开全文
  • Servlet内存马的最后一篇,和之前的分析其实差不太多,基础知识就不进行了,这篇文章就直接从加载开始说起,废话不多说直接开始吧。 一、Servlet流程分析 (一)StrandContext.startInternal方法 首先我们需要先了解...

    前言

    Servlet内存马的最后一篇,和之前的分析其实差不太多,基础知识就不进行了,这篇文章就直接从加载开始说起,废话不多说直接开始吧。

    一、Servlet流程分析

    (一)StrandContext.startInternal方法

    首先我们需要先了解一下Tomcat的加载流程,这里借用师傅的一张图。

    image.png

    我们通过上图Tomcat的启动流程可以得知,首先我们启动到StandardHost就会去启动StrandContext,我们和之前内存马的分析一样,我们从Contextconfig类加载配置文件开始分析,我们打好断点,然后开始查看栈信息。

    image.png

    跟进上图的栈信息,我们可以看到StandardHost之后就会走到StrandContext,我们跟到StrandContext进行查看。可以看到我们此时执行的是StandardContext. startInternal(),根据栈的信息,我们在this.fireLifecycleEvent 位置正在解析web.xml并启动StandardWrapper。我们继续往下看代码。

    image.png

    startInternal()方法在最后依次调用了listenerStart、filterStart、loadOnStartup方法,我们跟到loadOnStartup方法进行查看。

    image.png

    这里我们首先对children进行了一个变量,大概猜测children应该是存储servlet的变量。接下来做了一个迭代,执行了wrapper.load()对其进行加载。我们这里其实就是我们加载wrapper的地方。

    image.png

    image.png

    【一>所有资源获取<一】
    1、网络安全学习路线
    2、电子书籍(白帽子)
    3、安全大厂内部视频
    4、100份src文档
    5、常见安全面试题
    6、ctf大赛经典题目解析
    7、全套工具包
    8、应急响应笔记

    (二)ContextConfig读取配置文件

    到这里我们已经跟到了StandardContext加载Wrapper的位置,最关键的参数其实就是children,所以我们回到刚才ContextConfig的位置继续进行分析。首先ContextConfig读取web.xml配置文件,我们跟到configureContext()方法查看代码,首先读取到servlet后进行迭代。

    image.png

    接下来执行createWrapper方法创建了一个wrapper。继续向下

    image.png

    接下来设置了一个ServletName和ServletClass(这里其实对应的就是web.xml中的servlet),继续向下

    image.png

    (三)addChild启动wrapper线程

    读取到Servlet配置之后,执行了addChild(wrapper)方法,我们跟进addChild()方法进行查看。

    image.png

    我们跳到了StandardContext.addChild(),其实servlet的添加就是在这里面进行的。我们继续跟进去简单看一下吧。

    image.png

    我们走到了ContainerBase.addChild(),这个类其实是一个骨架类,这里我们需要注意两个位置,一个是我们将wrapper添加到了ContainerBase的children变量中,另一个是我们最后执行到了child.start(),我们继续向下查看。

    image.png

    我们跳到了LifecycleBase,这个类主要是和Tomcat的生命周期有关,我们跟到this. startInternal()进行查看。

    image.png

    此时我们通过LifecycleBase走到了StandardWrapper.startInternal(),查看该方法其实这里本质就是调用父类的startInternal() 线程池启动。我们点击去稍微看一下super.startInternal()进行查看

    image.png

    我们又走到了ContainerBase.startInternal(),方法最后启动了线程。

    image.png

    我们执行完addChild()方法后,我们回到了ContextConfig类,继续向下查看,可以看到此时执行了webxml.getServletMappings().entrySet().iterator(),其实这里的本质是就是读取servler-mapping。

    image.png

    我们跟到addServletMappingDecoded()方法,跳到了StandardContext. addServletMappingDecoded()方法下,首先将servlet-name和url-pattern添加到servletMappings下,然后通过findChild方法,找到我们之前启动的wrapper(读取之前存储到ContainerBase的children变量),我们跟进查看wrapper.addMapping()方法。

    image.png

    image.png

    我们走到了StandardWrapper.addMapping方法。将mapping(也就是url-pattern)添加到mappings变量下。

    image.png

    二、Servlet内存马实现

    其实看到这里应该能明白添加servlet最关键的地方就是这个两个方法,所以我们接下来内存马的编写就需要一个恶意的servlet,然后通过addChind和addServletMappingDecoded将其恶意servlet注入进去。

    image.png

    image.png

    最终成功实现内存马。

    image.png

    image.png

    结尾~~~

    文章里面有什么写的不对的地方,望师傅们多加指正。Servlet型内存马算是写完了,个人觉得Servlet内存马是这三个里面最难的,因为调试的时候栈里面来回的绕,有时候跳着跳着就乱了,文章里面可能有些地方有写的不对的地方,希望师傅们多加指正。

    展开全文
  • 从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式: @PostConstruct public void ...

    从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:

    @PostConstruct
    public void someMethod(){}

    或者

    public @PostConstruct void someMethod(){}

    被PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法知性之后执行;
    servlet执行流程如图:
    在这里插入图片描述
    另外,spring中Constructor、@Autowired、@PostConstruct的顺序如下:
    其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

    如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么久无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
    即:
    Constructor >> @Autowired >> @PostConstruct

    顺带复习下类的加载顺序:

    1. 父类静态对象和静态代码块
    2. 子类静态对象和静态代码块
    3. 父类非静态对象和非静态代码块
    4. 父类构造函数
    5. 子类非静态对象和非静态代码块
    6. 子类构造函数
    7. 普通代码块

    上述加载顺序中,类中静态代码块按照声明顺序执行,并且1和2在类加载到方法区的时候执行,也就是不需要在调用new实例的时候就执行了。

    PostConstruct注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。必须在类投入使用之前调用此方法。
    所有支持依赖注入的类都必须支持此注释。即使类没有请求注入任何资源,也必须调用使用PostConstruct注释的方法。
    只有一个方法可以使用此批注进行批注。
    应用PostConstruct注释的方法必须满足以下所有条件:除了拦截器之外,方法绝不能有任何参数,在这种情况下它采用Interceptor规范定义的InvocationContext对象。
    在拦截器类上定义的方法必须具有以下签名之一:
    void <METHOD>(InvocationContext)Object <METHOD>(InvocationContext)抛出异常注意:
    PostConstruct拦截器方法不能抛出应用程序异常,但可以声明它抛出检查异常,包括java.lang.Exception,
    如果相同的拦截器方法除了生命周期事件之外插入业务或超时方法。
    如果PostConstruct拦截器方法返回一个值,容器将忽略它。
    在非拦截器类上定义的方法必须具有以下签名:void <METHOD>()应用PostConstruct的方法可以是public,protected,package private或private。
    除应用程序客户端外,该方法绝不能是静态的。
    该方法可能是最终的。如果该方法抛出一个未经检查的异常,那么该类绝不能投入使用,除非EJB可以处理异常甚至从它们恢复的EJB

    @Service
    public class BeanA {
    
        @Autowired
        private BeanB beanB;
    
        public BeanA() {
            System.out.println("这是Bean A 的构造方法");
        }
    
    
        @PostConstruct
        private void init() {
            System.out.println("这是BeanA的 init 方法");
            beanB.testB();
        }
    }
    @Service
    public class BeanB {
    
        @PostConstruct
        private void init() {
            System.out.println("这是BeanB 的init 方法");
        }
    
        public BeanB() {
            System.out.println("这是Bean B的 构造方法");
        }
    
        void testB() {
            System.out.println("这是Bean B 的 testB 方法");
        }
    }

    启动后输出:

    这是Bean A 的构造方法
    这是Bean B的 构造方法
    这是BeanB 的init 方法
    这是BeanA的 init 方法
    这是Bean B 的 testB 方法
    

    论证了加载顺序:
    Constructor > @Autowired > @PostConstruct

    Servlet加载顺序理清之后,再论证类的加载顺序:

    public class Test {
    
        public static Test t1 = new Test();// 标记1
    
        // 普通代码块
        {
            System.out.println("block A");// 标记2
        }
    
        // 静态代码块
        static {
            System.out.println("block B");// 标记3
        }
    
        public static void main(String[] args) {
            Test t2 = new Test();// 标记4
        }
    
    }

    out:

    block A
    block B
    block A
    

    解析:

    首先进入Test类,没有父类,那就执行自身的静态对象和代码块,并且按照声明顺序执行。
    所以首先执行标记1的静态对象,并且进行了实例化,所以需要调用相应的构造代码块,执行了标记2的语句,所以输出了block A;
    执行完毕后顺序执行静态代码块,也就是标记3的语句,所以输出了blockB;
    继续执行静态的main方法,重新实例化Test对象,再次调用构造代码块,再次输出了标记2的语句,所以再次输出了block A;

    展开全文
  • Servlet加载过程 容器tomcat启动读取web.xml文件,加载相关资源 读取全局servlet资源,这部分资源所有的servlet对象共用(比如 数据库连接信息 ),形成ServletContext对象 读取&lt;servlet&gt;配置段,...
  • Servlet加载顺序

    千次阅读 2017-12-18 19:51:26
    整一个的解析过程如下: 1. servlet>  2. Servlet_Request  3. cn.xuhuanfeng.servlet.Servlet_Request  4.    5.  6. Servlet_Request  7. /Servlet_Request  8.     当用户在浏览器...
  • web.xml 中的listener、 filter、servlet 加载顺序及其详解 一、概述 1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。 2、紧急着,容...
  • tomcat启动加载Servlet源码浅析

    千次阅读 2019-06-22 14:16:00
    我们知道tomcat不只是web服务器,它还提供动态地内容是一个Servlet容器。tomcat的总体架构如图所示: Server表示一个服务器实例,由Connector和Container组成Service服务。Connector用于接收请求,Container表示一...
  • 加载bean | Servlet配置类优化 一、加载 bean 1、哪些 bean 需要被加载,被谁加载? 2、如何区分加载内容? 二、Servlet 配置类优化 在之前的 Spring 相关技术的学习过程中,我们涉及到了 Spring 配置类(Spring...
  • Spring的加载过程

    2022-04-08 18:27:15
    启动过程 在一个基于springmvc的web应用中,需要有一个web容器,一般我们用tomacat,这个web容器提供了一个全局的上下文环境ServletContext,同时也是Spring IoC容器的宿主环境。 宿主容器启动时,其入口文件便是web...
  • 一、Web服务器,Servlet容器 Servlet应用程序:我们自己编写的处理请求,响应的代码(doGet()和doPost()方法)。 Web服务器:使用HTTP协议来传输数据。最简单的一种情况是,用户在浏览器中输入一个URL,然后就能...
  • 主要介绍了Java servlet执行流程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 在Spring配置Servlet标签一文中介绍了Servlet的调用以及初始化过程,在一系列的初始化过程init中加载bean的模式都是先从bean工厂得到,如果没有那么就加载Spring属性文件DispatcherServlet.properties中默认的,那么...
  • Servlet 是 Server Applet 的简称,译为“服务器端小程序”。
  • Servlet超详解+流程

    千次阅读 2021-08-13 08:29:19
    1.servlet处理用户请求的完整流程 针对Servlet的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和 HttpServletResponse 对象。其中,HttpServletRequest 对象用于封装 HTTP 请求...
  • Servlet开发流程及运行流程
  • 在内嵌Servlet容器下Spring Boot中如何加载Servlet? 标题 0、什么是ServletContext? 以上是ServletContext源码描述,基本上就是与Servlet容器(例如常用的Tomcat)通信的对象,该对象被ServletConfig对象持有。...
  • 主要介绍了web.xml中servlet, bean, filter, listenr 加载顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Servlet生命周期

    2020-12-22 14:33:21
    Servlet 加载—>实例化—>服务—>销毁。   1.Servlet 通过调用 init () 方法进行初始化。 2.Servlet 调用 service() 方法来处理客户端的请求。 3.Servlet 通过调用 destroy() 方法终止(结束)。 4.最后,...
  • Java是一种动态加载和运行的语言。也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下,可以在程序运行期 间任何时候加载这个类,并创建和使用该类的对象。Servlet就是基于这个机制与Web...
  • Servlet的处理过程

    2021-10-13 14:54:03
    Servlet的处理过程 1.客户端浏览器提交一个对服务器servlet的调用(get、post) 2.服务器接到请求后,若该servlet是第一次调用,则加载servlet并实例化生成一个servlet对象 3.服务器调用该servlet对象的service()...
  • 了解过servlet的朋友都知道这个接口用来监听容器的初始化和销毁 所以在ContextLoaderListener实现了这个接口后,他就有了监听容器启动和销毁的功能,就可以在需要的时候加载一些特定的数据;比如配置文件 public ...
  • 在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上检查数据库查看那些任务未被按时执行...
  • Servlet之自动加载配置方法

    千次阅读 2017-01-28 18:17:04
    Servlet中,默认是在第一次访问时创建Servlet对象,如果在构造方法或者在init()中加入过多的逻辑,那么在用户第一次访问...过程很简单,就只需要在web.xml的Servlet标签中加上自动加载标签:1 配置举例如下:
  • servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。那么Servlet是何时被加载和实例化的呢?很多...
  • Servlet学习笔记-Servlet工作原理和过程

    千次阅读 多人点赞 2020-03-07 01:32:24
      Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术。由Sun公司于1996年发布,用来代替CGI——当时生成Web动态内容的主流技术。官方文档对Servlet的概述,请参考《Servlet的概述》。 2、关键词 ...
  • <!-- //配置Spring MVC,指定处理请求的Servlet,有两...--负数或者0代表延时加载,第一次调用的时候采取加载 数字越小优先级越高 --> <load-on-startup>0</load-on-startup> </servlet>
  • Servlet执行流程

    万次阅读 多人点赞 2018-07-28 16:40:34
    1、当Servlet第一次被调用的时候会触发init函数,该函数会把servlet实例加载到内存。该函数只会被调用一次 2、web服务器把接收到的http请求封装成一个Request对象,作为service函数的参数传递进去。 3、service...
  • Filter filter可认为是Servlet的一种“变种”,它主要用于对...完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。 Filter有如下几个用
  • 一个jsp 和一个servlet 教你看懂ajax的动态加载过程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,282
精华内容 49,312
关键字:

servlet加载过程