- springmvc 和 struts 的区别是什么
- 拦截机制的不同
Struts2是类级别的拦截,每次请求就会创建一个Action。和Spring整合时ActionBean注入作用域是prototype;
SpringMVC是方法级别的拦截,方法基本上是独立的。在Spring整合时,Controller Bean默认单例模式Singleton。
所以,SpringMVC开发效率和性能高于Struts2。 - 底层框架的不同:Struts2采用Filter实现,SpringMVC则采用Servlet实现。
- 配置方面:spring MVC和Spring是无缝的。
39.如何避免 sql 注入?
- 什么是sql注入
客户端用户输入的变量或URL传递的参数是组成SQL语句的一部分,通过SQL语句,实现无账号登录,甚至篡改数据库。
如对语句select id, password from user where username=${username}
,如果传入的username值是;drop table user;
,则解析成的sql为select id, password from user where username=;drop table user;
,这会导致数据库被恶意篡改。 - 如何避免sql注入
① PreparedStatement(采用预编译,简单又有效的方法)
② 使用正则表达式过滤传入的参数(是否包含特殊字符)
③ 检查变量数据类型和格式 - 什么是sql预编译
但是很多情况,一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同。对于这类情况,可以将sql语句模板化或者说参数化,将值用占位符替代,这就是预编译。预编译能够一次编译、多次运行,此外还能防止sql注入。
简单总结,参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑。PreparedStatement
和mybatis
都是采用预编译功能避免sql注入。 - mybatis中的
$
和#
#
将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,而$
将传入的数据直接显示生成在sql中,因此#
方式能够很大程度防止sql注入。所以在编写MyBatis的映射语句时,尽量采用#{xxx}
这样的格式。若不得不使用${xxx}
这样的参数,要手工地做好过滤工作。
- spring 事务实现方式有哪些?
- 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法。对基于 POJO 的应用来说是唯一选择。
- 基于 TransactionProxyFactoryBean 的声明式事务管理
- 基于 @Transactional 的声明式事务管理
- 基于 Aspectj AOP 配置事务
- 什么是SpringMVC
- SpringMVC的核心组件
①DispatcherServlet
:中央控制器,把请求给转发到具体的控制类
②Controller
:具体处理请求的控制器
③HandlerMapping
:映射处理器,负责映射中央处理器转发给controller时的映射策略
④ModelAndView
:服务层返回的数据和视图层的封装类
⑤ViewResolver
:视图解析器,解析具体的视图
⑥Interceptors
:拦截器,负责拦截我们定义的请求然后做处理工作 - SpringMVC运行流程
SpringMVC运行流程图
①用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet
捕获;
②DispatcherServlet
对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping
获得该Handler
配置的所有相关的对象,最后以HandlerExecutionChain
对象的形式返回;
③DispatcherServlet
根据获得的Handler
,选择一个合适的HandlerAdapter
④提取Request
中的模型数据,填充Handler
入参,开始执行Handler(Controller)
。
⑤Handler
执行完成后,向DispatcherServlet
返回一个ModelAndView
对象;
⑥根据返回的ModelAndView
,选择一个适合的ViewResolver
返回给DispatcherServlet
;
⑦ViewResolver
结合Model
和View
,来渲染视图;
⑧将渲染结果返回给客户端。 - @RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性:
①value
:指定请求的实际地址,指定的地址可以是URI Template 模式;
②method
:指定请求的method类型, GET、POST、PUT、DELETE等;
③consumes
:指定处理请求的提交内容类型(Content-Type),例如application/json
,text/html
;
④produces
:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
⑤params
: 指定request中必须包含某些参数值是,才让该方法处理。
⑥headers
:指定request中必须包含某些指定的header值,才能让该方法处理请求。
-
什么是SpringBoot?
SpringBoot是一个框架,一种全新的编程规范,简化了Spring众多框架中所需的大量且繁琐的配置文件。所以 SpringBoot是一个服务于框架的框架,服务范围是简化配置文件,使编码变简单、配置变简单、部署变简单、监控变简单。
Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件。 -
什么是 SpringCloud
Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如
- 服务发现——Netflix Eureka
一个RESTful服务,用来定位运行在AWS地区的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。 - 客服端负载均衡——Netflix Ribbon
主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。 - 断路器——Netflix Hystrix
断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。 - 服务网关——Netflix Zuul
类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。 - 分布式配置——Spring Cloud Config
这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。
- Mybatisf分页方式和延迟加载
-
#{}
和${}
的区别
#{}
是预编译处理,调用PreparedStatement
的set
方法来赋值,将sql中的#{}
替换为?
号。可以有效的防止SQL注入,提高系统安全性。
${}
是字符串替换,就是把${}
替换成变量的值; - 几种分页方式
①数组分页:查询出全部数据,然后再list中截取需要的部分
②sql分页:在查询sql中利用limit
等方式限制返回条数
③拦截器分页:创建拦截器,拦截特定条件的语句。适合大数据量拦截。
④RowBounds
分页:mybatis接口加入RowBounds
参数。适合小数据量拦截。 - 延迟加载
Mybatis仅支持一对一和一对多关联集合对象的延迟加载。在Mybatis配置文件中,lazyLoadingEnabled=true|false
配置是否启用延迟加载。
以用户订单(一对多)为例:
在查询用户时,要不要把关联的订单信息查询出来?
在查询订单时,要不要把关联的用户信息查询出来?
对于第一个问题,应该是需要订单信息的时候才查询,没必要每次查询用户信息都把订单信息也查询出来。这就是延迟加载,在真正的使用数据时才发起查询,不用的时候不查。按需加载(懒加载)。
对于第二个问题,我们就可以在查询订单信息的时候查询出关联的用户信息。这就是立即加载,不管用不用,只要一调用方法,马上发起查询。
-
Mybatis缓存机制
缓存机制减轻数据库压力,提高数据库性能,分为一级缓存和二级缓存
- 一级缓存(
sqlsesson
缓存)
当第一次执行 select 完毕会将查到的数据写入SqlSession
内的HashMap
中缓存起来;第二次执行select
的同传参数一样就会从缓存中查数据。
注意:
①缓存的数据只在SqlSession
内有效,当SqlSession
结束后那么他里面的一级缓存也就不存在了。
②HashMap
是SqlSession
会话对象用于存储缓存数据的,使用[namespace:sql:参数]
作为key
,此HashMap
是当前会话对象私有的。
③mybatis 默认开启一级缓存,不需要配置。
④如果SqlSession
执行了 DML (insert、update、delete)操作并提交了,那么 mybatis 就会清空当前SqlSession
缓存中的所有数据。 - 二级缓存(
mapper
缓存)
二级缓存与一级缓存其机制相同,默认也是采用HashMap
存储,不同在于其存储作用域为 Mapper(Namespace)。当多个SqlSession
使用同一个Mapper
操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。二级缓存默认是没有开启的,需要在 setting 全局参数中配置。
流程:
①当一个sqlseesion
执行了一次select
后,在关闭此session
的时候,会将查询结果缓存到二级缓存
②当另一个sqlsession
执行select
时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能
-
mybatis 执行器
Mybatis有三种基本的执行器(Executor):
-
SimpleExecutor
:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。 -
ReuseExecutor
:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。 -
BatchExecutor
:执行update,将所有sql都添加到批处理中,等待统一执行。它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理
- mysql 常用的引擎
- InnoDB 引擎
①提供了对数据库 acid 事务的支持
②提供了行级锁和外键的约束
③InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引
④不支持全文搜索,同时启动也比较的慢,不会保存表的行数
⑤适用于写多读少的情况 - MyIASM 引擎
①不提供事务的支持
②不支持行级锁和外键,只有表锁
④保存了表的行数
⑤适用于读多写少的情况
- jvm 的主要组成部分?
- 类加载器(ClassLoader):把 Java 代码转换成字节码
- 运行时数据区(Runtime Data Area):把字节码加载到内存中
- 执行引擎(Execution Engine):将字节码翻译成底层系统指令
-
本地库接口(Native Interface):CPU 执行底层系统指令
jvm运行时数据区
网友评论