服务调用&分布式session

2023-05-16

目录

一,Nginx动静分离

二,服务调用

创建配置zmall-cart购物车模块

创建配置zmall-order订单模块

服务调用

 四,spring session实战

什么是Spring Session

为什么要使用Spring Session

配置spring-session

五,二级域名问题

用户登入 


一,Nginx动静分离

第1步:通过SwitchHosts新增二级域名:images.zmall.com

第2步:将本次项目的易买网所有静态资源js/css/images复制到nginx中的html目录下

第3步:在nginx的核心配置文件nginx.conf中新增二级域名images.zmall.com访问映射,用于实现nginx动静分离

注意:修改成功之后,重启nginx服务使其配置生效!!!

server{
    listen 80;
    server_name images.zmall.com;
    location / {
        root html;
        index index.html;
    }
}

将项目中的样式复制到nginx中 的html文件夹中

 

检测在浏览器中查看静态资源服务器配置成功

http://images.zmall.com/css/style.css

第4步:删除zmall-product商品服务和zmall-gateway网关服务下的static静态资源,改用nginx中配置的静态资源

第5步:修改zmall-product商品服务中的

templates/common/head.html

<#assign ctx>
    <#--域名,动态请求时需加入该前缀-->
    http://product.zmall.com
</#assign>
<#--采用H5方式的base标签,在整个页面的url地址前加入,用于访问nginx中的静态资源-->
<base href="http://images.zmall.com/"/>

第6步:分别重启zmall-product、zmall-gateway以及nginx后输入请求地址:zmall.com/product-serv/index.html访问商品服务首页,如下所示:

 

二,服务调用

创建配置zmall-cart购物车模块

第1步:基于Spring initializr创建zmall-cart购物车模块

第2步:将zmall-order订单模块配置到主模块中

<modules>
    ...
    <module>zmall-cart</module>
    ...
</modules>

第3步:修改pom.xml

<parent>
    <groupId>com.zking.zmall</groupId>
    <artifactId>zmall</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>zmall-cart</artifactId>

<dependencies>
    <dependency>
        <groupId>com.zking.zmall</groupId>
        <artifactId>zmall-common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

第4步:配置application.yml(端口:8030)

server:
  port: 8030
