栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

项目话术最终版

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目话术最终版

一、介绍项目

 

1、简单 介绍项目背景:

我的第一个项目是一个电商后台管理系统,因为现在网购很普遍,电商的后台管理是必不可少的

项目基于SSM框架开发的综合性电商网站,实现会员商城浏览下单、商家入驻商城出售商品、管理员后台管理商品、订单、搜索及会员等功能,同时,系统可以发起抢购活动功能。

这个项目项目基于SSM框架开发,采用前后端分离,主要为电厂开发一套人员管理及人事审批的OA系统,实现电厂人员管理、电源审批、栈道审批、工器具审批等功能。

2、介绍项目中的技术栈:

项目中使用的技术主要包括ssm框架,数据库用的是mysql,缓存用的是redis

权限控制框架使用的是shiro。

微服务分布式项目用到了dubbo框架,对于处理分布式的一些问题,用到了zookeeper框架。

我这个项目使用的框架是ssm,其中用到了activiti工作流框架,这是因为项目中有很多的工作审批业务,同时用到了shiro框架,另外,为了实现单点登录功能,加入了redis框架。

3、介绍你在这个项目中负责的模块

如果你这样介绍:我负责的是一个用户模块,包括用户的增删改查,还有就是用户的登录功能。

面试官一听,你这做的工作没有任何难度,体现不了你的能力,跟你在这个项目中的作用跟自己的价值,面试官肯定是不想听到这样的答案的。

因此,在介绍自己负责的模块的时候,尽量是一些业务比较复杂的,工作量比较大的模块,整个模块的难度是比较大的,这样的话,面试官听了之后才会有兴趣继续往下问下去。
 

在这个项目中我主要责任是 1、搭建dubbo的分布式的项目(怎么分层) 2、利用redis提供缓存服务 3、利用RocketMQ消息队列做消息处理 4、对数据库性能进行调优 5、开发抢购活动功能模块(业务需求)

在这个项目中我担任的角色是项目负责人,负责整个项目的管理工作,同时,我还负责了以下几块工作: 1、搭建项目环境 2、实现用户的单点登录系统SSO 3、项目的权限控制 4、开发电源管理和栈道管理模块 5、系统性能调优

1、这个你负责的模块应该是这个项目中比较核心的模块,记住,不要是,用户模块,这样的简单的增删改查。
2、你负责的模块应该是有一定的难度的,或者说对于你来说有一定得难度,最后你克服了难关,实现了功能。
3、你负责的模块应该是有一些难点的,这样好让面试官问问你啊,然后,你就可以接着吹牛皮了
 

要主动说出你做了哪些事情,

别太介绍技术细节,点到为止,等面试官来问

单点登陆系统

二、可能会问的问题 介绍项目难点与亮点

一旦你亮出加分点,但面试官没接嘴,这个加分点可能就不是项目必备的,也不是他所关注的,当前你就可以别再说了。

每问到项目的时候,当我介绍完了项目,就有了面试官的一句经典难忘的话,你能介绍一下你的项目的难点吗
这里给出一个例子:
比如你说,我在项目中有对数据库进行优化,然后,你把整个优化的过程说一遍,你再说以前没有接触过这方面的工作,有一定的挑战,而且数据量特别大,但是,通过自己的摸索,最终解决了问题,取得了不错的效果,当然,最主要的还是你讲述你优化的过程,能够让面试官感觉你真的有做这个工作;讲述的期间最好能够把你学过的知识用上,比如说,索引,数据库的设计等等。

项目中sso单点登陆系统具体应用csdn

说的时候要有技巧,找机会说,通常是找一些开放性的问题说。

比如:在这个项目里用到了什么技术?你除了说一些基本的技术,比如Spring MVC,Hibernate,还有数据库方面的常规技术时,还得说,用到了Java内存管理,这样能减少对虚拟机内存的压力,或者说用到了大数据处理技术等。也就是说,得找一切机会说出你拿得出手的而且当前也非常热门的技术。

讲讲Md5加密(面试)

比如被问到:你有没有用到过一对多和多对多?有用过

你除了说基本知识点以外,还可以说,一般我还会根据需求适当地设置cascade和inverse关键字,随后通过一个实际的案例来说明合理设计对你项目的帮助,这样就能延伸性地说明你的技能了。相反如果你不说,面试官一定会认为你只会简单的一对一和一对多操作。

