网站开发攻略,移动端网站定制,山西省网站建设价格,263企业邮箱管理员登录入口文章目录 1、Http1.1和2.0的区别大概是什么#xff1f;HTTP HTTPS 2、HTTP#xff0c;用户后续的操作#xff0c;服务端如何知道属于同一个用户cookie session token手机验证码登录流程SSO单点登录 3、如果服务端是一个集群机器#xff1f;4、hashmap是线… 文章目录 1、Http1.1和2.0的区别大概是什么HTTP HTTPS 2、HTTP用户后续的操作服务端如何知道属于同一个用户cookie session token手机验证码登录流程SSO单点登录 3、如果服务端是一个集群机器4、hashmap是线程安全的吗5、Java有没有提供线程安全的结构6、如果用for循环对ArrayList进行元素遍历删除是否安全这个不考虑单线程还是多线程7、网站对外提供HTTP协议的接口但是不期望底层异常堆栈信息向客户端暴露可以如何做8、想把服务端所有的异常全部拦截掉在 try catch 的时候应该 catch 什么类型的异常9、error可以被拦截吗10、OOM属于什么类的异常11、OOM在异常堆栈里是否会暴露程序的一些结构比如在某一段代码因为什么情况导致OOM12、Java的双亲委派机制了解吗13、想破除双亲委派机制一般以什么方式14、如果一个线程执行里面赋值比较耗时不知道耗时多久还想打印赋值的正确结果有没有其他方式15、String a new String(ABC);内存结构16、Spring了解多少17、Spring的事务标签有没有用过什么场景会生效18、mysql现在有一个联合索引a,b,c有一个where条件是bXX查询索引会失效吗19、描述一下最左匹配原则20、where条件等于b符合最左原则吗等于a符合吗21、查询a LIKE一个String前缀能走索引吗 1、Http1.1和2.0的区别大概是什么
HTTP1.1
1、无状态、明文传输不安全
2、长连接超时服务端主动断开
3、管道传输减小响应时间
问题没有解决响应的队头阻塞
HTTP2.0
1、头部压缩多个请求头部相似会消除重复部分
2、二进制格式头部信息和数据信息都采用二进制格式头部帧、数据帧增加数据传输效率
3、并发传输使用Stream ID来区分不同的HTTP请求通过多路复用一条tcp连接实现了http并发传输的效果性能比http1.1高了很多
4、服务器主动推送资源
问题一旦发生丢包就会阻塞住所有的 HTTP 请求
HTTP3.0
基于 UDP 的 QUIC 协议
无队头阻塞当某个流发生丢包时只会阻塞这个流其他流不会受到影响更快的连接建立QUIC 协议握手只需要1RTT目的是为确认双方的连接 ID连接迁移
基于TCP的HTTP协议四元组源 IP、源端口、目的 IP、目的端口
QUIC 协议通过连接 ID 来标记通信的两个端点
HTTP HTTPS
HTTP
1、超文本传输协议明文传输不安全
2、连接简单TCP三次握手后即可进行传输
3、端口80
HTTPS
1、引入SSL/TLS安全协议传输层和网络层之间加密传输
2、不仅需要TCP三次握手还需要SSL/TLS握手过程
3、端口443
4、需要向CA申请数字证书
2、HTTP用户后续的操作服务端如何知道属于同一个用户
HTTP是无状态协议可通过cookie、session保存用户状态cookie是在客户端存储session是在服务端存储
cookie session token
cookie服务端收到HTTP请求在**浏览器客户端**的响应头中添加cookie信息保存sessionId或token用于保存用户登录信息
客户端每发一次新请求浏览器都会将之前保存的cookie信息通过cookie请求头再发给服务器此时浏览器发出之后就有可能被拦截不安全
session在服务端记录用户的登录信息
客户端发送http请求提交用户信息服务端保存生成session并存储在内存服务端将sessionId返回给客户端客户端将sessionId存储在cookie中客户端后续所有请求都需要携带cookie服务端通过cookie中的sessionId校验用户信息
**token**由服务端生成并发给客户端 token客户端发起登录请求服务端验证通过后生成全局唯一Token绑定用户信息value并将Token作为key存入Redis中
多端登录secretId客户端的唯一标识
tokentokensecretIdtokensecretIduserId
使用Token获取用户信息
1、根据request获取userId
2、根据userId获取用户信息
// 根据token获取用户信息
GetMapping(getMemberInfo)
public R getMemberInfo(HttpServletRequest request) {// 调用jwt工具类方法根据request对象获取头信息返回用户idString memberId JwtUtils.getMemberIdByJwtToken(request);// 查询数据库根据用户id获取用户信息UcenterMember member memberService.getById(memberId);return R.ok().data(userInfo, member);
}手机验证码登录流程
客户端输入手机号客户端向服务端发送请求获取手机验证码服务端向手机发送验证码服务端生成Token并发送给客户端验证码手机号Token绑定客户端携带【验证码Token】请求服务端服务端校验【验证码Token】校验通过后记录用户登录的session信息服务端返回登录成功客户端进行页面跳转
可使用Redis设置验证码5分钟有效时间
RestController
CrossOrigin
RequestMapping(/edumsm/msm)
public class MsmController {Autowiredprivate MsmService msmService;Autowiredprivate RedisTemplateString, String redisTemplate;// 发送短信GetMapping(send/{phone})public R sendMsm(PathVariable String phone) {// 1. 先从redis中获取验证码如果能获取直接返回String code redisTemplate.opsForValue().get(phone);if (! StringUtils.isEmpty(code)) {return R.ok();}// 2. 如果获取不到再进行阿里云发送// 生成随机的值传递给阿里云发送code RandomUtil.getFourBitRandom();MapString, Object param new HashMap();param.put(code, code);// 调用service发送短信的方法boolean isSend msmService.send(param, phone);if (isSend) {// 发送成功把发送成功验证码放到redis里并设置有效时间redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);return R.ok();} else {return R.error().message(短信发送失败);}}
}SSO单点登录
只需要登录一次即可访问互相信任的系统
三种常见方式 1、session广播机制实现基本不用了
session复制
2、使用cookieredis 实现
在项目中任何一个模块进行登录登录后将数据放到两个地方
redis在key生成唯一随机值(ip、id等)在value用户数据
cookie把redis里面生成的key值放到cookie中
访问项目中其他模块发送请求时带着cookie进行发送获取cookie值后把获取到的cookie值放入redis进行查询根据key查询如果能查到数据就是登录
3、使用token实现
令牌
token按照一定的规则生成字符串字符串可以包含用户信息
1.在项目某个模块进行登录登录之后按照规则生成字符串将用户信息包含在字符串里最后返回字符串
把字符串通过cookie返回把字符串通过地址栏返回
2.再访问项目其他模块每次访问在地址栏带着生成的字符串在访问模块里获取地址栏字符串根据字符串获取用户信息。如果可以获取到就是登录
session默认过期时间30min
session、redis、token都可以设置过期时间
JWT令牌按照规定好的规则使用JWT可以直接生成字符串包含用户信息JWT头用户信息签名哈希
3、如果服务端是一个集群机器
对于集群如果 session 保存在其中一台机器上就会涉及到数据不一致的问题可以使用MySQL或Redis来存储用户信息
常用基于redis实现共享session登录
4、hashmap是线程安全的吗
不安全
JDK1.7 及之前版本在多线程环境下HashMap 扩容时会造成死循环和数据丢失的问题JDK 1.8 后在 HashMap 中多个键值对可能会被分配到同一个桶bucket并以链表或红黑树的形式存储。多个线程对 HashMap 的 put 操作会导致线程不安全具体来说会有数据覆盖的风险
补充HashMap和ConcurrentHashMap相关知识
5、Java有没有提供线程安全的结构
ConcurrentHashMap
6、如果用for循环对ArrayList进行元素遍历删除是否安全这个不考虑单线程还是多线程
不建议在使用for循环对ArrayList进行元素遍历删除
删除元素后ArrayList中元素的索引发生变化可能会导致某些元素被跳过或重复遍历在遍历时修改ArrayList的大小可能会导致ConcurrentModificationException异常
如果必须使用for循环进行元素遍历删除操作可以使用迭代器来实现
7、网站对外提供HTTP协议的接口但是不期望底层异常堆栈信息向客户端暴露可以如何做
怎么实现有没有其他方式
整个项目使用一个统一的异常处理方式
使用**ControllerAdvice** 注解可以定义一个类在该类中使用**ExceptionHandler**注解来处理控制器中抛出的异常
ControllerAdvice
ResponseBody
public class GlobalExceptionHandler {ExceptionHandler(BaseException.class)public ResponseEntity? handleAppException(BaseException ex, HttpServletRequest request) {//......}ExceptionHandler(value ResourceNotFoundException.class)public ResponseEntityErrorReponse handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {//......}
}ControllerAdviceaop思想的一种实现你告诉我需要拦截规则我帮你把他们拦下来具体你想做更细致的拦截筛选和拦截之后的处理你自己通过ExceptionHandler实现
实现ErrorController接口可以自定义一个错误控制器来处理应用程序中出现的所有HTTP错误使用ResponseStatus注解可以在自定义异常类中使用ResponseStatus注解来指定HTTP错误代码和消息使用Servlet的ErrorPage配置可以在web.xml或通过注解配置中指定一个或多个错误页面来处理应用程序中出现的所有HTTP错误使用Spring Boot的ErrorAttributes可以使用Spring Boot的ErrorAttributes接口来自定义错误响应的内容和格式。
8、想把服务端所有的异常全部拦截掉在 try catch 的时候应该 catch 什么类型的异常
Exception
9、error可以被拦截吗
不可以error是不能处理的错误
10、OOM属于什么类的异常
不可检测异常运行时异常 11、OOM在异常堆栈里是否会暴露程序的一些结构比如在某一段代码因为什么情况导致OOM
堆内存溢出死循环、递归层数太多、内存泄露栈内存溢出单线程调用方法次数太多递归层数太多元空间不足GC效率太低数组大小越界 12、Java的双亲委派机制了解吗
类加载时先判断当前类是否被加载过已加载直接返回否则才尝试加载
加载首先会把请求委派给父类加载器的loadClass()处理即传送到顶层的启动类加载器 BootstrapClassLoader 。父类加载器无法处理时才自己处理。父类加载器为null使用启动类加载器作为父类加载器
13、想破除双亲委派机制一般以什么方式
自定义加载器需要继承 ClassLoader重写 ClassLoader 类中的 findClass() 方法即可无法被父类加载器加载的类最终会通过这个方法被加载
14、如果一个线程执行里面赋值比较耗时不知道耗时多久还想打印赋值的正确结果有没有其他方式
不知道执行多久就用join主线程等待子线程结束之后再执行这个时候不需要sleep直接 join 的话返回的就一定是子线程执行完毕的结果了
15、String a new String(“ABC”);内存结构
String a在堆中“ABC”在字符串常量池中
补充String相关知识
16、Spring了解多少
17、Spring的事务标签有没有用过什么场景会生效
18、mysql现在有一个联合索引a,b,c有一个where条件是bXX查询索引会失效吗
不会最左匹配原则
索引失效
1、使用左、左右模糊查询 like %xx,like %xx%
2、对索引列做计算、函数、类型转换操作
3、联合索引未遵循最左匹配原则
4、WHERE子句中ON前是索引列ON后不是索引列
19、描述一下最左匹配原则
假设有一个(a, b, c)联合索引它的存储顺序是先按 a 排序在 a 相同的情况再按 b 排序在 b 相同的情况再按 c 排序
联合索引从最左边的列开始匹配如果查询条件没有使用到某个列那么该列右边的所有列都无法走索引如果查询条件使用了某个列且该列的值包含范围查询那么范围查询的字段可以走索引范围查询后面的字段无法走索引
20、where条件等于b符合最左原则吗等于a符合吗
等于b不符合等于a符合
21、查询a LIKE一个String前缀能走索引吗
不能因为索引的 B树结构是按照索引列的值从小到大排序的而左模糊匹配的查询条件中通配符 “%” 出现在了左侧导致无法按照索引列的值有序查找