spring:
  application:
    name: zmall-cart
  datasource:
    #type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikari
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/zmall?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    password: 1234
  freemarker:
    suffix: .html
    template-loader-path: classpath:/templates/
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
#mybatis-plus配置
mybatis-plus:
  #所对应的 XML 文件位置
  mapper-locations: classpath*:/mapper/*Mapper.xml
  #别名包扫描路径
  type-aliases-package: com.zking.zmall.model
  configuration:
    #驼峰命名规则
    map-underscore-to-camel-case: true
#日志配置
logging:
  level:
    com.zking.zmall.mapper: debug

第5步:在启动类上加入@EnableDiscoveryClient

第6步:分别将购物车页面和common/head.html导入到templates目录,并修改head.html中的ctx局部变量

<#assign ctx>
    <#--一级域名,动态请求时需加入该前缀-->
    http://cart.zmall.com
</#assign>
<#--采用H5方式的base标签,在整个页面的url地址前加入,用于访问nginx中的静态资源-->
<base href="http://images.zmall.com/"/>

第7步:在zmall-gateway网关服务中配置购物车的路由转发规则(重启gateway网关服务)

spring:
  application:
    name: zmall-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        ...
        - id: cart_route
          uri: lb://zmall-cart # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
          predicates:
            - Path=/cart-serv/**
          filters:
            - StripPrefix=1
            #此过滤器设置路由过滤器检查的请求属性,以确定是否应发送原始主机头,而不是由 HTTP 客户端确定的主机头
            - PreserveHostHeader

 注意:这里要配置过滤器PreserveHostHeader,用于处理重定向时依然已原始主机头发送请求。

第8步:创建CartController并定义请求方法

@Controller
public class CartController {

    @RequestMapping("/cart.html")
    public String toCart(){
        return "buyCar";
    }

    @RequestMapping("/addCart")
    public String addCart(Integer pid,Integer num){
        return "redirect:/cart.html";
    }
}

注意:这里使用redirect重定向方式跳转页面,在SpringCloud gateway路由转发过程中会导致域名跳转变成了http请求方式,所以必须在Gateway网关服务中进行相关的配置。具体请参考第8步的gateway网关路由配置

第9步:在zmall-product模块中修改加入购物车的请求方法,定向到购物车

<td><a href="http://cart.zmall.com/addCart?pid=${(product.id)!}&num=3" class="b_sure">去购物车结算</a><a href="#" class="b_buy">继续购物</a></td>

创建配置zmall-order订单模块

第1步:基于Spring initializr创建zmall-order订单模块

第2步:将zmall-order订单模块配置到主模块中

<modules>
    ...
    <module>zmall-order</module>
    ...
</modules>

第3步:修改pom.xml

<parent>
    <groupId>com.zking.zmall</groupId>
    <artifactId>zmall</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>zmall-order</artifactId>

<dependencies>
    <dependency>
        <groupId>com.zking.zmall</groupId>
        <artifactId>zmall-common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

第4步:配置application.yml(端口:8040)

server:
  port: 8040
spring:
  application:
    name: zmall-order
  datasource:
    #type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikari
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/zmall?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    密码: 1234
  freemarker:
    suffix: .html
    template-loader-path: classpath:/templates/
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
#mybatis-plus配置
mybatis-plus:
  #所对应的 XML 文件位置
  mapper-locations: classpath*:/mapper/*Mapper.xml
  #别名包扫描路径
  type-aliases-package: com.zking.zmall.model
  configuration:
    #驼峰命名规则
    map-underscore-to-camel-case: true
#日志配置
logging:
  level:
    com.zking.zmall.mapper: debug

第5步:在启动类上加入@EnableDiscoveryClient@MapperScan({"com.zking.zmall.mapper"})

第6步:定义订单接口,可从公共模块zmall-common中直接复制过来

第7步:创建OrderController并定义请求接口

@Controller
public class OrderController {
    @Autowired
    private IOrderService orderService;

    @RequestMapping("/orderUserList")
    @ResponseBody
    public List<Order> orderUserList(){
        return orderService.list(new QueryWrapper<Order>()
                .eq("userId",18));
    }
}

第8步:在zmall-gateway网关服务中配置购物车的路由转发规则(重启gateway网关服务)  

spring:
  application:
    name: zmall-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        ...
        - id: order_route
          uri: lb://zmall-order # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
          predicates:
            - Path=/order-serv/**
          filters:
            - StripPrefix=1
            - PreserveHostHeader

服务调用

在zmall-user中通过openfeign方式访问order服务接口

定义openfeign接口

@FeignClient("zmall-order")
public interface IOrderFeignService {

    @RequestMapping("/orderUserList")
    List<Order> orderUserList();
}
  • 启动类上设置@EnableDiscoveryClient@EnableFeignClients

  • 调用接口并测试接口

@Controller
public class UserController {

    @Autowired
    private IOrderFeignService orderFeignService;

    @RequestMapping("/login.html")
    public String toLogin(){
        return "login";
    }

    @RequestMapping("/order.html")
    @ResponseBody
    public List<Order> orderUserList(){
        return orderFeignService.orderUserList();
    }
}

测试链路

http://product.zmall.com/index.html
http://product.zmall.com/product.html?pid=733
http://cart.zmall.com/cart.html

界面能够从 商品微服务 直接跳转到 购物车微服务中

 

 ​​

  访问地址:http://localhost:8010/order.html

 调用 用户微服务接口 ,能访问 订单微服务的数据

 四,spring session实战

什么是Spring Session

SpringBoot整合Spring-Session的自动配置可谓是开箱即用,极其简洁和方便。这篇文章即介绍SpringBoot整合Spring-Session,这里只介绍基于RedisSession的实战。

Spring Session 是Spring家族中的一个子项目,Spring Session提供了用于管理用户会话信息的API和实现。它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,默认Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中

spring session官网地址:Spring Session

Spring Session的特性:

  • 提供用户session管理的API和实现

  • 提供HttpSession,以中立的方式取代web容器的session,比如tomcat中的session

  • 支持集群的session处理,不必绑定到具体的web容器去解决集群下的session共享问题

为什么要使用Spring Session

 

 SpringCloud微服务将一个完整的单体应用拆解成了一个个独立的子服务,而每一个独立的微服务子模块都将部署到不同的服务器中,而服务与服务之间是独立隔离的,这个时候使用要实现服务与服务之间的session会话共享,则需要借助于spring-session框架来解决分布式session管理与共享问题。

配置spring-session

在公共模块zmall-common中引入spring-session的pom配置,由于spring-boot包含spring-session的starter模块,所以pom中依赖: 注意:公共模块作为所有微服务子模块的依赖支持,如果不在各服务模块中配置redis支持,会导致启动其他微服务时出现报错情况。

<!--redis-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring session-->
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--commons-pool2-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

分别在商品服务zmall-product和用户服务zmall-user中配置application.yml

spring:
  session:
    redis:
      flush-mode: on_save
      namespace: session.zmall
      cleanup-cron: 0 * * * * *
    store-type: redis
    timeout: 1800
  redis:
    host: localhost
    port: 6379
    password: 123456
    jedis:
      pool:
        max-active: 100
        max-wait: 10
        max-idle: 10
        min-idle: 10
    database: 0

重新启动zmall-user和zmall-product服务,先访问:http://zmall.com/user-serv/login.html,然后在访问:http://zmall.com/product-serv/index.html;回到zmall-product模块控制台查看session获取情况。

注意:借助网关微服务内部可以访问,不同二级域名之间不可以访问

五,二级域名问题

测试在用户模块中保存用户信息,然后在产品模块中读取,但是使用二级域名方式访问读取失败

 

 请分别在用户服务和商品服务中该配置类,解决二级域名访问session无效问题。

@Configuration
public class SessionConfig {
    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("zmall.com");
        cookieSerializer.setCookieName("ZMALLSESSION");
        return cookieSerializer;
    }
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
        return new GenericJackson2JsonRedisSerializer();
    }
}

测试链路

#1.先访问
http://user.zmall.com/login.html
#2.后访问
http://product.zmall.com/index.html

用户登入 

第1步:在zmall-common公共模块中创建全局异常处理、响应封装类

第2步:在zmall-user模块中定义IUserService及UserServiceImpl

IUserService

public interface IUserService extends IService<User> {
    JsonResponseBody<?> userLogin(UserVo user, HttpServletRequest req, HttpServletResponse resp);
}

UserServiceImpl

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Override
    public JsonResponseBody<?> userLogin(UserVo user,
                                         HttpServletRequest req,
                                         HttpServletResponse resp) {
        //1.判断用户账号和密码是否为空
        if(StringUtils.isEmpty(user.getLoginName())||
                StringUtils.isEmpty(user.getPassword()))
            return new JsonResponseBody<>(JsonResponseStatus.USERNAME_OR_PWD_EMPTY);
        //2.根据用户名查询数据对应的用户信息
        User us = this.getOne(new QueryWrapper<User>()
                .eq("loginName", user.getLoginName()));
        //3.判断us用户对象是否为空
        if(null==us)
            return new JsonResponseBody<>(JsonResponseStatus.USERNAME_ERROR);
        try {
            //MD5加密转换处理
            String pwd=MD5Utils.md5Hex(user.getPassword().getBytes());
            //4.判断输入密码与数据库表存储密码是否一致
            if(!us.getPassword().equals(pwd)){
                return new JsonResponseBody<>(JsonResponseStatus.PASSWORD_ERROR);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>(JsonResponseStatus.ERROR);
        }
        //5.通过UUID生成token令牌并保存到cookie中
        String token= UUID.randomUUID().toString().replace("-","");
        //将随机生成的Token令牌保存到Cookie中,并设置1800秒超时时间
        CookieUtils.setCookie(req,resp,"token",token,7200);
        //6.将token令牌与spring session进行绑定并存入redis中
        HttpSession session = req.getSession();
        session.setAttribute(token,us);
        return new JsonResponseBody<>(token);
    }
}

第3步:创建UserVo类

@Data
public class UserVo {
    private String loginName;
    private String password;
}

第4步:在UserController中定义用户登录方法

/**
* 用户登陆功能实现
* @return
*/
@RequestMapping("/userLogin")
@ResponseBody
public JsonResponseBody<?> userLogin(UserVo user,
    HttpServletRequest req,
    HttpServletResponse resp){
    return userService.userLogin(user,req,resp);
}

