Spring、SpringMVC、Shiro面试题

本文深入讲解Spring框架的核心技术,包括IOC容器管理、AOP声明式事务、整合Struts2与Hibernate,以及SpringMVC与Struts2的对比。探讨了Spring Security与Shiro的安全管理特性,并详细介绍了Shiro的认证、授权过程及其核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 开发中主要使用 Spring 的什么技术 ?
    ①. IOC 容器管理各层的组件
    ②. 使用 AOP 配置声明式事务
    ③. 整合其他框架.

  2. 简述 AOP 和 IOC 概念
    AOP: Aspect Oriented Program, 面向(方面)切面的编程;Filter(过滤器)也是一种 AOP. AOP 是一种新的方法论 , 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充. AOP 的主要编程对像是切面(aspect), 而切面模块化横切关注点.可以举例通过事务说明.
    IOC: Invert Of Control, 控制反转. 也成为 DI(依赖注入)其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源.作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式.

  3. 在 Spring 中如何配置 Bean ?
    Bean 的配置方式: 通过全类名 (反射)、 通过工厂方法 (静态工厂方法 & 实例工厂方法)、FactoryBean

  4. IOC 容器对 Bean 的生命周期:
    ①. 通过构造器或工厂方法创建 Bean 实例
    ②. 为 Bean 的属性设置值和对其他 Bean 的引用
    ③. 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization 方法
    ④. 调用 Bean 的初始化方法(init-method)
    ⑤. 将Bean实例传递给Bean后置处理器的postProcessAfterInitialization 方法
    ⑦. Bean 可以使用了
    ⑧. 当容器关闭时, 调用 Bean 的销毁方法(destroy-method)

5.说一下struts2-hibernate-Spring 的工作流程?

1). Struts2 负责显示页面和接受请求
2). Spring 的 IOC 容器管理各个组件: 整合 Struts2,Hibernate 和 其他组件,AOP 完成声明式事务
3). Hibernate 提供 DAO 操作.

  1. Spring 如何整合 Struts2 ?

整合 Struts2, 即由 IOC 容器管理 Struts2 的 Action:
> 安装 Spring 插件: 把 struts2-spring-plugin-2.2.1.jar 复制到
当前 WEB 应用的 WEB-INF/lib 目录下
> 在 Spring 的配置文件中配置 Struts2 的 Action 实例
> 在 Struts 配置文件中配置 action, 但其 class 属性不再指向该Action 的实现类, 而是指向 Spring 容器中 Action 实例的 ID

  1. Spring 如何整合 Hibernate
    整合 Hibernate, 即由 IOC 容器生成 SessionFactory 对象, 并使用Spring 的声明式事务

    利用 LocalSessionFactoryBean 工厂 Bean, 声明一个使用 XML 映射文件的 SessionFactory 实例.
    利用 HibernateTransactionManager 配置 Hibernate 的事务管理器

  2. Spring MVC 比较 Struts2
    ①. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
    ②. Spring MVC 会稍微比 Struts2 快些. Spring MVC 是基于方法设计, 而 Sturts2 是基于类, 每次发一次请求都会实例一个 Action.
    ③. Spring MVC 使用更加简洁, 开发效率 Spring MVC 确实比 struts2 高: 支持 JSR303, 处理 ajax 的请求更方便
    ④. Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些.

  3. Spring MVC 的运行流程
    ①. 在整个 Spring MVC 框架中, DispatcherServlet 处于核心位置,负责协调和组织不同组件以完成请求处理并返回响应的工作
    ②. SpringMVC 处理请求过程:

    若一个请求匹配 DispatcherServlet 的请求映射路径(在 web.xml 中指定), WEB 容器将该请求转交给 DispatcherServlet 处理
    DispatcherServlet 接收到请求后, 将根据请求信息(包括 URL、 HTTP 方法、 请求头、 请求参数、 Cookie 等)及 HandlerMapping 的配置找到处理请求的处理器(Handler). 可将 HandlerMapping 看成路由控制器, 将 Handler 看成目标主机。
    当 DispatcherServlet 根据 HandlerMapping 得到对应当前请求的Handler 后,通过 HandlerAdapter 对 Handler 进行封装,再以统一的适配器接口调用 Handler。
    处 理 器 完 成 业 务 逻 辑 的 处 理 后 将 返 回 一 个 ModelAndView 给DispatcherServlet, ModelAndView 包含了视图逻辑名和模型数据信息
    DispatcherServlet 借助 ViewResoler 完成逻辑视图名到真实视图对象的解析
    得到真实视图对象 View 后, DispatcherServlet 使用这个 View 对ModelAndView 中的模型数据进行视图渲染

在这里插入图片描述

  1. 说出 Spring MVC 常用的 5 个注解:
    @RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy 、@ResponseBody

  2. 如何使用 SpringMVC 完成 JSON 操作:
    ①. 配置 MappingJacksonHttpMessageConverter
    ②. 使用 @RequestBody 注解或 ResponseEntity 作为返回值

