你做了哪些项目?描述一下你的项目?

​ 项目功能……用了哪些技术……

我做了两个项目,一个是博客项目,这个项目是一个Springboot聚合项目,有多个模块,使用到了eureka注册中心 zuul技术来实现多个服务器模块之前的调用,项目实现了一些博客的基本功能,项目的特点是实现了用户可以通过多种方式进行登录,前端页面能够响应式布局,让PC端和手机端都能够有良好的用户体验。并且使用Nginx将该项目部署在服务器上,能够通过https进行访问。

还有一个客户后台管理系统,这个系统主要的特点是实现不同身份的人员登录能够获得不同的权限功能,使用的是Shiro安全框架进行权限认证,管理员拥有所有权限可以做一系列操作,而销售员只能够对自己和自己客户的数据进行修改。项目中使用了AOP思想进行日志管理,记录用户所进行的操作。

负责哪些环节?

用到了哪些技术?为什么要用这些技术?是否有更好的技术方案?

用到了session/cookie,通过jsessionid来判断用户登录,可以使用jwt技术(json web token)实现登录状态判断。

使用了shiro安全框架做登录验证;

Eureka”发现“框架做注册中心,让各服务器在Eureka服务器上注册,使得之间能够互相调用;

Zuul网关,让客户端在访问时,都只会直接访问网关,而不会,也不可以直接访问到集群中的其它服务器!

为什么使用Shiro而不是Spring Security?

Shiro拥有易于理解的API,在配置上相对于Spring Security更简单,在小型项目中更方便调试及开发效率更高。

遇到了哪些问题?如何解决这些问题的?

Shiro多Realm的认证问题:

​ 1.自定义类重写doMultiRealmAuthentication, shiro框架默认使用的是singlerealmAuthentication,处理单个认证。2.在shiro配置类中创建这个自定义类的对象,将所有的realm添加进去,shiro框架就会通过所传过来的token类型来找对对应的realm,然后进行授权验证。

博客发送图片和文字不可兼得的问题:

​ 因为用户在发送博客的时候,可以选择是否发送图片,而控制器方法中有mutipartfile参数,如果这个参数没有传入值,那么就会报空指针异常,那我就用了一种有点笨的方法,写了两个控制器方法,一个方法处理只发送文字,一个方法处理文字和图片都可以发送,如果只发送文字就只调用对应的方法,在前端区别的的时候就用了两个按钮,一个按钮对应一个方法这样来做。 我这种做法本来的思想是文字和图片这个文件共同发送,但是我后来看到别人的代码里面,如果用户添加了图片,这个时候处于预览模式,用户并没有点击发布按钮,但是我们仍然将这张图片发送到了服务器,就是说提前单独发送了这张图片,那么如果用户点击发布的时候,控制器方法再接收的时候,就不是文字加文件的形式了,而是文字加上图片路径的方式。总结一下就是我本身在图片预览时是使用base64本地预览的,但好的方案是在预览时就从服务器读取资源进行预览。

举个例子:你的项目是 SSM搭建的,是否可以告知搭建项目的过程和需要注意的地方是什么吗?

考官:你的职业规化是怎么样的呢?(考官是项目经理)

​ 令狐冲:我思维能力比较强,擅于逻辑分析。在之前的工作中积累了一定的架构经验,以后就想成为一名架构师和技术专家

有没有你觉得自己擅长而又没被问到的东西?你最擅长的地方 你最擅长的技术是什么?

小程序?自学?JWT?

谈谈你们是怎么样对这个项目开发的吗?

​ 在代码编写阶段,先统一完成所有的实体类。对于非实体类则先完成类的框架,也就是只写方法和注释文字。具体方法的实现暂时为空。然后再进行代码填写。每完成一个类的代码编译通过后都要进行重构和单元测试。每完成一个功能和模块都由会由小组长进行集成测试。使得完成的模块是一个真正可以运行的,可见的功能实现。

你项目里有什么亮点?

你与众不同之处 你是怎么进行项目开发的,有什么特别之处,或者你在哪些项目中取得过哪些成功,或者有哪些自己觉得骄傲的地方?

多方式登录,看开放文档,发送真实短信

什么是微服务?

微服务是一种用于构建应用的架构方案。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。

怎么处理的跨域问题?

会重写shiro里一个过滤器中的prehandle方法,在httpServletResponse中给请求头添加“Access-Control-Allow-Origin”

什么是zuul网关?

Spring Cloud中的Zuul网关是“网关路由”,当整个架构中使用了Zuul以后,在后续客户端进行访问时,都只会直接访问网关,而不会,也不可以直接访问到集群中的其它服务器!

所以,Zuul网关是提供了整个架构的统一入口,并实现转发,使得其它服务器去完成具体的数据处理!在这一点来看,与SpringMVC中的DispatcherServlet是有一定相似之处的!

在一个构架中,Zuul的主要作用有:

  • 路由功能,甚至动态路由;
  • 身份验证与其它安全性相关的验证;
  • 减少负载;
  • 其它。

什么是Eureka?

Eureka是Spring Cloud中的一种“发现”框架,其作用在于:在集群项目中,各微服务项目是部署在不同的服务器上的,并且,各微服务项目可能需要彼此协作才可以完成整个任务,即存在“服务器与服务器之间的调用”,但是,可能存在“新服务上线”、“原本正常运行的某服务器因为特殊原因或故障而变为不可用”等问题,需要使用比较明确的方式使是“各服务器都能知道其它服务器在哪里(主机名称或IP地址是多少,端口号是多少等)”,发现框架起到的主要作用就是:

  • 其它各服务器都会在“发现”服务器上进行注册;
  • “发现”服务器使用“注册表”记录下当前整个集群中已经注册的所有服务器;
  • 其它各服务器都可以从“发现服务器”上抓取注册表,从而得知集群中有哪些其它服务器,及这些服务器的相关信息。

怎么做的异常处理?

对于项目中可能会遇到的非受检异常,都自定义异常类,继承自ServiceException,将这个异常try-catch,然后通过mvc的@ExceptionHandler注解捕获所有的ServiceException,进行统一的异常处理。

Shiro

Shiro登录流程?

  1. 获取subject对象
  2. 将用户输入的信息封装到token里
  3. 通过subject对象提交用户信息,交给shiro框架认证
  4. 调用subject.login()方法进行认证
  5. 成功得到用户登录信息
  6. 返回登录结果

Shiro怎么实现多realm认证的?

  1. 自定义类重写doMultiRealmAuthentication, shiro框架默认使用的是singlerealmAuthentication,处理单个认证。
  2. 在shiro配置类中创建这个自定义类的对象,将所有的realm添加进去。

Shiro主要功能

三个核心组件:Subject, SecurityManager 和 Realms。

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。

Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

Realm:Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

JWT流程

  • 用户使用用户名密码来请求服务器
  • 服务器进行验证用户的信息
  • 服务器通过验证发送给用户一个token
  • 客户端存储token,并在每次请求时附送上这个token值
  • 服务端验证token值,并返回数据

mysql怎么设置隔离级别

plaintext
1
show global variables like '%isolation%';
plaintext
1
set global transaction_isolation ='read-committed';

你的项目中用的什么隔离级别

MySQL默认使用repeatable read可重复读的隔离级别,因为历史原因,5.0之前binlog只支持STATEMENT这种格式!而这种格式在读已提交(Read Commited) 出现了主从不一致性的问题!

互联网项目中应该使用read commit读已提交

mysql怎么做的优化

项目中技术的版本

自己应该主动谈到的点

小程序,jwt,良好的学习能力(自己看了QQ,微博的开发文档,开发登录功能)

你常用的设计模式有哪些?