第5步:在前端login.html页面中定义登录js方法

<script>
    $(function(){
        $('.log_btn').click(function(){
            let loginName=$('.l_user').val();
            let password=$('.l_pwd').val();

            if(''===loginName){
                alert('请输入用户名!');
                return false;
            }
            if(''===password){
                alert('请输入密码!');
                return false;
            }
            console.log({
                loginName:loginName,
                password:password
            });
            $.post('http://zmall.com/user-serv/userLogin',{
                loginName:loginName,
                password:password
            },function(rs){
                console.log(rs);
                if(rs.code===200){
                    location.href='http://zmall.com/product-serv/index.html';
                }else{
                    alert(rs.msg);
                }
            },'json');
        });
    });
</script>

登录成功后,跳转到商品首页

http://zmall.com/user-serv/login.html

如果用二级域名进行测试,那么需要解决跨域问题;

url: jdbc:mysql://localhost:3306/zmall?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务调用&分布式session 的相关文章

  • vscode配置C/C++调试环境

    转自作者知乎的原创文章 vscode配置C 43 43 调试环境 在环境变量path中添加mingw中bin后 在vscode界面侧边栏点击调试界面 xff0c 创建launch json文件 添加配置后保存就行 下为我的添加配置后自动生成
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1
  • postman Windows的详细安装过程

    1 首先去postman官网下载postman 官网地址 xff1a Download Postman Get Started for Free https www postman com downloads 2 根据你浏览器下载的所在位置
  • 数据结构链表的结构体定义的理解(C语言)

    此理解有参考数据结构的教材和一些博主的文章 xff1b 1 先补充一下typedef在此处的基本用法 xff1a typedef可用来建立已经定义好的数据类型的别名 形式为 xff1a typedef 已有变量名 别名 通俗的来说就是给已有
  • ROS安装与Rviz的摄像头视频采集与标定

    文章目录 一 ROS的安装与配置1 添加 ROS 软件源 xff0c 将下列命令输入到 Ubuntu 的终端执行2 添加密钥 xff0c 将下列命令输入到 Ubuntu 的终端执行3 安装desktop full4 初始化rostep5 设
  • HTTP协议的基本格式

    目录 一 HTTP请求 1 1 首行 1 1 1 URL 1 1 2 方法 1 2 请求报头 xff08 header xff09 1 2 1 host 编辑 1 2 2 Content Length和Content Type 1 2 3
  • 思岚雷达win与ubuntu18.04连接并测试详细过程

    雷达简介 包含套件 雷达模组 xff08 内置pwm电机驱动 xff09 usb适配器 Micro USB线缆 电源线 接线方式 ps 雷达不需额外的电源供电 xff0c 直接使用电脑USB接口 xff0c 5V供电 驱动安装 USB 适配
  • c/c++常见字符串函数(strlen,strcmp,strcat,strcpy,strstr,strncpy,strncat,strncmp)的详解和自己编辑实现

    下面介绍c语言中指针与数组的面试题 再看下列题之前首先要知识储备 下面用c语言介绍常用字符串函数和进行编译 一 介绍strlen函数 unsigned int strlen char s 或size t strlen const char
  • 【C语言】学数据结构前必学的结构体struct详细

    佛祖说 xff0c 他可以满足程序猿一个愿望 程序猿许愿有生之年写出一个没有bug的程序 xff0c 然后他得到了永生 目录 1 结构体的声明与定义 1 1结构体是什么 xff1f 1 2为什么要有结构 xff1f 1 3结构体的声明 1
  • 数据结构哈希查找的C语言实现

    大家好 xff0c 我是练习编程时长两年半的昆工第一ikun xff0c 今天我们来分享查找算法中的一个 哈希查找 xff0c 哈希查找适用于有庞大的数据量时的查找 xff0c 是一种很好用的查找算法 xff0c 话不多说 xff0c 开团
  • 为什么很多程序员喜欢linux系统?

    a gt Linux哪些行业在运用 xff1f Linux系统运用极其广泛 xff0c 不少用户只知道windows xff0c 是因为 xff0c Linux的运用主要是在企业端 现在科技极其发达 xff0c 我们手机在手 xff0c 就
  • Linux Ubuntu下的标准IO相关库函数的介绍与使用

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 今天我们来分享一下标准IO相关函数库的介绍与使用 xff0c 话不多话 xff0c 开团 xff01 xff01 xff01 xff01 xff01 目录
  • Linux Ubuntu下的文件IO介绍及实例应用(C语言)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 昨天咋们说了标准IO xff0c 今天咋们来分享文件IO xff0c 以及一个很有趣的实例 xff0c 给图片加密 xff0c 使其无法打开 话不多说 xf
  • 输入年月日得出该天是星期几(C语言)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 昨天因为在写Thoughtworkers的2018年笔试题 xff0c 所以没有更新 xff0c 今天就先把笔试题中的一个函数分享出来 xff0c 该函数可
  • Linux下的UDP服务器客户端的搭建(C语言实现)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 昨天我们说了搭建TCP的服务器和客户端 xff0c 今天我们就来分享一下UDP的服务器和客户端搭建 UDP的特点是无连接 xff0c 多个客户端可以发送消息
  • 使用STL库list类实现单双向约瑟夫环问题(C++)

    目录 一 单向约瑟夫环 1 问题描述 2 list类函数用法 xff08 1 xff09 list构造 xff08 2 xff09 list iterator迭代器 xff08 3 xff09 list容量 xff08 4 xff09 li
  • 使用Qt制作个人计算器

    我们知道windows系统有自带的计算器 xff0c 那么我们也可以用Qt制作一款类似的个人计算器 xff0c 实现整数的加减乘除括号运算 xff0c 界面设计使用Qt xff0c 计算使用逆波兰算法 xff0c 下面我就来分享一下个人计算
  • 使用Qt制作简易的图片查看器

    我们知道windows系统有自带的图片查看器 xff0c 那么我们也可以用Qt制作一款类似的图片查看器 xff0c 实现图片的打开查看以及图片的翻页 xff0c 下面我就来分享一下图片查看器的制作方法 目录 一 描述 二 代码实现 1 头文
  • 计算机网络第二章总结

    目录 1 1物理层的基本概念 1 2数据通信的基础知识 1 2 1数据通信系统的模型 1 2 2信道的几个基本概念 常用的编码方式 1 2 3信道的极限容量 1 3物理层下面的传输媒体 1 3 1导引型传输媒体 1 双绞线 2 同轴电缆 3
  • 假溢出的解决策略

    假溢出 xff1a 在顺序队列中 xff0c 队列出队时并没有像线性表那样使后面的元素往前移 为了解决假溢出 xff0c 常用的方法是把队列想成一个首尾相接的环 xff0c 这种叫循环队列 在循环队列的入队和出队操作中 xff0c 用到了求

