Java后端面试初体验

文章涵盖了后端开发的多个核心主题,包括前后端数据传输方式(如RESTful和Ajax),安全性措施(如JWT、签名机制和HTTPS),编程概念(如抽象类与接口、JVM、JDK的区别),数据库操作(如JDBC、SQL和索引优化),以及并发处理和线程通信。此外,还讨论了跨域问题的解决方案、SpringBoot应用中的定时任务和负载均衡策略,以及消息队列和中间件的使用。
摘要由CSDN通过智能技术生成

系第一次后端面试记录(答案参考自不同作者,自用,侵删)


项目相关

前后端分离

参考
关于JWT

传输的数据是什么
  1. 面预报(图片)
  2. 灾害预警(二进制流)
  3. 每日海况(二进制流)
  4. 重点区域单点预测(post请求,调用后端shell脚本进行预测,传输图片)
怎么进行数据传输的?用的哪个?

前后端分离,采用Restful设计风格。利用Ajaxs。

连接的整个过程
怎么保证安全性

接口的安全性怎么保证的?任何人都可以连接到吗?数据应该比较敏感,怎么预防攻击?如何控制只能单一服务器连接后端服务器。

如何保证API的安全性
参考1 :token、timestamp、sign签名机制、防止重复提交
参考2 :通信使用https、请求签名,防止参数被篡改、身份确认机制,每次请求都要验证是否合法、APP中使用ssl pinning防止抓包操作、对所有请求和响应都进行加解密操作

固定电脑和IP访问:
【NGINX】过滤ip,只允许内网访问
使用401认证机制
使用IP认证机制
使用登录认证机制(验证cookies)
将服务器挪进内网,使用VPN访问
使用RSA token
使用手机令牌或二维码

get和post怎么调试的?get和post的区别

区别

跨域的问题怎么解决的

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。 这里说明一下,无法跨域是浏览器对于用户安全的考虑,如果自己写个没有同源策略的浏览器,完全不用考虑跨域问题了。是浏览器的锅,对。 同源策略限制了一下行为: Cookie、LocalStorage 和 IndexDB 无法读取 DOM 和 JS 对象无法获取 Ajax请求发送不出去。

解决方案:
前端:

  1. CORS跨域 (前端不用动,后端设置Access-Control-Allow-Origin等)
    服务端进行接口请求设置,前端直接调用
    说明:后台设置前端某个站点进行访问
  2. JSONP (动态创建script标签)
    JSONP跨域-前端适配,后端配合前后端同时改造
  3. 接口代理(常用)
    通过修改nginx服务器配置实现代理转发
    前端修改,后端不用

后端:(SpringBoot)

  1. @CrossOrigin 注解
  2. 配置解决:实现 WebMvcConfigurer 接口,重写 addCorsMappings 方法
  3. 添加过滤器:添加CORS过滤器
用的地图,怎么用的

一般前端:VUE+高德(百度)地图API

序列化和反序列化怎么做的?

参考

图片后端到前端怎么传的?前端有没有别的什么处理?

关于mysql存取图片的三种方式参考
后端:
一般来说,图片在后端的存储方式分为两种:
其一:可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;(前端以流的形式传输到后端存储,并命名保存,然后名字和路径保存在数据库中)
其二:将图片转换成二进制流,直接存储到数据库的 Image 类型字段中。(MongoDB)(MySQL:Method1:采用BLOB数据格式存图片。其实这种方式很不合理,数据库大小会激增会导致简单的查询都及其缓慢。Method2:采用文本格式存储图片。虽然也不怎么合理,因为关系型数据库本身就不太适合存巨长的大数据量的东西。但是由于只涉及到base64加密和解码,且可以都写入后台部分,减轻前端负担。前端以表单形式提交数据信息和图片,后台以MultipartFile类型接收图片,并对图片进行BASE64编码,存储在mysql数据库中。)
前端:
对于第一种存储方式,我们前端直接将存储路径赋值给 src 属性即可轻松显示。
对于第二种存储方式,我们前端需要将其二进制流交由 blob 对象处理,然后通过 blob 的 API 生成临时 URL 赋值给 src 属性来显示。(前端显示图片有三种方式:url、base64、blob,这三者之间可以互相转化)
从后端返回的二进制流图片,直接接受打印的话,会乱码。axios 默认返回的是 json 文本形式,二进制图片数据被强制转换成了 json 文本形式。找到了原因,解决方案就好办了。我们在 axios 里面,responseType 默认返回数据类型是 json,将其改为返回数据类型 blob。