面试的时候,如果候选人回答问题很简单,有一说一,不会扩展,或者用非常吝啬的语句来回答我的问题,那么我一般会给机会让他们深入讲述,如果回答再简洁,那么也会很吝啬地给出好的评语。

项目中都遇到过什么问/难题,怎么解决的————必问 准备好有质量一点的问题和解决方案(背背背)
  数据库用什么

mysql数据库

数据库里有什么表/项目的表结构-面试

admin 存储用户名和密码

什么时候使用项目的日志呢

mapper层下的sql日志

使用Log4j打印日志通过@slf4j注解

一:用户模块

1.用户登录模块的实现 ---利用MD5技术对获取的密码进行加密操作,然后与库中的数据进行匹配
              ---  当匹配不成功时,返回失败提示
             -- 当匹配成功时,自然进入页面
2. 修改个人信息模块 --  实现数据回显,进行修改昵称,签名,及头像的上传
3.修改密码模块 -- 根据id查询数据 修改密码,将获取到的新密码通过md5技术存储到数据库  这块比较简单

说一下登陆的流程/单点登录的实现步鄹:

用户登录时,验证用户的账户和密码
生成一个Token保存在数据库中,将Token写到cookie中
将用户数据保存在Session中
请求时都会带上cookie,检查有没有登录,如果已经登录则放行
如果没看懂的同学,建议回顾Session和cookie和HTTP:

     * 配置令牌的存储策略,对于oauth2规范中提供了这样的几种策略
     * 1)JdbcTokenStore(这里是要将token存储到关系型数据库)
     * 2)RedisTokenStore(这是要将token存储到redis数据库-key/value)
     * 3)JwtTokenStore(这里是将产生的token信息存储客户端,并且token
     * 中可以以自包含的形式存储一些用户信息)

单点登录概念:

sso是指在多个系统中,用户只需登录一次就可以访问所有相互信任的系统

我使用的方案是:

spring security(sei q rui ti)+jwt令牌+oauth2(哦 奥 司)的单点登陆方案,通过引入spring-cloud-starter-oauth2这个依赖引入所需要的这些技术

具体操作:

一、我们可以先写一个基础服务用于用户登录 基于用户名获取用户信息 

二、相比于单系统登录,除了提供 用户信息、日志信息等基础数据 的基础工程,还需要一个独立的认证中心服务,对用户身份进行认证和授权

三、在认证中心服务中
 封装从数据库查询到的用户信息,并基于feign方式 远程调用用户信息:定义用户远程调用的Feign接口,基于此接口调用基础服务中的用户信息。

因为这里使用的是SpringSecurity,在它的执行链当中,有一个UserDetailsService接口,这个接口负责从数据库查询到的的用户信息和用户端提交的信息进行比对,所以要写一个UserDetailsService接口的实现类,然后在这个实现类中基于Feign接口进行远程服务调用;之后由AuthenticationManger认证管理器调用UserDetailsService的实现类来完成认证管理功能

权限控制:

这个时候因为用户提交的密码是明文的,而数据库中存储的密码是加密的,所以还需要写一个配置类继承WebSecurityConfigurerAdpater这个类 并重写configure方法: 构建密码加密对象,这里使用的是BCryptPasswordEncoder,其中内置了一种不可逆的密码加密算法,相对于md5方式会更加安全+禁用跨域攻击,假如没有禁用,使用postman,httpclient这些工具登录失败403+配置认证成功和失败处理器

四、因为是单点登录
用户登录成功后,会基于JWT技术生成一个token,将用户信息存储到token(令牌),然后写到客户端进行存储。后续用户在访问资源时,对token内容解析,检查登录状态以及权限信息,无须再访问数据库.

构建令牌生成及配置对象:写一个配置类 创建令牌信息存储对象并设置签名key,对Jwt令牌进行签名时使用

整体的流程基本就是这样

-------------------+++++++++++

##session和cookie

浏览器和服务器之间可能会产生多次的请求和响应,直到浏览器和服务器一方关闭,这次会话就结束了。这样的过程称为:一次会话

cookie为客户端会话技术,数据信息保存在客户端(浏览器)

Session为服务器端会话技术,数据信息保存在服务器

因为Session对象的数据是保存在服务器端的并且只有一个,那么在一次会话中如何确保多次获取的Session是同一个就是一个很大的问题,为了解决这个问题,谁谁谁把Session对象设置了一个id,并通过cookie把id发送给浏览器,这样浏览器只用通过id就能准备的找到Session对象在哪里了。所以说:Session是依赖于cookie的。
 

