收录一些印象比较深刻的问题
1.不用session和cookie 怎么实现半小时内自动登录
JS端的localStorage:HTML5提供的本地存储方式(可以称为“键值对”数据库)
https://www.jb51.net/article/96092.htm
或者更好的选择-token
Token
解决问题:服务器上存储所有用户的seesion id 导致服务器压力大 和 集中存储session id 可能导致丢失单点失败 的问题
Header + userID + 加密算法(SHA-256)+服务器自己的密钥——签名——附在信息上
服务器接收到请求时 用算法和密钥 再对Header 和 userID 进行 加密 和 密钥
看服务器生成的 签名 和 发送过来信息中的签名是否一样,一样则为已经登陆过
https://www.cnblogs.com/moyand/p/9047978.html
tokens 是多用户下处理认证的最佳方式。
tokens特性:
1.无状态、可扩展
2.支持移动设备
3.跨程序调用
4.安全
基于Token的身份验证的过程如下:
1.用户通过用户名和密码发送请求。
2.程序验证。
3.程序返回一个签名的token 给客户端。
4.客户端储存token,并且每次用于每次发送请求。
5.服务端利用过滤器验证token并返回数据。
2.分角色登陆
我的回答是:登陆判断用户权限,在Controller 中按权限跳转到相应的页面,并且页面放在WEB-INF中,不允许别人直接访问
其实可以用spring-security
https://blog.csdn.net/liushangzaibeijing/article/details/81220610
https://blog.csdn.net/larger5/article/details/81047869
——依赖着一系列servlet filter来提供不同的安全特性
——基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架
3.拦截器和过滤器的区别
都体现了AOP思想,都能实现权限检查、日志记录
拦截器 | 过滤器 |
依赖于spring容器 | 依赖于servlet容器 |
Web application swing程序中都可以 | 只能用在Web程序中 |
实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用 | 基于函数回调,可以对几乎所有请求进行过滤 |
一个拦截器实例在一个controller生命周期之内可以多次调用,但只能对controller请求进行拦截 | 一个过滤器实例只能在容器初始化时调用一次 |
可以深入到方法前后、异常抛出前后 | 只在Servlet前后 |
可以访问action上下文、值栈里的对象 | 不可以 |
可以获取IOC容器中的各个bean | 不可以 |
https://blog.csdn.net/xiaoyaotan_111/article/details/53817918
https://blog.csdn.net/chenleixing/article/details/44573495
4.分布式锁
分布式,多台计算机合作,处理不同的部分
(对应,集群就是多台做同样的事情;部署在不同服务器上的同一个子系统应做负载均衡)
https://blog.csdn.net/jiangyu1013/article/details/80417961
在分布式系统中,大家不是在一个JVM里了,不可能用synchronized来在多个子系统之间实现锁
(线程间对资源进行锁——synchronized/lock,而分布式系统中是属于进程之间共享的资源)
分布式锁,是指在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问
分布式锁实现:Memcached、Redis、Zookeeper
乐观锁——引入版本号来实现
悲观锁——排它锁——InnoDB引擎 + 有索引的字段——行级锁
5.WebSocket
https://www.runoob.com/html/html5-websocket.html
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的应用层协议。
因此写在js上
浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
——HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分
——能更好的节省服务器资源和带宽,并且能够更实时地进行通讯
请求头部:Upgrade: websocket——升级到websocket协议
服务器返回101——协议升级完成,后续的数据交互都按照新的协议来
数据以帧形式传送
https://www.jianshu.com/p/a5aee2cfe6d4
6.前后端分离
核心思想是前端HTML页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互。
未分离时代(各种耦合):
MVC框架(我直接就答了MVC框架....),JSP+Servlet形式
——前端不可避免遇到后端的代码——例如<% java代码%>的形式
——JSP中嵌入了java后端的代码
问题:
开发过程的前后端互相矛盾
(可以理解为学校项目大多都是这种——所有学校的项目大多都是学生负责某一模块的前端后端
——而不是前后端分离这样的形式进行小组合作)
半分离时代:
前端负责开发页面,通过接口(Ajax)获取数据,采用Dom操作对页面进行数据绑定,最终是由前端把页面渲染出来。
这也就是Ajax与SPA应用(单页应用)结合的方式。
步骤如下:
(1)浏览器请求,CDN返回HTML页面;
(2)HTML中的JS代码以Ajax方式请求后台的Restful接口;
(3)接口返回Json数据,页面解析Json数据,通过Dom操作渲染页面;
【Restful接口:
每个资源都有一个唯一的资源标识符 & 对资源的各种操作不会改变资源标识符
——http://127.0.0.1/user 同一个url 但是可以对应 增删改查操作
区别在于http方式——GET POST PUT DELETE
spring-mvc 中 @RequestMapping(method = RequestMethod.POST)
https://www.jianshu.com/p/7893169a7c93
】
半分离原因:
前后端需要协商ajax的数据——同步输出 or 异步json渲染
特点:
前端不会嵌入任何后台代码,前端专注于HTML、CSS、JS的开发,不依赖于后端,自己还能够模拟Json数据来渲染页面,发现Bug。
缺点:
js冗余,页面渲染复杂且缓慢,甚至卡顿
业务复杂的话,一个页面可能需要多次请求才能完成页面的渲染——PC端可以,但移动端可以吗?
——需要前后端分离
分离:
上面提到的SPA可以算是分离——但SPA实际中很少见
我们需要
问题来了——前端咋懂Controller层呀——node.js
node.js适合运用在高并发、I/O密集、少量业务逻辑的场景。
——NodeJs的作用在MVC中相当于C(控制器)
为什么用将nodejs当做是前后端的桥梁?
后端的数据,前端不能直接使用;前端因为排序、筛选和页面展示的需求 要对数据进行二次处理。
处理放在前端的话 会浪费浏览器性能——因此交给nodejs 这个中间层
因此浏览器不再直接请求JSP的API,而是:
1)浏览器请求服务器端的NodeJS;
2)NodeJS再发起HTTP去请求JSP;
3)JSP依然原样API输出JSON给NodeJS;
4)NodeJS收到JSON后再渲染出HTML页面;
5)NodeJS直接将HTML页面flush到浏览器;
这样,浏览器得到的就是普通的HTML页面,而不用再发Ajax去请求服务器了。
nodejs优势:
适配性up —— 界面展示逻辑由node层自己维护 不同端即不同nodejs
响应速度up —— 不需要浏览器对数据进行处理 而是由 nodejs 中间层去做
(前端发出多个异步请求,nodejs中间层做这些请求的代理,统一给后端;
同样,后端的数据 在nodejs中间层 统一装好 一起给前端)
性能up —— 单一职责原则
异步与模板统一
—— 页面整体是有 几十个HTML 片段拼装而成
PHP 是同步include 这些片段,而node可以同步 ,读文件可以并行
https://blog.csdn.net/fuzhongmin05/article/details/81591072
6.