1.new Integer(100)和Integer.valueOf(100)区别

一个是new对象,一个是从缓存中拿

-128~127

2.CPU彪增如何解决

先top命令 找到占用率最高的进程

ps -mp 2308 -o Thread,tid,time 找到占用率最高的线程 发现是2320 线程,再转换为10进制

jstack 2308 | grep 910

分析


 3.MVC各层

MVC是一种常用的软件架构模式,它将应用程序分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。各层技术如下:

1. 模型层(Model):用于管理应用程序中的数据和相关业务逻辑,通常使用数据库和数据访问技术实现。常用的技术包括JPA、Hibernate、MyBatis等。

2. 视图层(View):用于呈现应用程序的用户界面,通常使用HTML、CSS、JavaScript等技术实现。在Web应用中,常用的技术包括JSP、Thymeleaf、Freemarker等。

3. 控制器层(Controller):用于协调模型层和视图层之间的交互,处理用户的请求并相应地调用模型层的方法。常用的技术包括SpringMVC、Struts、Servlet等。

好处
  1. 易于维护和扩展:MVC 架构将应用程序按照职责分为三个部分,每个部分之间的耦合性较低,因此更加容易维护和扩展。比如,修改模型不会影响视图和控制器,修改控制器也不会影响模型和视图。

  2. 模块化设计:MVC 架构将应用程序按照职责分为三个部分,每个部分之间的耦合性较低,可以独立地开发和测试每个部分,从而实现模块化的设计。

  3. 视图和模型分离:MVC 架构将视图和模型分离,视图只负责显示数据,模型只负责处理数据。这种分离使得可以方便地修改视图或模型,而不会影响到另一个部分。

  4. 多人协作:使用MVC架构可以实现模块化的设计,每个人负责一个模块,这样不同的人负责不同的部分,在执行任务时可以提高效率,提高项目的开发效率。

4.JWT实现登录功能

分为社交登录和账号密码登录

用户输入账号密码后,后端进行验证,查询数据库进行匹配

有签名,防止参数被篡改

 如何续命

双token方案

登录成功以后,后端返回 access_token 和 refresh_token,客户端缓存此两种token;

使用 access_token 请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token 调用token刷新接口获取新的 access_token;

后端接受刷新token的请求后,检查 refresh_token 是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。

客户端携带新的 access_token 重新调用上面的资源接口。

客户端退出登录或修改密码后,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_toke。

5.cookie,session,token区别

他们主要的作用就是登录验证

首先咱们http是无状态的,什么是无状态,就是服务器记不住东西,如果想让服务器有记忆,那么cookie就出现了


1. Cookie

浏览器发给服务器请求,比如输入账号密码,服务器会set-cookie后返回给客户端,可以设置过期时间,但cookie(账号密码)保存在客户端不安全。

2. Session
session是存储在服务端的,是基于cookie的,浏览器第一次发请求时,比如输入账号密码,在服务端会创建一个jsessionid

{
    jsessionId:63sa754d4f//存在服务器的内存里
    username:123
    password:456
}

和域名绑定,只是针对某个域名,发请求才携带cookie,分布式项目需要解决子域的session共享问题, springsession解决

然后返回给客户端一个jsessionid,之后每次请求都会携带jsessionid,服务端就去做验证

3. Token

通常存储在客户端,可以是浏览器的本地存储,例如LocalStorage或SessionStorage,

Token通常存储在客户端,可以是浏览器的本地存储,例如LocalStorage或SessionStorage,也可以是在客户端内存中,每次请求都会携带token,服务端会根据相应的秘钥对其进行验证

6.登录如何做

使用jwt做

首先,前端把敏感信息通过公钥加密,然后再传到后端。后端返回一个jwt,留作下次前端访问时携带。这时会有一个问题,如果此时jwt被黑客截取,那么黑客不就可以永远登录了吗?

如果黑客成功截取了第一次从后端传递给前端的 JWT,那么他可以使用该 JWT 进行登录。这是因为 JWT 的核心就是利用签名机制来防止篡改和伪造,而在第一次生成 JWT 并传递给前端的过程中,JWT 的签名是根据服务器端的密钥生成的,这个密钥是黑客不知道的。但是,一旦黑客获取了这个 JWT,他就可以使用该 JWT 进行登录,因为 JWT 中包含了用户的身份信息以及有效期等信息,后端会根据这些信息来判断用户是否有访问权限。

为了避免黑客利用被截取的 JWT 进行登录,我们可以采取以下措施:

1.使用https做为网络协议进行传输

2.定期更换秘钥,如果秘钥变了,黑客再登录时,后端验签肯定不行

3.缩短jwt的时间

黑客的问题解决了,那么jwt续命的问题还没解决,可以使用双token方案

