jd面试之感

时间:2022-07-16 15:04:23

一面问题:问题都回答的很好,顺利进入二面

1.单点登录的改造和原理

2.hashmap

3.jvm:堆、方法区、栈,本地方法栈,gc,gc的方式

4.spring的ioc、aop的实现方式cglib和jdk动态代理

5.系统中分布式事务处理

6.mybaits的#和$区别关于sql注入

#相当于对数据 加上 双引号,$相当于直接显示数据

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".  

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id 3. #方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

7.23种设计模式 工厂模式、手写单例模式

8.网络层、物理层、数据链路层、协议层、会话层、应用层、传输层7种协议

9.http为什么是无状态的问题

"无状态":HTTP协议不具备保存之前发送过的请求或响应的功能

也正是由于“无状态”,可以处理大量的事务,确保了协议的可伸缩性

即使“无状态”,有了Cookie再使用HTTP协议通信,就可以管理状态了

10.java多线程中的悲观锁和乐观锁

一:悲观锁

悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。

syncrhoized是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。所以syncrhoized是一种悲观锁,凡是用syncrhoized加了锁的多线程之间都会因锁的争夺结果导致挂起、唤醒等开销。

二:乐观锁

获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销,或者假设没有冲突而去完成同步代码块如果冲突再循环重试,或者采取申请锁失败后不立刻挂起而是稍微等待再次尝试获取 等待策略,以减少线程因为挂起、阻塞、唤醒(发生CPU的调度切换) 而造成的开销。

偏向锁、轻量级锁(CAS轮询)、自旋锁 就是基于上述思路的乐观锁。

在多线程的加锁机制中,JVM会首先尝试乐观锁,失败后才调用悲观锁。

11.多线程的callable 和Future?

http://blog.csdn.net/zhuangxingrui86/article/details/7865677

12.hashmap和corruntmap的区别

13.怎么优化系统?

缓存、静态化、数据库优化

二面估计是技术老大,针对的是我简历上写的自己的知识扩展,一直加班,没有准备,就没敢瞎扯,没聊到半小时,就结束了,很官方的结束了,唉,还是得多准备

1.系统中的安全性问题

xss、csrf攻击、sql注入、怎么防止sql注入,系统中怎么做的

http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

2.mongdb和hbase

3.数据库的问题,问了我mysql是读什么事务数据

数据库特性:原子性、一致性、隔离性、持久性

MySQL数据库为我们提供的四种隔离级别:

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);

而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

http://www.cnblogs.com/fjdingsd/p/5273008.html

事务的7种传播行为:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

4.redis和memcached的区别和好处?redis存储类型?zset和list的区别?

String 、list、set、zset、hash

https://www.cnblogs.com/liangzia/p/5731403.html