目录
背景知识
企业软件开发流程
角色分工
软件环境
NGNIX配置
苍穹外卖整体功能
登录功能完善
登入认证/校验
需求分析(需求规格说明说、产品原型)------>设计(UI设计、数据库设计、接口设计)------->编码(项目代码、单元测试)------>测试------->上线运维
项目经理(对项目整体规划安排)、产品经理(需求分析)、UI设计师、架构师、开发工程师、测试工程师、运维工程师
开发环境---------->测试环境---------->生产环境
前端环境的搭建需要使用ngnix(注意ngnix需要在没有中文的目录下否在会出错)。
ngnix是一个高性能的开源反向代理服务器,也可以用作 HTTP 服务器、负载均衡器和反向代理服务器。再苍穹外卖这个项目中,我们会使用其反向代理的功能。那什么是反向代理呢?反向代理是一种网络服务器架构,它接受客户端的请求,并将这些请求转发到内部的多个服务器上。反向代理其代理对象是服务器,而正向代理的对象是客户端。反向代理的主要功能包括:负载均衡:反向代理可以将客户端请求分发到多个内部服务器上,以平衡服务器的负载。隐藏内部服务器: 反向代理可以隐藏后端服务器的真实 IP 地址和信息,从而增加了服务器的安全性。SSL 终端: 反向代理可以用作 SSL 终端,负责处理客户端和服务器之间的加密通信。缓存和压缩、安全性、统一入口。
以苍穹外卖账号登入过程为例,我们来看ngnix的方向代理在此发挥的作用。使用ngnix的反向代理功能也正是为了负载均衡,隐藏内部服务器达到后端安全,还有提高访问速度。
关于ngnix最终要的就是其配置文件,如果我们使用的是我们自己的ngnix仅仅把前端文件拖入到html目录下我们需要对配置文件进行修改。(这里建议直接使用黑马提供的ngnix)
打开ngnix的配置文件ngnix.conf,配置信息分为三大部分分贝为:global、events、http。全局配置主要是定义一些会影响 Nginx 服务器的整体行为比如运行 Nginx 的用户和用户组;events 部分用于配置 Nginx 的事件处理方式,包括连接数限制、事件模型等;http 部分是 Nginx 配置文件的核心,用于配置 HTTP 服务器的行为。
根据提供的ngnix配置文件来看一下配置相关的知识。
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
map $http_upgrade $connection_upgrade{
default upgrade;
'' close;
}
upstream webservers{
server 127.0.0.1:8080 weight=90 ;
#server 127.0.0.1:8088 weight=10 ;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/sky;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 反向代理,处理管理端发送的请求
location /api/ {
proxy_pass http://localhost:8080/admin/;
#proxy_pass http://webservers/admin/;
}
# 反向代理,处理用户端发送的请求
location /user/ {
proxy_pass http://webservers/user/;
}
# WebSocket
location /ws/ {
proxy_pass http://webservers/ws/;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "$connection_upgrade";
}
}
在ngnix的配置中可以使用include导入其他配置文件的信息mime.types
文件中定义了文件扩展名和对应的 MIME 类型的映射关系。MIME 类型用于指示服务器如何解释和处理特定类型的文件。默认的 MIME 类型为 application/octet-stream。
include mime.types;
default_type application/octet-stream;
sendlife用来设置Nginx服务器是否使用sendfile()传输文件,一般搭配tcp_nopush和tcp_nodeplay使用,提高Nginx处理静态资源的性能。
sendfile on;
keepalive_timeout用于设置客户端和 Nginx 服务器之间的 Keep-Alive 连接的超时时间。Keep-Alive 是一种机制,它允许在单个 TCP 连接上发送多个 HTTP 请求和响应,从而减少连接的建立和关闭次数,提高性能。
keepalive_timeout 65;
webserves的配置会在以后的课程学习中介绍这里先跳过。
在 Nginx 配置文件的 http
部分内,可以定义多个 server
块来配置不同的虚拟主机(也称为服务器块)。每个 server
块代表一个特定的域名或端口的配置。
这里listen代表监听的端口号,设置虚拟主机的名称,设置了请求的URI。location后面可以跟=、~、~*以及@。=用与精确匹配而~和~*表示uri中包含正则表达式前者是区分大小写,后者是不区分大小写,正则表达式的开始以^为起点,结尾以$为终点。root设置了根目录,当客户端请求访问网址上的资源时,Nginx 使用指定的根目录作为起点来查找文件。比如:客户端发送一个请求, http://localhost/index.html,ngnix将在html/sky下查找index.html或index.htm。error_page:设置网站的错误页面,后面跟着状态码,当出现响应code后,重定向到50x.html。
server {
listen 80;
server_name localhost;
location / {
root html/sky;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 反向代理,处理管理端发送的请求
location /api/ {
proxy_pass http://localhost:8080/admin/;
#proxy_pass http://webservers/admin/;
}
# 反向代理,处理用户端发送的请求
location /user/ {
proxy_pass http://webservers/user/;
}
这里重点说明反向代理。反向代理一般可以设置proxy_pass、proxy_set_header、proxy_redirect
第一个proxy_pass用来设置被代理服务器地址这里设置为http://localhost:8080/admin/。当客户端发送http://localhost/api/*请求时通过ngnix会发送到服务器去处理。
第二个proxy_set_header可以更改Nginx服务器接收到的客户端请求的请求头信息,然后
将新的请求头发送给代理的服务器
第三个proxy_redirect重置头信息中的"Location"和"Refresh"的值
更多相关ngnix的信息也可以去黑马相关课程去学习,当初跟这个项目的时候一直搞不明白这前端的页面请求怎么到后端,所以希望大家看到这个就没有这个困惑。
思路:数据库中的密码应该是加密后的形式,防止数据库泄露后用户密码的暴露。
使用MD5加密后与数据库中保存的密码进行对比,新添加的账号密码也得是加密后的结果再保存到数据库中。
//密码比对
//将密码进行MD5加密后再和数据库中的密码进行对比
password=DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
一个浏览器访问web服务器资源,会建立一个会话,直到有一方断开连接后,会话结束,一次会话中可以包含多次请求和响应。通过会话跟踪,服务器可以识别请求是否来自同一浏览器,以便在同义词会话的多次请求中共享数据。可以通过:Cookie、Session、token实现。
思路:登入成功后,生成令牌。之后的每个请求都要验证JWT令牌的合法性,通过了才处理请求。
生成令牌
@Test
void getToken(){
Map claims= new HashMap<>();
claims.put("id",1);
claims.put("username","xiaowang");
String jwt = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS256, "wang")
.setExpiration(new Date(System.currentTimeMillis() + 12 * 3600 * 1000))
.compact();
System.out.println(jwt);
}
解析令牌(只要不报错就说明令牌是正确的)
@Test
void testToken(){
Claims claims = Jwts.parser()
.setSigningKey("wang")
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjkxODczNzc1LCJ1c2VybmFtZSI6InhpYW93YW5nIn0.fvyi16FVJSLgyp-pHoRCbODS4SphCMYGAm-LkrDNr2w")
.getBody();
System.out.println(claims);
}
之后通过过滤器或拦截器来实现校验JWT令牌。
苍穹外卖中使用的是拦截器,使用拦截器的步骤是:1.定义拦截器实现HandlerInterceptor接口,重写方法。
@Component
public class JwtTokenAdminInterceptor implements HandlerInterceptor {
//重写preHandle中的方法
public boolean preHandle(){
//获取请求头令牌
String token=...;
//校验令牌
try{
//没有报错说明通过 方向
}catch (Exception ex) {
//报错则不通过
}
}
}
2.在配置类注册自定义的拦截器
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Autowired
private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
/**
* 注册自定义拦截器
*
* @param registry
*/
protected void addInterceptors(InterceptorRegistry registry) {
log.info("开始注册自定义拦截器...");
registry.addInterceptor(jwtTokenAdminInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/employee/login");//排除拦截的请求
registry.addInterceptor(jwtTokenUserInterceptor)
.addPathPatterns(("/user/**"))
.excludePathPatterns("/user/user/login")
.excludePathPatterns("/user/shop/status");
}
如果有帮助你,希望可以点赞收藏转发~