最后还有一个问题,总是被ddos攻击怎么办?

可以增加服务器带宽,也可以验证你是不是人,也可以弄一个黑白名单封ip。但没啥用,直接接入高防服务器,让他们去解决。

7.单点登录

单点登录就是,登录一位置的系统,其余多系统同时登陆的技术

单点登录(Single Sign-On,SSO)是一种身份认证和授权机制,允许用户使用一组凭证(如用户名和密码)登录到多个应用程序中。

  1. 使用cookie来做

  2. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;

  3. sso认证中心发现用户未登录,将用户引导至登录页面;

  4. 用户输入用户名密码提交登录申请;sso认证中心校验用户信息,如果成功,就创建授权令牌,之后保存一个cookie, 留下一个登录痕迹;

  5. sso认证中心带着令牌跳转会最初的请求地址(系统1);

  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效;

  7. sso认证中心校验令牌,返回有效,注册系统1;

  8. 系统1使用该令牌创建与用户的会话,并把令牌保存在会话里,返回受保护资源;

  9. 用户访问系统2的受保护资源;

  10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;

  11. sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌;

  12. 系统2拿到令牌,去sso认证中心校验令牌是否有效;

  13. sso认证中心校验令牌,返回有效,注册系统2;系统2使用该令牌创建与用户的局部会话,返回受保护资源。

比较麻烦,不安全,信息存在用户端

2.OAuth2.0单点登录

成本比较高,信息存在服务器端,比较安全

篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处】即可免费获取

8.如何对接短信接口

1.引依赖

2.复制一手工具类

3.把秘钥放入请求头中

4.把电话和短信内容和密码放入map中

5.调用工具类的方法给第三方平台发请求,

13.社交登录

可以做微博,qq等第三方登录,扫码或者输入账号密码

 

9.调优经验

1.查询调优

少用连表查询,多用vo封装。因为连表查询是非常慢的,效率非常低。

在特别耗时等功能,比如发短信,发邮件。使用异步的方式

2.jvm调优

大部分jvm调优就是减少fullgc的次数,因为fullgc代表着整个堆的垃圾回收,而垃圾回收会伴随着stw,用户体验感不好。

如何降低fullgc,根据具体问题具体分析,可以设置年轻代和老年代比例,也可以设置伊甸园区和from to区的比例,也可以更换垃圾回收器。这些都是具体问题具体分析。

3.数据库调优

总共分7步

1.sql优化

减少对数据库的访问次数,小表驱动大表,行裁剪,列裁剪,避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。unionall(组合两张字段相同的表,不去重)代替union,exists代替distinct,用exists代替in

2.索引优化

3.表结构优化

4.数据量实在太大就算走索引也很慢,就需要分库分表

分库(垂直拆分):一般不会这么做,会使事务问题变复杂

分表(水平拆分):按条件,时间,地区等分成多个表,但中间会加一个代理层mycat,shardingsphere

5.基本设置优化

连接数设置,慢查询设置

6.硬件优化

包括服务器硬件和网络带宽,这一部分是运维来做,我就不细说了

4.架构的优化

比如把常用的数据放在缓存中,比如使用负载均衡和水平扩展可以高效的处理请求,用nginx做动静分离,把静态页面都放在nginx,使用nginx来分担服务器压力,使用keepalived做故障转移

10.接口幂等性问题

接口幂等性问题是指在一次或多次请求后,返回结果不变的问题。常见的情况包括网络超时、客户端重试、服务端异常等原因导致同一个请求被多次执行。如何处理接口幂等性问题,以下是一些建议:

1.前端的按钮只能点击一次

2.增加一个状态字段,比如正在支付的订单状态为进行中,如果用户重复支付,因为订单id相同,查数据库如果订单正在支付就返回订单正在支付中.

3.加唯一索引,在重复添加数据时会出现异常

4.token机制,后端生成一个全局唯一token,加入redis,每次调用接口就带着这个token,之后从redis中拿出令牌对比,两个令牌相同就删除token.但需要保证这三个操作的原子性问题如果服务端由于网络延迟导致接口重复调用,因为令牌每次都是一个,所以也不会有幂等性问题,比如说生成订单的时候就同时生成一个防重令牌token,放入redis中,提交订单就携带这个token,再去redis查,最后再对比.可以解决订单重复提交的问题

5.乐观锁,加一个版本号字段,update的时候去判断版本号

11.流的分类

12.String为什么是不可变类

这是因为String类具有不可变性,即一旦创建了一个String对象,它的值就不能被修改。如果String类可以被继承,那么子类可能会修改父类中的字符串值,从而破坏了String类的不可变性。

String类的不可变性有以下几个好处:线程安全:由于String对象的值不可变,因此多个线程可以同时访问同一个String对象,而不需要担心线程安全问题。