12.比较 SpringSecurity 和 Shiro

相比 Spring Security, Shiro 在保持强大功能的同时, 使用简单性和灵活性
> SpringSecurity: 即使是一个一个简单的请求,最少得经过它的 8 个Filter
> SpringSecurity 必须在 Spring 的环境下使用
> 初学 Spring Security, 曲线还是较大, 需要深入学习其源码和框架, 配置起来也较费力.

13.Shiro 的优点

简单的身份认证, 支持多种数据源
对角色的简单的授权, 支持细粒度的授权(方法级)
支持一级缓存,以提升应用程序的性能;
内置的基于 POJO 企业会话管理, 适用于 Web 以及非 Web 的环境
非常简单的加密 API
不跟任何的框架或者容器捆绑, 可以独立运行

14.简述 Shiro 的核心组件

Shiro 架构 3 个核心组件:
> Subject: 正与系统进行交互的人, 或某一个第三方服务.
所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。
> SecurityManager: Shiro 架构的心脏, 用来协调内部各安全组件, 管理内部组件实例, 并通过它来提供安全管理的各种服务.
当 Shiro 与一个 Subject 进行交互时, 实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作。
> Realms: 本质上是一个特定安全的 DAO. 当配置 Shiro 时, 必须指定至少一个 Realm 用来进行身份验证和/或授权.
Shiro 提供了多种可用的 Realms 来获取安全相关的数据. 如关系数据库(JDBC), INI 及属性文件等.
可以定义自己 Realm 实现来代表自定义的数据源。

15.Shiro认证过程

①. 应用程序代码调用 Subject.login 方法,传递创建好的包含终端用户的 Principals(身份)和 Credentials(凭证)的 AuthenticationToken 实例
②. Subject 实例: 通常为 DelegatingSubject(或子类)委托应用程序的 SecurityManager 通过调用securityManager.login(token) 开始真正的验证。
③. SubjectManager 接收 token,调用内部的 Authenticator 实例调用 authenticator.authenticate(token).Authenticator 通常是一个 ModularRealmAuthenticator 实例, 支持在身份验证中协调一个或多个Realm 实例
④. 如果应用程序中配置了一个以上的 Realm, ModularRealmAuthenticator 实例将利用配置好的AuthenticationStrategy 来启动 Multi-Realm 认证尝试. 在Realms 被身份验证调用之前, 期间和以后,AuthenticationStrategy 被调用使其能够对每个Realm 的结果作出反应.
⑤. 每个配置的 Realm 用来帮助看它是否支持提交的 AuthenticationToken. 如果支持, 那么支持 Realm 的 getAuthenticationInfo 方法将会伴随着提交的 token 被调用. getAuthenticationInfo 方法有效地代表一个特定 Realm 的单一的身份验证尝试。
Shiro认证过程.png
在这里插入图片描述

16.Shiro授权过程

①. 应用程序或框架代码调用任何 Subject 的hasRole*, checkRole*, isPermitted*,或者checkPermission方法的变体, 传递任何所需的权限
②. Subject 的实例—通常是 DelegatingSubject(或子类), 调用securityManager 的对应的方法.
③. SecurityManager 调用 org.apache.shiro.authz.Authorizer 接口的对应方法.默认情况下,authorizer 实例是一个 ModularRealmAuthorizer 实例, 它支持协调任何授权操作过程中的一个或多个Realm 实例
④. 每个配置好的 Realm 被检查是否实现了相同的 Authorizer 接口. 如果是, Realm 各自的 hasRole
, checkRole*,isPermitted*,或 checkPermission* 方法将被调用。

Shiro授权过程.png
在这里插入图片描述

17.Shiro 如何自实现认证

Shiro 的认证过程由 Realm 执行, SecurityManager 会调用 org.apache.shiro.realm.Realm 的 getAuthenticationInfo(AuthenticationToken token) 方法. 实际开发中, 通常提供 org.apache.shiro.realm.AuthenticatingRealm 的实现类, 并在该实现类中提供 doGetAuthenticationInfo(AuthenticationToken token)方法的具体实现

18.如何实现自实现授权

实际开发中, 通常提供 org.apache.shiro.realm.AuthorizingRealm 的实现类,
并提供 doGetAuthorizationInfo(PrincipalCollection principals) 方法的具体实现

19.如何配置在 Spring 中配置使用 Shiro

①. 在 web.xml 中配置 Shiro 的 Filter
②. 在 Spring 的配置文件中配置 Shiro:
> 配置自定义 Realm:实现自定义认证和授权
> 配置 Shiro 实体类使用的缓存策略
> 配置 SecurityManager
> 配置保证 Shiro 内部 Bean 声明周期都得到执行的 Lifecycle Bean 后置处理器
> 配置AOP 式方法级权限检查
> 配置 Shiro Filter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值