###会话技术session和cookie的原理

cookie的原理是通过Set-cookie响应头和cookie请求头将会话中产生的数据保存在客户端。客户端请求服务器, 服务器将需要保存的数据通过Set-cookie响应头发给客户端, 客户端收到后会将数据保存在浏览器的内部。当客户端再次请求服务器时, 通过cookie请求头将上次保存的数据再带给服务器, 服务器通过cookie头来获取数据, 通过这种方式可以保存会话中产生的数据。cookie是将需要保存的数据保存在了客户端, 是客户端技术. 每个客户端各自保存各自的数据, 再次访问服务器时会带着自己的数据, 每个客户端持有自己的数据, 因此就不会发生混乱了。
Session是基于一个JSESSIOINID的cookie工作的。
当需要保存数据时, 服务器会为当前浏览器创建一个session对象, 用于保存和这个浏览器相关的数据, 并且服务器会为每一个session分配一个独一无二的编号(ID), 服务器在响应时会通过Set-cookie头将session的id以cookie的形式发送给浏览器并保存在浏览器的内部, 此后浏览器再来访问服务器都会在请求中一个cookie请求头带着上次保存的sessionid, 服务器可以通过cookie请求头获取session的id, 通过id找到为当前浏览器服务的session! 

###会话技术session和cookie的区别

1.存储位置不同
cookie的数据信息存放在客户端浏览器上。 
session的数据信息存放在服务器上。  
2.存储容量不同
单个cookie保存的数据<=4KB,一个站点最多保存20个cookie。 
对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东 西,并且设置session删除机制。 
3.存储方式不同
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。 
session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。 
4.隐私策略不同
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。 
session存储在服务器上,不存在敏感信息泄漏的风险。 
5. 有效期上不同
开发可以通过设置cookie的属性,达到使cookie长期有效的效果。 
session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。 
6.服务器压力不同
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。 
session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。 

###怎么样把数据放入Session里面 

怎么样把数据放入Session里面 可以声明一个request,或者session先拿到session,然后就可以放入数据,或者可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key

二:商品模块

1.实现商品的点击查询通过查询数据库获取商品的详细信息
2.在点首页的时候,实现首页数据库的全部信息
3.导航栏模块 实现商品与数据库的匹配 -- 根据导航栏名称查询数据库  -- 实现页面展示
4.品牌模块 实现2级菜单分类 -- 以及菜单内容的查询
5.利用模糊查询实现搜索功能

三:购物车模块

用户在浏览商品的时候可以将自己中意的商品加入购物车当中,用户可以查看、删除购物车中的商品,或者修改购物车中商品的数量,可以当在购物车中选中自己要购买的商品后并下单。

1、当用户添加商品到购物车时:先获取用户的购物车,循环遍历用户的购物车是否有要添加的商品,如果有,修改商品数量加1;如果没有 添加到购物车,并设置数量为1
2.删除购物车中的商品 -- 根据购物车id删除进行删除

购物车
用户在浏览商品的时候可以将自己中意的商品加入购物车当中,用户可以查看、删除购物车中的商品,或者修改购物车中商品的数量。当在购物车中选中自己要购买的商品后并下单。
用户在登录或者未登录的状态下都可以将商品加入购物车。所以当用户添加商品到购物车的时候,我们需要判断此时用户是否已经登录,而鉴权中心已经提供了判断用户是否登录的接口,直接在用户点击加入购物车的时候判断用户是否登录即可。当用户没有登录的时候我们将用户加入购物车的商品存到浏览器的Local Storage本地存储中,存的是什么数据类型?因为Local Storage中存储是永久有效的,不会因为用户关闭窗口本来加入购物车中的商品就没有了;而登录状态下我们将用户加入购物车的商品以一个双层map的形式存到redis中,map的外层key是用户的id,内层key是商品的id,value则是我们定义的一个购物车中的商品类cart,cart类中除了商品的信息以外还增加了所属的用户id。我们将购物车中的信息放在redis中而没有放在数据库中除了因为购物车中的商品经常会进行增删操作以外,主要还因为购物车中会显示当前商品价格和当初用户添加到购物车的时候的价格的差价,所以放在redis中商品的信息就会保持在添加进购物车的那个时候。当用户没有登录的时候操作购物车的时候直接在web的本地存储中添加删除购物车中的商品。当用户登录时就要通过购物车微服务了,购物车微服务提供接口只有在用户登录的状态下才能操作,所以我们给购物车微服务添加了一个SpringMVC过滤器,判断用户是否处于登录状态,因为用户的信息在购物车中的所有接口中都是需要使用的,为了避免代码冗余,我们在过滤器中获取用户的信息,并放到threadLocal中,并提供了获取信息的静态方法,这样就可以直接获取到用户信息了。而获取到用户信息后,可以根据用户的id对购物车进行相关的添加、修改、删除等操作。 在购物车页面,用户如果选择下单后,会校验用户是否登录,若没有,让用户跳转到登录页面进行登录,登录完成后跳回购物车页面,重新下单。并在此页面进行购物车的合并功能,将浏览器中的Local Storage中的数据与redis中的数据进行合并根据用户的id。合并成功后,将Local Storage中的购物车信息删除。这样保证不会重复合并。