前端图片处理:vue+element-ui中的图片获取与上传(参考

前后端交互怎么做的?

参考

前后端定时和实时推送的东西
  1. spring boot进行定时任务一共有三种方式,第一种也就是最简单的一种:基于注解 (@Scheduled)的方式;第二种:基于接口 (SchedulingConfigurer);第三种:基于注解设定多线程定时任务。
  2. SpringBoot2.0整合WebSocket,实现后端数据实时推送

抽象类和接口的区别?项目中用的哪个?

参考
接口和抽象类的应用

JVM、JRE、JDK的区别

JDK常用的包

java.io包、java.lang包、java.math包、java.net、java.nio、java.util

注解的作用?说几个常用的SpringBoot注解。

注解本身不提供作用,注解只能是被看作元数据,它不包含任何业务逻辑。注解更像是一个标签,一个声明,表面被注释的这个地方,将具有某种特定的逻辑。常见的注解有三大类:JDK的,自定义的,第三方的(比如框架)。
因为注解大多都有自己的配置参数,而配置参数以名值对的方式出现,所以从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。而属性的值是可以在声明该元素的时候自行指定的。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。

数据库用的什么?怎么做的JDBC?用的什么框架?

spring-boot-starter-jdbc、使用druid数据源。整合Mybatis。

非关系型数据库用过吗?

Redis、MongoDB。

delete和truncate的区别

参考1
参考2

Mysql并发处理?死锁处理?

MySQL并发更新数据时的处理方法:

  1. 通过事务显式的对SELECT进行加锁
  2. 使用乐观锁机制
    参考
    Mysql高并发解决方案:
  3. MySQL主从复制实现读写分离
  4. 分表
  5. 分区
  6. 分表分库
    参考

MySQL死锁
当两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。触发了死锁。
InnoDB 死锁检测
Innodb提供了wait-for graph算法来主动进行死锁检测,在每个事务请求锁并发生等到的时候都会判断是存在回路,若存在则有死锁。通常来说InnoDB选择回滚undo量最小的事务
参考

两个spring boot,都有定时任务、要做负载均衡,搭了两个定时任务,只想其中一个任务执行,怎么处理?

参考

中间件消息队列用过吗?

参考

Mysql两个表的关联用过吗?左连接和右链接?where 和 on 的区别?

参考

数据库表的记录比较多怎么办?200万的数据?有的应用场景数据量比较大,查询操作比较慢,怎么办?

使用索引、优化 SQL 语句、优化数据库对象(优化表的数据类型、对表进行拆分)、使用数据库连接池、使用查询缓存、主从复制, 读写分离, 负载均衡、数据库分表, 分区, 分库。
参考

Mysql优化相关?怎么看有没有走索引?

参考
有没有走索引:explain 关键字
参考

索引失效的几种情况。

参考

Java里面的集合用过吗?怎么遍历这些集合呢?有哪些遍历方法?为什么用迭代器?什么情况下用迭代器?

  1. 遍历方法:普通for、for each、iterator 、lambda、Stream API。
  2. 在对集合进行遍历删除的时候应使用迭代器Iterator 从源集合安全的删除对象,这样可以避免出现ConcurrentModifiedException;
    《阿里巴巴 Java 开发手册》的描述如下:不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。

线程同步怎么用的?Synchronize用过吗?怎么用的?

  1. synchronized、lock锁 参考

怎么用wait 和 notify 进行线程通信的。举个例子。

交替执行
参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值