13.反射的原理

jvm通过类加载器把类加载到内存中,一旦加载进来就会产生一个Class对象,我们就可以通过newInstance的方法来动态的创建对象

14.动态代理的原理

动态代理的原理是通过反射机制,在运行时动态地生成代理类。代理类实现了与被代理对象相同的接口,并在代理类中维护了一个被代理对象的引用。当代理类的方法被调用时,它会将方法调用转发给被代理对象,并在调用前后执行一些额外的逻辑,如记录日志、统计执行时间等。

Java中提供了两种动态代理方式:基于接口的动态代理和基于类的动态代理。基于接口的动态代理是通过Java的反射机制在运行时创建一个实现了指定接口的代理类,而基于类的动态代理是通过继承一个指定类来创建代理类。

动态代理的优点在于它能够在运行时动态地为对象添加额外的功能,而不需要修改原始类的代码。这种方式可以提高代码的复用性和灵活性,同时也可以减少代码的重复。

15.Arrays.sort的原理

一种混合排序算法,是多个排序算法合一起的混合排序。比如在某某区间到某某区间用什么排序,在某某区间到某某区间又用什么排序。这个排序算法不仅仅是java常用的算法,别的语言也用这个算法,说明这个算法的强大。

 篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处】即可免费获取

16.面向对象和面向过程的区别

面向对象(Object-oriented programming,OOP)和面向过程(Procedure-oriented programming,POP)是两种不同的编程范式。

面向过程是一种以过程为中心的编程方式,以实现为核心,将系统分解成若干个可单独独立实现的过程(函数或方法)。程序的执行流程是从一个过程转移到另一个过程,同时一些数据通过参数进行传递。对于复杂的问题,面向过程可能会导致代码繁琐和难以扩展。

面向对象则是一种以对象为中心的编程方式,将系统看作一个由对象组成的集合,对象之间通过消息传递来协同工作。每个对象都有自己的状态和行为,状态是对象的属性,行为则是对象的方法。对象可以根据需要随时创建、销毁和发送消息。面向对象的思想更具有灵活性和维护性。

面向对象的优势主要体现在下面几个方面:

  1. 可维护性:OOP 使得代码编写更加清晰、简洁,便于维护和扩展。

  2. 可重用性:OOP 支持代码的复用,使得开发人员可以编写和测试一些通用的、可重用的类,从而提高开发效率。

  3. 可扩展性:OOP 具有高度的灵活性和扩展性,对象之间的关系虽然复杂,但是可以在不影响其他部分的情况下添加新功能、新对象和新类。

  4. 松耦合:OOP 可以将封装性和继承带来的低耦合性高度融合,对象只与其它必需通信的对象产生联系,系统更加灵活。

  5. 代码的真实性:面向对象的语言中,对象模型往往是很贴切于问题本身的,因此编写出来的代码更有代表性,更能反映出问题的真正面貌。

面向对象具有很多优点,尤其适用于需要复杂数据类型或涉及许多对象交互的程序设计。同时,它也并不意味着就是万能的,不同的需求和场景可能需要不同的编程范式。

22.面向对象的三大特征

  • 封装:使数据更加安全。可以使用private,public等关键字控制访问权限

  • 继承:继承是让一个类具有父类的功能的一种机制。减少代码的重复,使代码更加简洁,提高代码的重用性和可维护性。

  • 多态:是同一方法名可以作用在不同的对象上,产生了不同的结果。它分为编译时多态(重载)和运行时多态(重写)。

23.跨域

跨域产生必须要同时满足两种情况,必须得是ajax请求,请求的域不同(协议,ip,端口)

在服务端设置响应头,来允许跨域, 

做可以通过nginx进行代理,让前后端的域相同

24.接口防刷怎么做

1.限制访问频率:通过生成一个带有过期时间的 token,限制客户端请求接口的频率。客户端在每次访问接口的时候,需要携带上该 token,后端就可以根据 token 来验证请求是否合法。如果 token 过期或者不存在,就拒绝该次请求。

2.前端滑动验证码

3.黑名单:如果总是这个ip违反规则那么就将这个ip拉入黑名单

25.浮点数为什么丢失精度

在计算机内存中,数字都是以二进制形式存储的,而浮点数使使用科学计数法来表示一个数值,浮点数在计算机内部分三部分。正负号,阶码(指数),尾数

BigDecimal对象包含两部分:整数部分和小数部分。其中整数部分存储为一个BigInteger对象,也就是了一种类似数组的数据结构来存储整数部分,小数部分存储为一个int类型的数字,就是将小数扩大N倍,转成整数后再进行计算,同时结合指数,得出没有精度损失的结果。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