如何实现图片/文件上传和删除? 点此处    文件上传

当用户选择多张图片上传时,并不是同时上传,而是一张一张来进行上传的

提交方式只能用post类型,因为get类型url只最多支持2k

文件上传步骤:
    1.加入文件上传需要的commons-fileupload包
    2.配置文件上传解析器,springmvc的配置文件的文件上传解析器的id属性必须为multipartResolver
    3.后端业务层对应的接收文件的方法参数类型必须为MultipartFile,参数名称必须与前端的name属性保持一致

方法内要:1>使用bufferedImage图片包装对象 校验宽度和高度判断是否为图片

2>分目录存储: 一般是按照时间维度划分目录

3>防止文件重名:动态生成的新UUID的不重复的文件名

最后根据文件的全路径和图片服务器网址完成文件上传操作

文件删除

先获取文件的全路径,然后进行判断,如果文件存在,则使用file.delete()方法删除

如何实现图片回显?

用户发起请求,被Nginx中的监听器所拦截.

通过配置Nginx内部的图片代理,将用户请求的路径 代理为磁盘路径,根据路径发起http请求.

修改系统中的hosts文件,开放全部权限并配置好磁盘地址、url地址、前后端服务器地址;
从服务器中正确的获取数据后,返回给nginx
Nginx将返回的数据最终返回给用户.

代理:

#反向代理 ##什么是反向代理--面试  位用

1、位置:反向代理服务器介于用户和目标服务器之间
2、使用:用户从反向代理服务器获取资源
3、作用:用户以为反向代理服务器就是目标服务器;用户不清楚真实的服务器到底是谁, 保护了真实服务器的信息. 也称之为 "服务器端代理"

反向代理应用
通常可用来作为Web加速,提高访问效率
反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

###反向代理服务器Nginx

一、Nginx是什么:轻免源(请面源)
nginx是一款开源免费的 轻量级的反向代理服务器和web服务器,将多台服务器代理成一台服务器。用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
二、Nginx的作用? 反均分(贩均分) 
2.负载均衡,将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务器的响应速度。 
3.动静分离,nginx 可以用作静态文件的缓存服务器,提高访问速度
三、Nginx的特点 配本稳热并存(赔本稳热并存)
1、配置文件非常简单。
2、成本低廉。
3、稳定性高。 
4、支持热部署。 
4、nginx并发能力强 理论值: 5万次/秒 实际值: 3万次/秒
     tomcat:并发能力 150-220 调优后可以达到1000个/秒 
5、nginx占用内存少 不超过2M 
 tomcat内存占用200M左右

为什么Nginx性能这么高?
它的事件处理机制是 异步非阻塞事件处理机制:运用了 epoll模型,提供了一个队列,排队解决。
Nginx代理的服务高可用性是如何实现的?
当服务器宕机时,如果访问的失败达到最大失败次数,则标识为down.自动完成.在一定的周期之内,如果服务器恢复正常,则还会尝试访问故障机.例如设置max_fails=1 最大的失败次数 ,fail_timeout=60s; 设定周期为60秒。宕机后60秒还可尝试恢复访问。


