上一篇:Java经典面试题整理及答案详解(三)
Java经典面试题第四弹来啦!本节小编整理了关于Java开发框架常见的几道面试题,希望大家多多练习,一起进步~
1.SpringMVC返回值,使用SpringMVC的时候我看到两种风格的开发,一种是控制层的方法返回值类型主要是ModelAndView(就如我们的BSM项目),另外一种风格是返回值Spring类型,在开发中要怎么取舍?
从简单来讲就是ModelAndView,如果只是做一个过渡,符合MVC标准设计,可能有人就会认为返回ModelAndView需要实例化新对象太麻烦了,就直接返回String。
MVC的设计角度在于你需要通过控制层传输相应的对象信息给显示层来进行显示,而且业务层也会返回Map数据,这个时候就希望可以把Map的数据直接传递到JSP里面,这样的话使用ModelAndView就很简单。最关键的是ModelAndView整体的处理来讲是很容易的,只是一个跳转的页面路径,以及相关的属性设置,可以帮助一些基础不牢固的人员不使用错误的属性范围,例如:request。(如果要想更好的理解细节,那么就必须在项目之中感受。)
2.Hibernate是不是只能与Struts2组合才好?我怎么没看到SpringMVC+Hibernate的组合?
Hibernate实现的是一个数据层的开发框架,数据层是不会与MVC层产生任何直接联系,必须通过控制层与业务层来进行操作的处理后才可以使用。
最初的时候(2005)开始流行这个框架开发,使用最多的就是Struts1.X、Hibernate、Spring,而后就形成SSH的开发框架。现在的环境出现了改变,因为MyBatis出现之后会有人觉得Hibernate操作过于频繁,而MyBatis的开发更加简单。正因为如此,对于整体新项目设计而言就不会再过多的去考虑Hibernate了,基本上都是使用MyBatis开发框架。同时,在这个时期之后SpringMVC开始流行了,因为Struts毕竟需要与Spring整合,有人认为麻烦,现在对于开发就可能有如下几种结构:
Struts 2.X+Hibernate+Spring;
Struts 2.X+MyBatis+Spring;
SpringMVC+Hibernate;
SpringMVC+MyBatis。
3.SSH整合
SSH整合实际上需要考虑到一个核心的问题:Struts之所以要整合到Spring之中主要是希望可以利用里面的IOC&DI机制实现业务层接口对象的注入处理,如果不使用Spring去管理Struts,那么无法直接利用容器注入的模式来实现业务层接口对象的配置,这样整个的整合效果就会出现严重的问题。
从另外一个角度来讲,虽然Struts支持Spring管理,但毕竟Spring属于两个开发框架,所以从2016年开始许多互联网公司的开发都不再选择使用Struts 2.x,但这并不表示Struts 2.x没有人使用,许多传统公司还在使用着。
4.ShiroRealm机制
Realm是几乎所有的认证授权框架都具备的一个概念,Realm本身有两层含义:
(1)进行用户的认证处理:主要是进行用户名或密码的判断,同时还可以判断出该用户是否被锁定;
(2)用户的授权处理:进行角色或权限认证,而且这里的认证所需要的就是根据用户名查询角色或权限标记。对于授权处理需要一些特殊处理方式:授权的操作在实际检测之中有两类:
——实时授权检测:修改了一个用户的角色或权限之后该配置立即生效,而且立即影响到已登陆的用户,这样的操作需要频繁进行数据库的查询处理,所以一般不建议使用;
——非实时授权检测:因为用户的角色和权限几乎很少会被改动,所以这样频繁的进行数据库的查询,性能会比较差。在实际开发之中,会考虑在用户第一次使用角色和权限的时候将数据信息查询出来。如果是单节点,会将授权信息保存在内存里(EhCache),如果是分布式集群,会将这些信息保存在Redis里面,总之就一个原则,不要在用户授权检测的时候重复查询数据库即可。
总结:ShiroRealm有一套自己的Session,在WEB中该Session会在HttpSession里面保存数据,但用户看不见这些。所有的授权处理一定要使用缓存,否则会影响程序性能。
5.Shiro中的Session与HttpSession的关系是什么?
如果说你现在使用的不是WEB程序,而是一个Java程序,那么Shiro中的认证与授权依然有效。可以得出一个结论:Shiro有一套自己维护的“Session”机制(不等同于HttpSession),如果要在WEB中应用,实际上就表示该Shiro Session要结合HttpSession一起使用,也就是说在Shiro Session中保存的内容在WEB容器里面实质上是保存在了HttpSession里面。
理解为:HttpSession中存在一个指定的Shiro属性,Shiro在设计的时候考虑到了用户的使用习惯,所以对于一些用户的身份信息,会将这些身份信息保存在Session里面,用户也可以直接利用Session属性取得相关的身份信息。
6.Shiro与Redis整合操作
前提是你的系统之中有多个WEB容器,并且使用了负载均衡,例如:Nginx。
如果要想实现Session数据的共享,那么需要继承一个默认的企业SsessionDAO管理器:
里面就是针对Redis数据的CRUD操作。
如果要想实现缓存数据的共享(角色或者权限),那么就去继承一个默认的缓存管理器:
CacheManager、同时还需要去实现一个Cache的接口的子类才可以实现这样的共享操作。
在整个流程之中你还需要考虑Tomcat的Session缓存。
如果想要实现缓存:需要知道Nginx、Shiro的具体操作类的方法、Jedis工具类、Redis使用,这样才能去做集群的Session的缓存处理过程。
更多专业知识,面试技巧就在面试一点通,持续更新中……
感谢浏览~
本内容来源于阿里云大学-Java面试技巧