首页 > 其他分享 >spring boot(学习笔记第十一课)

spring boot(学习笔记第十一课)

时间:2024-07-01 19:28:41浏览次数:3  
标签:name spring boot 第十一 server nginx session

spring boot(学习笔记第十一课)

  • Session共享,JPA实现自动RESTful

学习内容:

  1. Session共享
  2. JPA实现自动RESTful

1. Session共享

  1. Session共享面临问题

    • spring boot默认将session保存在web server的内存里面,会产生什么问题呢。在这里插入图片描述
      如上图所示,有nginx作为服务器前置负载均衡器的时候,第一次访问将session保存在web server 1中的内存中,但是第二次访问的时候,假如重新定向到web server 4的时候,将无法正确取得session

    • 使用redis解决问题
      在这里插入图片描述
      使用redis之后,使每次web serversession数据都保存到唯一的redis的,这样重定向到那个web server,最后都会从redis的内存取得,所以每次取得和保存的session数据都一致。

  2. Nginx负载均衡

    • 创建nginx server 最好使用sudo -i注意,这里使用VMware进行创建
      cd /data
      mkdir nginx
      wget https://nginx.org/download/nginx-1.27.0.tar.gz
      cd nginx-1.27.0
      yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
      ./configure
      make
      make install
      
    • 启动nginx server
      • 如果有process占用80端口,通过ss -tulnp | grep :80命令确认。
      • 如果有process占用80端口,通过ss -tulnp | grep :80命令确认。
      • 之后定位到$pid,使用kill -9 $pid结束进行。注意,这里$pid意味需要替换的变量
    • 尝试访问nginx server
      http://192.168.12.130/ 注意,这里采用http,不能采用https,如何配置httpsnginx中需要确认
      在这里插入图片描述
    • 修改nginx.conf配置文件
       upstream finlay.com{
            server 192.168.12.1:8080 weight=1;
            server 192.168.12.1:8081 weight=1;
          }
          #gzip  on;
          server {
              listen       80;
              server_name  localhost;
              #charset koi8-r;
              #access_log  logs/host.access.log  main;
      
              location / {
                  proxy_pass http://finlay.com;
                  proxy_redirect default;
              }
      
  3. spring boot应用加入session依赖
    加入了这个依赖,spring boot应用程序自动 session数据保存到redis的数据库中。

     <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  4. 配置controller并且去掉https

    • 配置controller,在controller中向session保存信息之后从session读取信息。
          @Value("${server.port}")
          private String port;
      
          @PostMapping("/save")
          @ResponseBody
          public String saveName(String name, HttpSession session) {
              session.setAttribute("name", name);
              return port;
          }
      
          @GetMapping("get")
          @ResponseBody
          public String getName(HttpSession session) {
              return port + ":" + session.getAttribute("name").toString();
          }
      
    • https配置去掉,因为暂时nginx没有配置https
      #server.ssl.key-store=classpath:/key/httpskey.p12
      #server.ssl.key-alias=hellohttps
      #server.ssl.key-store-password=123456
      
    • 分别启动80808081两个端口,模拟两个server,进行负载均衡处理server
      java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8080
      java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8081
      
  5. 使用postmannginx服务器进行模拟发送post请求和get请求。

    • 发送post请求,对session上设置nameattribute。从结果是8080端口来看, 这里是通过8080端口的服务器进行session情报的保存。
      在这里插入图片描述

    • 发送get请求,对session上设置nameattribute`。
      在这里插入图片描述

      可以看到当nginx将请求postsave请求上对session进行设置后,8081端口的上get请求,能够马上去的到同样的值,保证服务器端的前置负载均衡器将请求重定向到另一个服务器,取得到的session情报一致。

2. JPA实现自动RESTful

  1. 这里使用postgresql进行实验,对数据源进行配置。

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
    spring.datasource.username=finlay
    spring.datasource.password=123456
    spring.jpa.database=postgresql
    spring.jpa.properties.show-sql=true
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
    
  2. 同样引入必要的依赖

     <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.9</version>
     </dependency>
     <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
    </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    

    注意这里加入了spring-boot-starter-data-rest,可以在后面看到,这里不需要 在定义自己的controller代码,spring-boot-starter-data-rest可以自动生成自己的RESTful方法

  3. JpaRepository提供的默认方法
    JpaRepository本身提供了好多方法。尝试查看下代码。

    @NoRepositoryBean
    public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
        void flush();
        <S extends T> S saveAndFlush(S entity);
        <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
        /** @deprecated */
        @Deprecated
        default void deleteInBatch(Iterable<T> entities) {
            this.deleteAllInBatch(entities);
        }
        void deleteAllInBatch(Iterable<T> entities);
        void deleteAllByIdInBatch(Iterable<ID> ids);
        void deleteAllInBatch();
    
  4. 定义Entity类和创建BookReposity

    • 定义EntityBook
      @Data
      @Entity(name = "book")
      public class Book{
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Integer id;
          private String name;
          private String author;
      }
      
    • 继承JpaRepository<T, ID>,生成自己的interface
      	public interface BookDao extends JpaRepository<Book,Integer> {
      	}
      

    其余的代码需不需要,spring boot会自动生成books (默认的,book表名加上s),作为默认的RESTful API的path

  5. 利用postman进行访问

    • 利用post books进行请求,保存bookEntity对象。
      在这里插入图片描述
    • 查看数据库的保存情况。在这里插入图片描述
    • 看到增加的Entityspring boot也给出了访问的url,进一步使用GET进行访问。
      在这里插入图片描述
    • books发出POST请求,findAll所有的记录。
      在这里插入图片描述
    • book特定id发出PUT请求,修改该记录。
      在这里插入图片描述
    • 对于上面的默认path(url)可以进行修改
    • 修改整个集合的path配置。
      • path
      • collectionResourceRel
      • itemResourceRel
      @RepositoryRestResource(path = "my_books",
              collectionResourceRel = "my_books",
              itemResourceRel = "my_book")
      public interface BookDao extends JpaRepository<Book, Integer> {
      }
      
      在这里插入图片描述

标签:name,spring,boot,第十一,server,nginx,session
From: https://blog.csdn.net/sealaugh1980/article/details/139968824

相关文章

  • springboot+vue项目如何集成企业微信
    本文以springboot+vue技术开发的低代码平台为案例,介绍应用系统如何集成企业微信,包括同步企业微信组织用户、单点登录、消息发送等。在线体验:http://www.yunchengxc.com1、准备应用1.1、注册企业微信账号作为企业微信的企业管理员,首先登录企业微信官网,注册一个企业微信账号。......
  • SpringMVC中的注解配置
    目录13、注解配置springmvc13.1、创建初始化的类,代替web.xml13.2、使用流程声明一个类来继承AbstractAnnotationConfigDispatcherServletInitializer,并且实现他的抽象方法实现配置SpringConfig的java文件实现SpringMvcConfig的java文件13.3、实例代码1.继承AbstractAnnotationConf......
  • SpringBoot项目配置文件加密
    前言防止配置文件敏感信息泄露,去年公司出现过类似事件,也防止源码泄露,对项目中的配置文件进行加密引入方式pom文件引入以下依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</v......
  • springboot校企对接实习管理系统 毕业设计-附源码11959
    摘 要校企合作实习是一种重要的实践教学模式,但是在实际的推行过程中,存在许多管理问题。其中包括远程指导困难、学生管理困难、校企信息沟通不畅等问题一直困扰着校方负责管理实习的教师们。随着互联网系统开发技术的发展,应用web技术开发B/s模式的实习管理系统,根据用户需......
  • SpringMVC的数据获取问题
    在传统的javaweb中我们获取数据是通过HttpServletRequest中的getParameter或者getHeader等方法来获取相关的信息。由此我们引出了以下问题:在SpringMVC中应该如何获取请求提交的数据呢?在SpringMVC中又应该如何获取请求头信息呢?在SpringMVC中又应该如何获取客户端提交的Cookie......
  • Spring的AOP概念详解
    AOP详解:1.介绍:面向切面编程,是一种将非业务代码与业务代码进行分离的一种思想,在实际开发中,往往有许多重复操作,例如事务提交,权限验证,保存口志等功能需要在业务代码重复调用,面向切面编程,就是将非业务代码进行抽取,然后在不修改原来代码的前提下,为我们的业务代码,添加额......
  • springboot使用itextpdf+jfreechart制作PDF文档
    1.springboot引入的依赖组件项目中需要引入itextpdf和jfreechart两个组件,版本根据项目所需进行引入,maven组件版本查询可根据如下地址进行查询:maven组件查询<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><vers......
  • spring趣玩
    自定义banner先上图片,替换spring启动标志;或者也可以在启动类代码设置Banner也可以通过设置springApplication.setBannerMode(Banner.Mode.OFF);关闭打印横幅ApplicationRunner和@PostConstructApplicationRunner是一种灵活的机制,可以用来执行数据库迁移、预加载数据、启动定......
  • springboot-javax.validation检查是否属于指定的值
    引入依赖:<!--jsr303--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><!--hibernatevalidator--><depen......
  • java springboot过滤器
    在SpringBoot应用中添加自定义过滤器,可以通过实现Filter接口或继承OncePerRequestFilter类来创建过滤器,并使用FilterRegistrationBean将其注册到Spring容器中。以下是一个简单的示例:1.创建过滤器类        首先,创建一个实现Filter接口的类,或者为了简化单次请求处......