Java - SSM+Shiro项目运行流程

一、配置web.xml




         




 

1. 项目启动阶段

项目部署到Tomcat中,项目启动。

Tomcat只加载 web.xml 中的配置的组件。

1.1 Spring工厂启动

ContextLoaderListener

项目部署时,被触发,其父类ContextLoader的工厂启动方法被调用,完成Spring工厂的启动,所有单例bean创建。

启动工厂时,会通过 读取配置文件。

启动完成后,工厂对象会存储在 ServletContext 中,即整个项目范围有效。

1.2 MVC工厂启动

DispatcherSerlvet

在项目启动或第一次被访问时启动,会负责启动SpringMVC的工厂,所有单例bean创建。

启动工厂时,会通过 读取配置文件。

启动完成后,工厂对象会存储在 ServletContext 中,即整个项目范围有效。

启动完成后,该工厂对象会将Spring工厂设置为父工厂

1.3 访问控制启动

1.3.1 ShiroFIlter启动

DelegatingFilterProxy

项目启动时,就完成实例化,是一个/* 的Filter

负责在springMVC之前,接收所有请求,完成Shiro的安全(访问)控制逻辑。

其本身并不负责主要逻辑,在接收到请求后,会到spring工厂中查找ShiroFilter。

ShiroFilterFactoryBean

被定义在spring工厂中,负责生产 ShiroFilter

ShiroFilter负责,将一个新的Subject对象,唯一的SecurityManager对象绑定在当前线程( ThreadLocal )

以支持后续流程中( 我们的组件中,其他的组件中 ) 通过SecurityUtils.getSubject()获取shiro操作入口。

1.3.2 动态代理

MVC工厂启动时,会创建 AuthorizationAttributeSourceAdvisor,其再配合,则其实在MVC工厂启动过程中,就会完成对 附加了如下注解的handler进行代理,切入的Advice分别如下。请求访问的是handler的代理对象

@RequiresAuthentication @RequiresPermissions("user:insert") @RequiresRoles("admin") @RequiresGuest @RequiresUser

AuthenticatedAnnotationMethodInterceptor 其中负责身份认证,会用到SecuirtyUtils.getSubject() PermissionAnnotationMethodInterceptor 其中负责权限认证,会用到SecuirtyUtils.getSubject() RoleAnnotationMethodInterceptor GuestAnnotationMethodInterceptor UserAnnotationMethodInterceptor

此5种advice任何一个执行时,都会:

SecurityUtils.getSubject();获得Subject对象,然后调用如下方法:

subject.isPermitted(...);

subject.isAuthenticated();

....这些就是Shiro的基本的权限校验方法。校验中会用到SM,RM,SeM,RM,CM等组件,这些组件早已在spring工厂中创建。

2. 请求处理

项目部署完毕,项目中的组件,基本除了懒加载的Servlet和非单例的bean,均已启动

2.1 访问控制

请求发送到服务器,tomcat找到对应的web项目,然后由该项目的相关组件来处理请求。

首先被 DelegatingFilterProxy( /* ) 捕获,进行Shiro的环境初始化( 将SM 和 新建的Subject绑定在当前线程中 )。

过滤器放行后,进入到 DispatcherServlet,然后执行handler的执行,准确的说是handler代理的执行。

代理中会完成 handler注解中声明的 安全校验,校验通过后,则执行 handler中定义的逻辑。

3.请求处理流程  

Java - SSM+Shiro项目运行流程_第1张图片

 

 

 

你可能感兴趣的:(Java - SSM+Shiro项目运行流程)