还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
😝朋友们如果有需要的话,可以联系领取~
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
2️⃣视频配套工具&国内外网安书籍、文档
① 工具
② 视频
③ 书籍
资源较为敏感,未展示全面,需要的最下面获取
② 简历模板
因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Configuration
:初始化基础配置,比如MyBatis
的别名等,一些重要的类型对象,如插件,映射器,ObjectFactory
和typeHandler
对象,MyBatis
所有的配置信息都维持在Configuration
对象之中。SqlSessionFactory
:SqlSession
工厂。SqlSession
:作为MyBatis
工作的主要顶层API
,表示和数据库交互的会话,完成必要的数据库增删改查功能。Executor
:MyBatis
的内部执行器,它负责调用StatementHandler
操作数据库,并把结果集通过ResultSetHandler
进行自动映射,另外,它还处理二级缓存的操作。StatementHandler
:MyBatis
直接在数据库执行SQL
脚本的对象。另外它也实现了MyBatis
的一级缓存。ParameterHandler
:负责将用户传递的参数转换成JDBC Statement
所需要的参数。是MyBatis
实现SQL
入参设置的对象。ResultSetHandler
:负责将JDBC
返回的ResultSet
结果集对象转换成List
类型的集合。是MyBatis
把ResultSet
集合映射成POJO
的接口对象。TypeHandler
:负责Java
数据类型和JDBC
数据类型之间的映射和转换。MappedStatement
:MappedStatement
维护了一条<select|update|delete|insert>
节点的封装。SqlSource
:负责根据用户传递的parameterObject
,动态地生成SQL
语句,将信息封装到BoundSql
对象中,并返回。BoundSql
:表示动态生成的SQL
语句以及相应的参数信息。
1.2. 执行过程
2. 实现步骤
- 写一个实现
org.apache.ibatis.plugin.Interceptor
接口的拦截器类,并实现其中的方法。 - 添加
@Intercepts
注解,写上需要拦截的对象和方法,以及方法参数。 Spring
项目注意添加@Component
注解即可,使其成为Spring
管理的一个Bean
。
2.1. 添加注解
MyBatis
拦截器默认可以拦截的类型只有四种,即四种接口类型Executor
、StatementHandler
、ParameterHandler
和ResultSetHandler
。对于我们的自定义拦截器必须使用MyBatis
提供的@Intercepts
注解来指明我们要拦截的是四种类型中的哪一种接口。
注解 | 描述 |
---|---|
@Intercepts | 标志该类是一个拦截器 |
@Signature | 指明该拦截器需要拦截哪一个接口的哪一个方法 |
@Signature
注解的参数:
参数 | 描述 |
---|---|
type | 四种类型接口中的某一个接口,如Executor.class 。 |
method | 对应接口中的某一个方法名,比如Executor 的query 方法。 |
args | 对应接口中的某一个方法的参数,比如Executor 中query 方法因为重载原因,有多个,args 就是指明参数类型,从而确定是具体哪一个方法。 |
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
@Signature(type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}),
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
2.1.1. type
MyBatis
拦截器默认会按顺序拦截以下的四个接口中的所有方法:
org.apache.ibatis.executor.Executor //拦截执行器方法
org.apache.ibatis.executor.statement.StatementHandler //拦截SQL语法构建处理
org.apache.ibatis.executor.parameter.ParameterHandler //拦截参数处理
org.apache.ibatis.executor.resultset.ResultSetHandler //拦截结果集处理
具体是拦截这四个接口对应的实现类:
org.apache.ibatis.executor.CachingExecutor
org.apache.ibatis.executor.statement.RoutingStatementHandler
org.apache.ibatis.scripting.defaults.DefaultParameterHandler
org.apache.ibatis.executor.resultset.DefaultResultSetHandler
2.1.2. method
这个可以根据MyBatis
源码了解下。
2.1.3. args
根据参数类型区分重载的方法。
2.2. 方法实现
2.2.1. intercept
进行拦截的时候要执行的方法。该方法参数Invocation
类中有三个字段:
private final Object target;
private final Method method;
private final Object[] args;
可通过这三个字段分别获取下面的信息:
Object target = invocation.getTarget();//被代理对象
Method method = invocation.getMethod();//代理方法
Object[] args = invocation.getArgs();//方法参数
拦截接口 | 接口实现类 |
---|---|
Executor | CachingExecutor |
StatementHandler | RoutingStatementHandler |
ParameterHandler | DefaultParameterHandler |
ResultSetHandler | DefaultResultSetHandler |
2.2.2. plugin
插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截进而决定要返回一个什么样的目标对象,官方提供了示例:return Plugin.wrap(target, this);
,可以在这个方法中提前进行拦截对象类型判断,提高性能:
@Override
public Object plugin(Object target) {
//只对要拦截的对象生成代理
if(target instanceof StatementHandler){
//调用插件
return Plugin.wrap(target, this);
}
return target;
}
MyBatis
拦截器用到责任链模式+动态代理+反射机制;
所有可能被拦截的处理类都会生成一个代理类,如果有N
个拦截器,就会有N
个代理,层层生成动态代理是比较耗性能的。而且虽然能指定插件拦截的位置,但这个是在执行方法时利用反射动态判断的,初始化的时候就是简单的把拦截器插入到了所有可以拦截的地方。所以尽量不要编写不必要的拦截器。另外我们可以在调用插件的地方添加判断,只要是当前拦截器拦截的对象才进行调用,否则直接返回目标对象本身,这样可以减少反射判断的次数,提高性能。
2.2.3. setProperties
如果我们拦截器需要用到一些变量参数,而且这个参数是支持可配置的,类似Spring
中的@Value("${}")
从application.properties
文件获取自定义变量属性,这个时候我们就可以使用这个方法。
(1)在application.properties
文件中添加配置:
mybatis.config-location=classpath:mybatis-config.xml
(2)在resources
目录下添加mybatis-config.xml
配置文件,并添加插件和属性配置。添加完需要注意去掉自定义MyBatis
拦截器上的@Component
注解,否则该拦截器相当于注册了两个,会执行两遍拦截方法。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.example.demo.mapper.plugin.MyPlugin">
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
***93道网络安全面试题***
![](https://i-blog.csdnimg.cn/blog_migrate/e8e8e04f5f05fdeb34634b0b3780bd33.png)
![](https://i-blog.csdnimg.cn/blog_migrate/99d4e30cb19514a36725fd71dd8b3308.png)
![](https://i-blog.csdnimg.cn/blog_migrate/79019216a46e2955b8c154ad933e9c8c.png)
内容实在太多,不一一截图了
### 黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
#### 1️⃣零基础入门
##### ① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。
![image](https://i-blog.csdnimg.cn/blog_migrate/9e5c1ca69284d5344a87a1e01fe18208.gif#pic_center)
##### ② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
![image-20231025112050764](https://i-blog.csdnimg.cn/blog_migrate/b84394276be4f7fcf4d176fa628748ac.png#pic_center)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**