请列举 Nginx 服务器的最佳用途。Nginx 服务器的最佳用法是在网络上部署动态 HTTP 内容,使用 SCGI、WSGI 应 
用程序服务器、用于脚本的 FastCGI 处理程序。它还可以作为负载均衡器。 
Nginx主要用于解决什么问题?
反向代理、请求的转发、负载均衡等。
四、Nginx是如何处理一个请求(连接)的?
1、首先,nginx 在启动时,会解析配置文件,得到需要监听的端口与 ip地址,然后在 nginx 的 master 进程里面先初始化好这个监控的 socket,再进行listen,然后再 fork(分岔) 出多个子进程出来, 子进程会竞争 accept 新的连接。
2、此时,客户端就可以向 nginx 发起连接了。当客户端与 nginx 进行三次握手,与 nginx 建立好一个连接后,此时,某一个子进程会 accept 成功,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体,接着,根据事件调用相应的事件处理模块,如 http 模块与客户端进行数据的交换。
3、最后,nginx 或客户端来主动关掉连接,到此,一个连接结束
请解释 Nginx 如何处理 HTTP 请求
Nginx 使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样 
数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可 
以提供数万个并发连接。

nginx负载均衡策略?

简单介绍负载均衡的理解。--面试

1、轮询策略
        按照配置文件的顺序 依次访问服务器. 默认的负载均衡策略
     2、权重策略
      如果需要设定访问服务器的频次(某个访问的多,某个访问的少),可以通过权重的策略实现.  
    可以根据服务器性能,灵活的设置配比
  例如: server localhost:8091 weight=9;
3、轮询+权重
     4、IP_HASH策略
    如果需要让用户与服务器进行绑定. 则使用IPHASH

nginx常见命令?

 nginx 命令(熟练掌握)
说明: nginx的命令需要在根目录中运行 nginx.exe 所在的路径就是根目录
命令:
1. 启动nginx start nginx
2. 重启nginx nginx -s reload
3. 关闭nginx nginx -s stop

##什么是正向代理

1、位置:正向代理服务器介于用户和真实服务器之间
2、使用:用户访问正向代理服务器,并且指定目标服务器地址
3、作用:服务器端不清楚到底是谁访问的,以为是正向代理服务器访问的. 保护了用户信息. 也称之为客户端代理
正向代理应用
用于实现网络通信

问个常见的面试题(当你的项目遇到并发量,请求量大的情况你是怎么做的?),一般回答思路是咋样的?

nginx实现负载均衡 nginx服务器集群  平均服务器的压力,也可以限制流量访问  使用队列技术,排队执行(不知道行不行,因为nginx是异步非阻塞,实现epoll模型,使用队列技术,排队执行实现的高性能),一股脑乱答

加服务器  加服务器分流 ----优化

如何实现秒杀功能: 

controller SecKill 秒杀跳到订单页面 传用户 还有goodsId(商品id)需要先查库存id判断是否有商品
先判断库存 如果没有 就跳到秒杀失败
判断订单是否重复抢购
通过用户id和商品id获取订单 判断订单是否为空 为空就获取用户和商品 创建订单
穿订单和商品
server层
先拿到秒杀商品 通过获取秒杀id  然后通过商品库存减一 因为用户限购一件
updateByid修改秒杀商品id
生成订单
订单获取用户id 商品id
生成秒杀订单
流程
先获取库存id 生成订单 然后生成秒杀订单

Redis高并发秒杀如何实现?
预约通知 生成token(200万)没有token的用户只能看单机动画 获取到token的用户可以访问后台
但要过滤重复请求 token可以拦截一部分 但网关要对下单接口进行限流 用黑名单 或者rides 以及二级缓存 分片
随机发放令牌桶

GIt

Git中代码冲突的解决方式--面试 git中什么是代码冲突,怎么解决。 点此处

Git常用命令--面试

git clone
将代码克隆下来
git add
将修改的文件添加到本地仓库
git commit
将添加的文件提交到本地仓库
git push
将本地仓库中提交的文件推送到远程仓库(本博中指的是github中项目仓库地址)

Linux操作系统

Linux命令 

tab键                    自动补齐(注意唯一性)
pwd                   检查当前的位置
ifconfig/ip addr  检查IP地址

cd命令是linux中最基本的命令语句,必须熟练掌握
cd / 返回根目录
cd . 当前目录
cd ..返回到上一级目录

cd 进入某个目录

pwd 显示当前目录路径

ls(ll) 列出当前目录的文件 ll就是ls -l,列出详细信息

touch 新建一个文件

rm 删除要给文件,加上-rf,就是强制删除目录

mkdir 新建一个目录

mv 移动文件,或者是更改文件名称,mv index.html ./aa,这就是将index.html移动到./aa目录下。mv index.html ./aa/bb.html,这是就是将index.html移动到./aa目录下并改名为bb.html

reset 重新初始化终端/清屏

clear 清屏

history 查看命令历史

help 帮助

# 代表注释

cat 显示文件内容

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号