随机推荐

  • C++之lambda函数(匿名函数)

    lambda函数简介 lambda函数是C 43 43 11标准新增的语法 xff0c 也称为lambda表达式或匿名函数 lambda函数的特点是 xff1a 距离近 简洁 高效和功能强大 优点 声明式编程风格 xff1a 就地匿名定义目
  • 远程桌面基本原理

    远程桌面基本原理 远程桌面是一种技术 xff0c 它允许用户通过互联网或局域网远程访问另一台计算机的桌面 这种技术可以让用户在不同的地方使用同一台计算机 xff0c 或者在同一地方使用不同的计算机 远程桌面技术在现代计算机应用中发挥着重要的
  • C++之迭代器

    迭代器 C 43 43 中 xff0c 迭代器就是类似于指针的对象 xff0c 但比指针的功能更丰富 xff0c 它提供了对对象的间接访问 xff0c 每个迭代器对象代表容器中一个确定的地址 举个例子 xff1a void test vec
  • C++之类模板全特化和偏特化

    类模板 类模板是通用类的描述 xff0c 使用任意类型 xff08 泛型 xff09 来描述类的定义 使用类模板的时候 xff0c 指定具体的数据类型 xff0c 让编译器生成该类型的类定义 注意 xff1a 函数模板中可以不指定具体数据类
  • C++之完美转发、移动语义(forward、move函数)

    完美转发 1 在函数模板中 xff0c 可以将 自己的参数 完美 地转发 给其它函数 所谓完美 xff0c 即 不仅能准确地转发参数的值 xff0c 还能保证被转发参数的左 右值属性不变 2 C 43 43 11标准引入了右值引用和移动语义
  • C++之异常处理

    异常 异常是面向对象语言 处理错误的一种方式 当一个函数出现自己无法处理的错误时 xff0c 可以抛出异常 xff0c 然后输的直接或者间接调用者处理这个错误 语法 捕获全部的异常 try 可能抛出异常的代码 throw异常对象 catch
  • C++之原子操作(atomic)

    原子操作 所谓原子操作是指不会被线程调度机制打断的操作 xff1b 这种操作一旦开始 xff0c 就一直运行到结束 xff0c 中间不会有任何 context switch xff08 切换到另一个线程 xff09 原子操作是不可分割的 x
  • C++之RAII机制

    RAIIResource acquisition is initialization的缩写 xff0c 意思是 资源获取即初始化 xff0c 其核心思想是利用C 43 43 对象生命周期的概念来控制程序的资源 它的技术原理很简单 xff0c
  • VsCode反应较慢(vscode卡顿,反应慢)

    简述 xff1a 这几天敲代码的时候发现vscode反应好慢 xff0c 有时候更改个样式 xff0c 也是同样 xff0c 然后就开始找原因 xff0c 之前开的代码自动保存 xff0c Git Autorefresh Files Aut
  • 【C++教学】第一课——头文件,全局命名空间,主函数的介绍

    头文件 初学者肯定疑惑为什么每次打代码都要写一个所谓的头文件 xff08 如 xff1a iostream xff09 xff0c 因为你所用的 cout gt gt 34 hello world 34 就是这个 是在iostream里的东
  • JavaWeb02(js基本语法&表单提交方式)

    一 xff0c js基本语法 1 jsp是什么 xff1f 实际上jsp就是Servlet xff0c 是一种可以用来开发web资源的技术 2 jsp运行原理 xff1f jsp文件先翻译成 java xff0c 在将其编译成 class
  • JavaWeb(分页)

    1 分页显示的步骤 xff1a xff08 1 xff09 确定每页显示的数据量 xff08 2 xff09 计算显示的页码 xff08 3 xff09 编写SQL语句 当数据多起来的时候 xff0c 记得需要一个容器将它包装起来 xff0
  • HTTP代理

    HTTP代理 xff08 HTTP Proxy xff09 是一种在网络中经常使用的技术 xff0c 允许客户端计算机通过指定的代理服务器来进行HTTP请求 在本文中 xff0c 我将介绍HTTP代理的基本原理 实现方法以及相关的应用和安全
  • LayUI项目之我的会议(送审以及排座)

    目录 一 xff0c 会议排座 1 前台编码 调试后的jsp代码 2 后台编码 1 图片工具类 2 js代码 3 SQL语句编写 4 子控制器 5 dao方法 三 图片处理 图片处理类 前台代码 后台接收 三 xff0c 会议送审 1 前台
  • Docker-宿主机与容器之间的文件拷贝

    目录 一 xff0c Docker运行MySQL容器 二 xff0c 数据卷 三 xff0c 数据卷容器 四 xff0c Dockerfile制作增强版 五 xff0c Docker制作自定义Tomcat 一 xff0c Docker运行M
  • 小程序框架

    目录 一 xff0c 框架 二 xff0c 响应的数据绑定 三 xff0c 页面管理 四 xff0c 基础组件 逻辑层 App Service 五 xff0c 小程序的生命周期 六 xff0c 注册页面 1 使用 Page 构造器注册页面
  • 小程序后台数据交互-个人中心

    目录 一 xff0c 获取用户昵称和头像 登录过程 二 xff0c 登录 小程序 三 xff0c 后台 小程序服器配置 一 xff0c 获取用户昵称和头像 登录过程 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身
  • 微服务框架及多模块开发

    目录 一 xff0c 项目模式 二 xff0c 项目架构图 三 xff0c 案例演示 主模块 公共子模块 子模块 添加页面公共资源 一 xff0c 项目模式 电商模式 xff1a 市面上有5种常见的电商模式 xff0c B2B B2C C2
  • Mybatis与微服务注册

    目录 一 xff0c Springboot整合MybatisPlus 创建商品微服务子模块 二 xff0c SpringBoot整合Freeamarker 三 SpringBoot整合微服务 amp gateway amp nginx 整合
  • 服务调用&分布式session

    目录 一 xff0c Nginx动静分离 二 xff0c 服务调用 创建配置zmall cart购物车模块 创建配置zmall order订单模块 服务调用 四 xff0c spring session实战 什么是Spring Sessio