`
micc010
  • 浏览: 71631 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

spring DispatcherServlet建立会话分析

    博客分类:
  • java
阅读更多
<servlet>   
    <servlet-name>Dispatcher</servlet-name>   
    <servlet-class>   
        org.springframework.web.servlet.DispatcherServlet   
    </servlet-class>   
    <init-param>   
        <param-name>contextConfigLocation</param-name>   
        <param-value>/WEB-INF/Config.xml</param-value>   
    </init-param>   
    <load-on-startup>1</load-on-startup>   
</servlet> 
 


由此,我们可知,web container把所有的请求都交给DispatcherServlet也就是 org.springframework.web.servlet.dispatcherservlet来处理了。dispatcherservlet是研究springframework mvc的关键类,在你的spring 工程中打开该类的源代码吧。

在你spring工程中你可以看到,dispatcherservlet的父类是frameworkservlet,frameworkservlet的父类 httpservletbean,而httpservletbean的父类是httpservlet,因此dispatcherservlet本质上是个 httpservlet.在web.xml中的<load-on-startup>2</load-on-startup>表明,jsp container 在启动的时候就会生成dispatcherservlet,自然会执行其init()方法了。从 dispatcherservlet的源代码来看,他并没有直接覆盖父类的init(),我们再来看看frameworkservlet的init(), 呵呵,frameworkservlet也没有,一路追溯上去,终于在httpservletbean类中找到了init(),该方法中调用 initservletbean();再看frameworkservlet的initservletbean()



里面关键的有2句:


java 代码
 
1.this.webapplicationcontext = initwebapplicationcontext();   
2.initframeworkservlet(); 
 



我们先来看第一句 initwebapplicationcontext();在开始研究这个方法之前,我们得了解一下spring的 <o:p></o:p>webapplicationcontext是个什么东西,从spring-reference.pdf的第九章的得知,每一个 dispatcherservlet都有它的webapplicationcontext,每一个webapplicationcontext都是一个applicationcontext,自然也是一个beanfactory,源码分析




java 代码
 
public interface WebApplicationContext extends ApplicationContext {};//WebApplicationContext 扩展ApplicationContext   
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,   
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver   
//ApplicationContext扩展了BeanFactory  





而且,每一个webapplicationcontext有一个 parent webapplicationcontext,这个parent是整个web application的context,自然也是个 beanfactory,这个parent的内容默认是从/web-inf/applicationcontext.xml文件装载,而 dispatcherservlet自己的webapplicationcontext则是从一个叫xxxx-servlet.xml的文件装载的。 xxxx就是在web.xml为dispatcherservlet定义的servlet-name.明白了这层关系,我们再来看 initwebapplicationcontext(),它所做的无非就是生成dispatcherservlet的 webapplicationcontext,同时设置好它的相关属性。我们先来看看它的parent属性是如何设置的。然后再看他自己的 webapplicationcontext内容是如何从xxxx-serlvet.xml里面装载的。

例如

<servlet><servlet>

<servlet-name>

xml 代码
 
<servlet>   
<servlet-name>Dispatcher</servlet-name>   
<servlet-class>   
org.springframework.web.servlet.DispatcherServlet   
</servlet-class>   
<init-param>   
<param-name>contextConfigLocation</param-name>   
<param-value>/WEB-INF/Config.xml</param-value>   
</init-param>   
</servlet>   
<servlet-mapping>   
<servlet-name>Dispatcher</servlet-name>   
<url-pattern>*.do</url-pattern>   
</servlet-mapping>  




initwebapplicationcontext()中有这么一句:

webapplicationcontext parent  = webapplicationcontextutils.getwebapplicationcontext(servletcontext);


然后在createwebapplicationcontext()方法中有这么一句:wac.setparent(parent);由此可见, dispatcherservlet的webapplicationcontext的parent是在 initwebapplicationcontext()中得到,然后在createwebapplicationcontext()方法中设置的。好奇的你也许会问,这个parent 实例到底是谁生成的呢,和/web-inf/applicationcontext-hibernate.xml文件有什么关系呢.我们现在就来探讨一下这个问题。在spring工程中打开webapplicationcontextutils的 getwebapplicationcontext()方法中只有那么一句:return (webapplicationcontext) sc.getattribute (webapplicationcontext.root_web_application_context_attribute);也就是说,早就有人在web application的serlvet context里面设置好了这个属性,dispatcherservlet的 initwebapplicationcontext()只是利用webapplicationcontextutils从 servlet context把这个对象按名字检索出来而已。也许你已经按捺不住了,到底是谁设置了这个属性呢。不用急,我们打开web.xml看看,在petclinic servlet的定义之前,还有一个servlet的定义:



java 代码
 
<servlet>   
   <servlet-name>context</servlet-name>   
   <servlet-class>org.springframework.web.context.contextloaderservlet</servlet-class>   
   <load-on-startup>1</load-on-startup>   
</servlet>   




相信聪明的你已经从该servlet的名字和条目前面的注释猜出这个parent,也就是web application的root context是由 contextloaderservlet来设置的。没错,从contextloaderservlet的init方法中我们可以发现, contextloaderservlet生成一个contextloader,并且调用其initwebapplicationcontext()方法来设置root context。看看contextloader类,我们的答案都找到了。在其initwebapplicationcontext() 中,首先生成一个applicationcontext作为root context的parent,呵呵,在root context之上没有 context了,这个parent自然是null;而root context本身则在contextloader的 createwebapplicationcontext()方法里设置。该方法的步骤如下:

1.看在web.xml有没有定义定制的 context类(用contextclass参数指出),如果没有的话,

就用xmlwebapplicationcontext类来作为缺省的 context类。在我们的这个petclinic工程里面,没有使用定制的context类,

自然也就是用 xmlwebapplicationcontext类来作为context类了。

2.利用beanutils来生成一个context实例,在这里也就是一个xmlwebapplicationcontext实例。

3.设置parent属性,也就是null;

4.设置servletcontext属性,该属性还是从contextloaderservlet传过来的。

5.从web.xml中找到参数contextconfiglocation,作为配置文件的路径。我们在web.xml中定义contextconfiglocation的值是

"/web-inf/applicationcontext-hibernate.xml"

6.利用contextconfiglocation属性指出的xml配置文件中的内容刷新生成xmlwebapplicationcontext实例。

呵呵,到此为止,关于web application的root context的出生问题已经搞清楚了,那么到底是谁把这个实例设置为 servlet context的一个attribute的呢@呵呵,聪明的你肯定已经发现了contextloader的 initwebapplicationcontext方法中有这么一句:webapplicationcontextutils.publishwebapplicationcontext (wac);没错,contextloader正是利用webapplicationcontextutils把root context绑定为 servlet context的一个属性的。至于这个属性叫什么名字,我想就不用我多说了。之所以让contextloaderservlet的 load-on-startup=1,就是让这个servlet初始化web application的root context属性,绑定到 servlet context.正如web.xml文中的注释指出的一样,如果你使用满足servlet 2.4规范的容器,你就只需在web.xml 中定义一个contextloaderlistener就行了,而不用使用contextloaderservlet。

饶了这么大一个圈子,我们才明白了dispatcherservlet的webapplicationcontext的parent是如何来的。现在该说说dispatcherservlet的webapplicationcontext本身是如何设置的了。

现在我们来看看frameworkservlet的createwebapplicationcontext()方法。同contextloader的 createwebapplicationcontext()类似的步骤。不同之处在于前者含有wac.setnamespace (getnamespace());语句。通过跟踪getnamespace()我们得到frameworkservlet的namespace属性其实就是字符串"[servletname]-serlvet"(servletname变量在web.xml中定义,对我们的工程而言就是Dispatcher)。

java 代码
 
public String getNamespace() {   
        return (this.namespace != null) ? this.namespace : getServletName() + DEFAULT_NAMESPACE_SUFFIX;   
}   
   
public static final String DEFAULT_NAMESPACE_SUFFIX = "-servlet"; 
 



接下来有这么一句:


java 代码
 
if (this.contextconfiglocation != null){   
 wac.setconfiglocations(webapplicationcontextutils.parsecontextconfiglocation(this.contextconfiglocation)); 
 



这个if语句会不会执行呢@也就是说frameworkservlet的私有属性contextconfiglocation是不是为空呢@也就是有没有人给frameworkservlet初始化这个属性呢@答案就在于frameworkservlet的父类httpservletbean的init() 方法中,里面有这么一句propertyvalues pvs = new servletconfigpropertyvalues (getservletconfig(), this.requiredproperties);仔细研究 servletconfigpropertyvalues()方法就知道,如果你在web.xml给dispatcherservlet定义 init-param参数contextconfiglocation的话(形式通常是诸如/web-inf/test-servlet.xml,  /web-inf/myservlet.xml),父类方法init()中就会给frameworkservlet初始化这个属性.

在我们的工程并没有定义这个init-param参数,因此前面所说的if语句不会执行了。也就是frameworkservlet的 createwebapplicationcontext()方法中的wac只是初始化了属性namespace,而没有初始化 contextconfiglocation.接下来是wac.refresh();通过查看这个方法的源码(在 xmlwebapplicationcontext类中)我们就知道,在没有给xmlwebapplicationcontext初始化 contextconfiglocation属性的情况下,它会从namespace属性指出的xml配置文件中装载beandefinitions,我们的工程而言就是Dispatcher-servlet.xml文件。


至此为止,我们的 webapplicationcontext终于生成了。回到frameworkservlet的initwebapplicationcontext ()方法,我们可以发现,




这个生成的webapplicationcontext以 org.springframework.web.servlet.Frameworkservlet.CONTEXT.为key保存在servletcontext里面.
分享到:
评论

相关推荐

    spring_springweb_

    5. **会话管理(Session Management)**:Spring Security可以控制会话的创建、生命周期和并发控制,防止会话固定攻击。 6. **异常处理(Exception Handling)**:当安全规则不满足时,Spring Security会抛出相应的...

    Spring MVC+ Spring+ Mybatis 框架搭建

    Spring MVC通过DispatcherServlet作为前端控制器,接收请求并分发给相应的处理器(Controller)。处理器执行业务逻辑后,将结果返回给ModelAndView对象,再由视图解析器渲染视图。此外,Spring MVC还支持注解驱动,...

    spring boot+spring cloud+spring mvc+mybatis

    3. **Spring Cloud**:Spring Cloud是基于Spring Boot的微服务开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态...

    Mastering Spring Webmvc

    Spring MVC可以与Spring的其他模块无缝集成,如Spring Security进行安全控制,Spring Data进行数据访问,Spring Session管理会话等,使得整个应用架构更为统一和高效。 总结,Spring Web MVC是Java Web开发的强大...

    【BAT必备】spring面试题,spring MVC面试题,spring boot面试题,spring cloud面试题

    DispatcherServlet是Spring MVC的核心组件之一,它的主要作用是分发请求。当客户端发送请求到服务器时,DispatcherServlet会根据配置的HandlerMapping找到合适的控制器来处理请求,并返回相应的视图。 #### 3. ...

    springsecurity所有jar包

    它提供HTTP安全拦截过滤器链,如`DelegatingFilterProxy`,可以与Spring的DispatcherServlet集成。 4. **spring-security-acl**:这个模块提供了细粒度访问控制,允许对对象级别的权限进行管理。例如,你可以控制...

    spring(纯手写spring)

    - 提供了一套完整的安全解决方案,包括身份验证、授权和会话管理。 通过“springstudy”这个项目,你可以亲身体验Spring的这些核心概念,并理解它们是如何协同工作的。从实践中学习是理解技术的最佳途径,因此动手...

    spring springmvc mybatis框架整合需要的jar包

    在整合过程中,我们需要Spring的核心库(如spring-core、spring-context、spring-beans等),以及Spring的Web支持库(如spring-web、spring-webmvc)。这些jar包为其他框架提供了一个运行环境,并负责管理应用中的...

    spring应用开发完全手册(10-11)

    这部分内容将介绍如何配置Spring的DispatcherServlet,以及如何利用Spring的Filter支持进行请求拦截和响应处理。 3. RESTful服务:Spring支持创建RESTful服务,通过HTTP协议提供资源。本章会讨论如何使用Spring MVC...

    最简单的用户登录与注册系统 spring mvc spring jdbc

    在本项目中,你需要理解DispatcherServlet的作用,Controller的定义,以及ModelAndView对象的使用。 2. **Spring JDBC**:Spring JDBC抽象了JDBC,提供了一个模板类JdbcTemplate,用于执行SQL查询和更新。理解如何...

    SpringMVC+springAOP+spring security+Hibernate整合实例代码

    3. Spring Security:这是一个强大的安全框架,提供认证、授权和会话管理等功能。Spring Security可以保护你的应用免受各种攻击,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等。在这个整合实例中,Spring ...

    spring shiro整合

    Spring MVC通过DispatcherServlet接收请求,通过HandlerMapping找到对应的Controller,然后调用Service进行业务处理,最后通过ViewResolver渲染结果并返回给客户端。 MyBatis是一个优秀的持久层框架,它简化了JDBC...

    spring4框架系列[ 1 ]

    通过学习这个"Spring4框架系列[ 1 ]",初学者可以建立起对Spring框架的基本认识,并逐步掌握如何在实际项目中利用Spring进行高效开发。后续章节可能会深入讲解更多高级特性,如数据访问集成、事务管理、Spring Boot...

    于洋spring

    1. **安全控制**:Spring Security提供了一套完整的安全解决方案,包括身份验证、授权、会话管理等,保护Web应用免受攻击。 2. **OAuth2集成**:Spring Security支持OAuth2,可以实现第三方登录服务,如Google、...

    尚硅谷spring5视频笔记.zip

    8. **Spring Security**:Spring的安全管理框架,提供了身份验证、授权、会话管理等功能,保障应用安全。 9. **AOP(面向切面编程)**:Spring的AOP模块支持在不修改源代码的情况下进行横切关注点的添加,如日志...

    spring mvc 和spring security自定义登录

    Spring MVC的组件如DispatcherServlet、Controllers、Models和Views协同工作,确保了高效的Web应用开发。 其次,Spring Security是Spring生态中的安全模块,它提供了一套全面的安全解决方案,包括认证、授权、会话...

    spring最基本jar

    10. **Spring Security**:这是一个强大的安全框架,提供了认证、授权、会话管理等功能,保护了Spring应用的安全性。 这个“spring最基本jar”可能包含了Spring框架的基础组件,如Spring Core、Spring Beans、...

    spring-web-3.0.6.release.jar.zip

    Spring Security是Spring生态系统的一部分,它可以与Spring Web紧密结合,提供身份验证、授权、会话管理等功能,确保Web应用的安全性。 总结,Spring Web 3.0.6.RELEASE作为一个成熟的Web框架,为开发者提供了丰富...

    spring security用户权限项目

    5. **会话管理(Session Management)**:Spring Security 可以配置会话超时、会话固定攻击防护等策略,保护用户会话的安全。 **Spring MVC 知识点** 1. **DispatcherServlet**:作为 Spring MVC 的核心,它负责...

Global site tag (gtag.js) - Google Analytics