天天看点

Java - SSM+Shiro项目运行流程

一、配置web.xml

<!--  web.xml  shiro-->
<fileter DelegatingFilterProxy   urlpattern=/*   接收请求,查找并调用spring工厂中的ShiroFilter  >

<!--  web.xml  Spring -->         
<listener ContextLoaderListener 负责监听项目启动,随之启动spring工厂,工厂启动后会存储在ServletContext中 >
<context-param  提供名为 contextConfigLocation的参数为监听器提供工厂配置 >

<!--  web.xml  springMVC-->
<servlet DispatcherSerlvet  urlPattern= /  中配置前端控制器
<filter CharacterEncodingFilter  urlPattern= /*    解决Post请求中文请求参数乱码问题    
           

1. 项目启动阶段

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

Tomcat只加载

web.xml

中的配置的组件。

1.1 Spring工厂启动

ContextLoaderListener

项目部署时,被触发,其父类

ContextLoader

的工厂启动方法被调用,完成Spring工厂的启动,所有单例bean创建。

启动工厂时,会通过

<context-param

读取配置文件。

启动完成后,工厂对象会存储在

ServletContext

中,即整个项目范围有效。

1.2 MVC工厂启动

DispatcherSerlvet

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

启动工厂时,会通过

<init-param

读取配置文件。

启动完成后,工厂对象会存储在

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

,其再配合

<aop:config/>

,则其实在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项目运行流程