对象拷贝
为什么使用克隆
相对一个对象进行处理,又想保留原有的数据,就需要使用克隆。java中使用克隆针对的是类的对象。
如何实现克隆
- 实现
cloneable
接口并重写Object类中的clone方法 实现
Serializable
接口,通过对象的序列化和反序列化实现对象克隆,可以实现真正的深度克隆。因为对象的引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。public class Outer implements Serializable{
private static final long serialVersionUID = 369285298572941L; //最好是显式声明ID
public Inner inner;
//Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]
public Outer myclone() {
Outer outer = null;
try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
// 将流序列化成对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
outer = (Outer) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return outer;
}
}
深度拷贝和浅拷贝的区别
对于基本类型,两者没有区别
对于对象类型,浅拷贝只是复制了对象的引入地址,拷贝前后变量还是指向同一个地址空间,对变量的修改会影响还是会有副作用。而深度拷贝是将对象及其值复制过来,对变量的修改不会影响到拷贝前的变量。
JavaWeb
jsp和servlet区别
jsp经编译后变成了servlet。(jsp的本质是servlet,JVM只能识别java类,不能识别jsp,Web容器将jsp的代码编译变成jvm能够识别的java类)
- jsp更擅长页面显示,servlet更擅长于逻辑控制
-
Session和Cookie
什么是Cookie
Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。主要用在:
会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
-
什么是Session
Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。Servlet中提供了HttpSession 接口
HttpSession session = request.getSession();
Session和Cookie的区别
关联
http协议是无协议的,服务器无法识别两个请求是否是同一个用户发出的。无状态这个特性对于开发人员是不友好的,因为在实际开发中有时候需要跟踪用户。Cookies和Session技术都是为了使无状态的HTTP成为有状态的。
不同点
存储位置不同,Cookies保存在客户端,Session保存在服务端
- 存储大小不同, 单个Cookie保存的数据不能超过4K,Session可存储数据远高于 Cookie
存取方式不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等
浏览器禁用cookie怎么办?
每次请求中都携带一个 SessionID 的参数,也可以 Post 的方式提交,也可以在请求的地址后面拼接xxx?SessionID=123456…
Token 机制。Token 机制多用于 App 客户端和服务器交互的模式,也可以用于 Web 端做用户状态管理
分布式session的解决方案
在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器共同来支撑前端用户请求,那如果用户在 A 服务器登录了,第二次请求跑到服务 B 就会出现登录失效问题。
分布式 Session 一般会有以下几种解决方案:Nginx ip_hash 策略,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。
- Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
- 共享 Session,服务端无状态话,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。
扩展阅读
【面试题】你真的了解 Cookie 和 Session 吗?
避免sql注入
- 使用预编译的语句,即prepareStatement
- 使用黑名单,禁止高危字符
-
什么是XSS攻击,如何避免
XSS攻击又称CSS攻击(Cross site script),跨站脚本攻击。其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。
XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。什么是CSRF攻击,如何避免
CSRF(Cross-site request forgery)也被称为 one-click attack或者 session riding,中文全称是叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。
如何避免: 使用验证码,不太友好
- 在请求中添加csrf token
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有token或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于session之中,然后在每次请求时把token 从 session 中拿出,与请求中的 token 进行比对
网络
设计模式
常用的设计模式
Spring
为什么要使用Spring
- 解决企业应用开发的复杂性
- 使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
简单来说,Spring使用一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖与Spring的特定类。
AOP
什么是AOP
AOP(Aspect-Oriented Pragramming)是面向切面编程,可以说是OOP(Object-Oriented Programing)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
AOP简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点,如日志处理、权限判断等。
AOP的使用场景
IoC
什么是IoC
IOC(Inversion of Contrllor),控制反转。没有引入IoC前,被依赖的对象的控制权是在当前对象手中的,对象主动去创建依赖的对象。引入IOC后,被依赖对象的控制权就从转移到了Spring容器中,对象不再主动去寻找依赖,而是由Spring容器框架在对象初始化时注入进入。所以称之为“控制反转”
Spring有哪些模块
Spring模块已经继承了20多个模块。主要包括核心容器(Beans,context)、数据访问/继承(JDBC,ORM)、web(servlet)、aop、测试、工具、消息
Spring常用的注入方式
Spring通过DI(依赖注入)实现IOCi,常用的注入方式有
- 基于注解的注入(@Autowired)
- 通过setter方法
-
Spring的Bean是线程安全的吗
Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。
重点阅读: Spring的Bean是线程安全的吗Spring支持几种Bean的作用域
singleton(单例):默认的作用域方式,Spring IoC容器中,使用singleton定义的Bean只会有一个实例
- prototype(原型):每次通过容器的
getBean
方法获取时,都会产生一个新的对象实例。一旦创建成功,Spring容器不再跟踪该实例,也不会维护该实例的状态。 - Request:每个Request请求都将产生一个新的对象实例
- Session:同一个会话共享一个Bean对象
-
Spring装配Bean的方式有哪些
隐式的Bean自动发现和装配机制
- 显示地通过XML配置
- 显示地通过JavaConfig配置
Spring的事务实现方式有哪些
- TODO
谈谈Spring的事务隔离
谈谈Spring MVC的执行流程
Spring MVC有哪些主键
RequestMapping的作用
Autowired的作用
SpringBoot/Spring Cloud
什么是SpringBoot
SpringBoot是一个框架,其主要作用是简化了Spring框架的使用,使得配置变得简单SpringBoot的配置文件有哪几种类型
properties和ymal文件,前者使用等号连接键值对,后者通过空格来表明变量的层级关系哪些方式实现热部署
- spring loaded
-
jpa和hibernate的区别
什么是spring cloud
spring cloud断路器的作用
spring cloud的核心组件有哪些
Hibernate
Mybatis
#{}和${}的区别
{}是预编译处理,${}是字符串替换
- Mybatis在处理#{}时,会将sql中的#{}替换成?号,再调用
PreparedStatement
的set方法来赋值 - Mybatis在处理${}时,就是把${}替换成变脸的值
-
Mybatis有几种分页方式
数组分页
- sql分页
- 拦截器分页
- RowBounds分页
Mybatis的逻辑分页和物理分页的区别
- 物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。
- 物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,然而其它性能上的优点足以弥补这个缺点。
谈谈Mybatis的一级缓存和二级缓存
TOODMybatis和Hibernate的区别
- Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
- Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
- Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
Mybatis分页插件的原理
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。Mybatis如何编写一个自定插件
TOODRabbitMQ
Kafka
Zookeeper
Mysql
Redis
JVM