苍穹外卖项目(黑马)学习笔记DAY1

目录

背景知识

        企业软件开发流程

        角色分工

        软件环境

        NGNIX配置

苍穹外卖整体功能

 登录功能完善

 登入认证/校验

背景知识

  • 企业软件开发流程

        需求分析(需求规格说明说、产品原型)------>设计(UI设计、数据库设计、接口设计)------->编码(项目代码、单元测试)------>测试------->上线运维

  • 角色分工

        项目经理(对项目整体规划安排)、产品经理(需求分析)、UI设计师、架构师、开发工程师、测试工程师、运维工程师

  • 软件环境

           开发环境---------->测试环境---------->生产环境

  • NGNIX配置

        前端环境的搭建需要使用ngnix(注意ngnix需要在没有中文的目录下否在会出错)。

        ngnix是一个高性能的开源反向代理服务器,也可以用作 HTTP 服务器、负载均衡器和反向代理服务器。再苍穹外卖这个项目中,我们会使用其反向代理的功能。那什么是反向代理呢?反向代理是一种网络服务器架构,它接受客户端的请求,并将这些请求转发到内部的多个服务器上。反向代理其代理对象是服务器,而正向代理的对象是客户端。反向代理的主要功能包括:负载均衡:向代理可以将客户端请求分发到多个内部服务器上,以平衡服务器的负载。隐藏内部服务器: 反向代理可以隐藏后端服务器的真实 IP 地址和信息,从而增加了服务器的安全性。SSL 终端: 反向代理可以用作 SSL 终端,负责处理客户端和服务器之间的加密通信。缓存和压缩、安全性、统一入口。

        以苍穹外卖账号登入过程为例,我们来看ngnix的方向代理在此发挥的作用。使用ngnix的反向代理功能也正是为了负载均衡,隐藏内部服务器达到后端安全,还有提高访问速度。

苍穹外卖项目(黑马)学习笔记DAY1_第1张图片

        关于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的信息也可以去黑马相关课程去学习,当初跟这个项目的时候一直搞不明白这前端的页面请求怎么到后端,所以希望大家看到这个就没有这个困惑。

苍穹外卖整体功能

苍穹外卖项目(黑马)学习笔记DAY1_第2张图片

苍穹外卖项目(黑马)学习笔记DAY1_第3张图片

 登录功能完善

         思路:数据库中的密码应该是加密后的形式,防止数据库泄露后用户密码的暴露。

使用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完成登入认证

        思路:登入成功后,生成令牌。之后的每个请求都要验证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");
    }

如果有帮助你,希望可以点赞收藏转发~

你可能感兴趣的:(苍穹外卖学习笔记,spring,maven,spring,boot,mybatis,nginx)