广发银行 java面试

收录一些印象比较深刻的问题

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实际中很少见

我们需要

  • 前端负责view和controller层
  • 后端只负责model层,业务处理与数据持久化等

问题来了——前端咋懂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.

你可能感兴趣的:(个人)