赞
踩
springboot优势:
application.properties

将这一段配置数据注入Bean

通过类似@Profile注解等解决方案,可以避免项目在开发环境/测试环境/生产环境之间来回切换时频繁大量的修改代码
虽然目前前后端分离是趋势,但是视图层技术还是有一定的意义

CORS跨域资源共享技术标准,支持多种HTTP请求(JSNOP只支持GET)
支持CORS的服务端在响应头中用Access-Control-Allow-Origin字段用来记录可访问该资源的域,浏览器会提取该字段该字段的值包含当前页面也在的域则不再对前段的跨域请求限制,这个流程只针对GET,POST,和HEAD请求且没自定义头
而复杂请求则会有两次请求,一次OPTIONS(用来判断真正请求是否可用)一次真正的请求,简单请求和复杂请求前端代码一致,额外处理均在后端完成
支持CORS浏览器请求

服务器支持CORS,响应格式为,主要是添加了Access-Control-Allow-Origin字段记录可以访问该资源的域(包含了当前页面所在的域)

DELETE为例,前端浏览器发起的DELETE请求会先发送一个OPTIONS请求,这个请求将向服务端询问是否具备该资源的 DELETE 权限

服务端给浏览器响应,Allow 头信息表示服务端支持的请求方法当浏览器分析了请求头宇段之后,知道服务端支持本次请求,则进入下一步
HTTP/1.1 200
Access-Control-Allow- Origin: http://localhost:8081
Access-Control-Allow-Methods: DELETE
Access- Control-Max-Age: 1800 Allow: GET, HEAD, POST, PUT , DELETE, OPTIONS , PATCH
Content-Length : 0 Date: Thu, 12 Jul 2018 13 :20:26 GMT
..
..
浏览器就会发送一个跨域的 DELETE 请求

服务器响应

在注解在方法上配置@CrossOrigin(value=“http://localhost:8081”,maxAge=1800,allowHeaders=“*”)
在注解在方法上的细粒度的控制
配置一个全局配置类
自定类实现WebMvcConfig接口,再实现其中addCorsMappings方法
addCorsMappings
这些基本web组件在spring springmvc整合后基本告别,springboot提供了几个注解能够对这几个组件进行标记

springboot项目启动后会默认找静态资源路径下的index.html找不到则会找动态的index文件作为首页文件3
创建 Spring Boot 项目,添加 MyBatis 依赖、数据库驱动依赖以及数据库连接池依赖


在 Maven 工程中 , XML 配置文件建议写在 resources 目录下
上文的 Mapper.xml 文件写 在包下, Maven 在运行时会忽略包下的 XML 文件,因此需要在 pom.xml 文件中重新指明资源文件位置
<build>
<resources>
<resource> <directory>src/main/j ava</ directory>
<includes>
<include>**/* .xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
NoSQL 是指非关系型数据库
- NoSQL 不使用 SQL 作为查询语言
- 其数据存储可以不需要固定的表格模式
- 一般都有水平可扩展性的特征
- 分类有 键值存储(Redis),列存储(HBase),文档型数据库(MongoDB)图形数据库(DEX)

spring-boot-starter-data-redis 使用的 Redis 工具是 Lettuce, 考虑到有的开发者习惯使用 Jedis,因此可以从 spring-boot-starter-data- redis 中排除 Lettuce 井引入 Jedis





创建Controller测试


在一台服务器上用不同端口表示不同的Redis服务器(伪分布式集群)
主节点: 192.168.248.144:8001 , 192.168.248.144:8002, 192.168.248. 144:8003
从节点: 192.168.248.144:8004, 192.168.248.144:8005' 192.168.248.144:8006
Redis 集群管理工具 redis-trib.rb 依赖 Ruby 环境, 首先需要安装 Ruby 环境
创建redisCluster 文件夹,,将 Redis 压缩文件复制到 redisClustrr 文件 夹中之后编译安装,安装完后将 redis-4.0 .1 01 src 目录下的 redis-trib.rb 文件复制到 redisCluster 目录
在 redisCluster 目录下创建 6 个文件夹,分别命名为 8001 、 8002、 8003、 8004、 8005、 8006, 再将 redis-4.0.10 目录下的 redis.conf 文件分别往这 6 个目录中复制一份,然后对每个目录中的 redis.conf文件进行修改,
主要配置
port 8001
#bind 127 . 0.0.1
#开启集群
cluster- enabled yes
#制定当前集群节点的配置文件
cluster- config- file nodes- 8001.conf
protected no
daemonize yes
#开启密码认证
requirepass 123@456
#masterauth 配置,使得从机可以登录到主机上
masterauth 123@456
启动6个Redis实例
redis-server .. /8001/redis .conf
redis- server .. /8002/redis .conf
redis- server . . /8003/redis.conf
redis- server . . /8004/redis .conf
redis- server .. /8005/redis .conf
redis- server . . /8006/redis .conf
回到 redisCluster 目录下, 首先对 redis-trib.rb 文件进行修改, 由于配置了密码登录,而该命令在执行时默认没有密码,因此将登录不上各个 Redis 实例

修改添加密码参数,123@456 就是之前设置的各个 Redis 实例的登录密码

创建集群
. /redis- trib.rb create - replicas 1 192 .168 .248 .144 :8001 192 . 168.248 .144 :8002 192 .168 . 248 . 144 : 8003 192 .168 .248.144 :8004 192 .168 .248.144 :8005 192 .168 .248 .144 :8006
- replicas 表示每个主节点的 slave 数量
- 在集群的创建过程中会分配主机和从机, 每个集群在创建过程中都将分配到一个唯一的 id 井分配到一段 slot。
添加主节点




- 添加从节点需要指定该从节点的 masterid, --master-id 后面的参数即表示该从节点 master 的 id,
- 192.168.248.144:8008 表示从节点的地址,192.168.248.144:8001 则表示集群中任意一个实例的地址。
- 当从节点添加成功后,登录集群中任意一个 Redis 实例, 通过 cluster nodes 命令就可以看到从节点 的信息
Redis 集群整合 Spring Boot 需要开发者手动配置
<dependency> <groupid>org . springframework. boot</ group Id> <artifactid>spring-boot- starter- web</artifactid> </dependency> <dependency> <groupid>redis . clients</ group Id> <artifactid>jedis</artifactid> < dependency> <dependency> <groupid>org . springframework.data</groupid> <artifactid>spring- data- redis</artifactid> </dependency> <dependency> <groupid> apache.commons</groupid> <artifactid>commons- pool2</artifactid> </dependency>
由于集群节点有多个,可以保存在一个集合中,因此这里的配置文件使用 YAML 格式的

创建 RedisConfig, 完成对 Redis 的配置





创建Controller测试
save 接口用来向 Session 中存储数据,get 接口用来从 Session 中获取数据, 这里注入了项目启动的端口号 server.port, 主要是为了区分到底是哪个服务器提供的服务
另外虽然还是操作的 HttpSession,但是实际上 HttpSession 容器已经被透明替换, 真正的Session此时存储在 Redis 服务器上
@RestController
public class HelloController{
@Value ( ”${ server.port } ” )
String port;
@PostMapping (” / save” )
public String saveName (String name , HttpSession session) {
session . setAttribute (” name ”, name) ;
return port;
}
@GetMapping (” / get" )
public String getName(HttpSession session) {
return port + ” :”+ session .getAttribute("name” ) . toString ();
}
}
将项目打成jar 包上传到 CentOS 上。执行如下两条命令启动项目




本人做过app的前后端开发,在这次开发过程中童同样做了服务器集群,但是并未考虑跨域问题,其实会话共享的原因是跨域问题,而跨域问题是浏览器行为(浏览器同源策略:浏览器脚本只能加载相同ip端口的静态资源)
在Spring MVC 框架中,开发者可以通过@RestController 注解开发一个RESTful 服务, Spring Boot 对此提供了自动化配置方案,开发者只需要添加相关依赖 Spring Data Rest 就能快速构建一个REST服务
SpringBoot中提供了一组开发工具 spring-boot-devtools,可以提高开发者的工作效率, 开发者可以将该模块包含在任何项目中 , spring-boot-devtools 最方便的地方莫过于热部署了
要想在项目中加入 devtools 模块, 只需添加相关依赖
<dependency>
<groupid>org. springfrarnework. boot</ group Id>
<artifactid>spring boot-devtools</artifactid> <optional>true</optional>
</dependency>

使用 IntelliJ IDEA 或者在线创建一个 Spring Boot 项目时,创建成功后, 默认都添加 了 spring-boot-starter-test 依赖,井且创建好了测试类

Service 层的测试就是常规测试

对 HelloServic巳进行测试, 直接在测试类中注入 HelloService

使用 Assert 判断测试结果是否正确
Controller 测试则要使用到 Mock 测试,即对一些不易获取的对象采用虚拟的对象来创建进而方便测试
Spring 中提供的MockMvc则提供了对 HTTP 请求的模拟,使开发者能够在不依赖网络环境的情况下实现对 Controller 的快速测试
@RestController
public class HelloController {
@GetMapping (” / hello")
public String hello(String name) {
return "Hello ” + name + ”!”;
@PostMapping (” / book”)
public Strinq addBook(@RequestBody Book book) {
return book. toString ();
}
}
Controller 中涉及的实体类 Book




Spring Boot针对SpringSecurity提供了自动化配置方案,因此可以使 Spring Security 非常容易地整合进 Spring Boot 项目中
项目开发中,用户的基本信息以及角色等都存储在数据库中,需要从数据库中获取数据进行认证
设计一个基本的用户角色表,一共三张表,分别是用户表、角色表 以及用户角色关联表

创建 Spring Boot Web 项目添加如下依赖




用户实体类需要实现 UserDetails 接口,并实现该接口中的 7 个方法

用户根据实际情况设直这 7 个方法的返回值, 因为默认情况下不需要开发者自己进行密码角色等信息的比对,只需要提供相关信息,例如 getPasswordO方法返回的密码和用 户输入的登录密码不匹配,会自动抛出 BadCredentialsException 异常, isAccountNonExpiredO 方法返回了 false,会自动抛出 AccountExpiredException 异常,开发者只需要按照数据库中数据在这里返回相应的配置即可,本案例因为数据库中只有 enabled 和 locked 字段,故账户未过期和密码未过期两个方法都返回 true.
getAuthoritiesO方法用来获取当前用户所具有的角色信息,本案例中,用户所具有的角色存储 在 roles 属性中,因此该方法直接遍历 roles 属性,然后构造 SimpleGrantedAuthority 集合并返回











目前可实现认证功能,但是受保护的资源都是默认的,也不能根据实际情况进行角色管理
如果要实现这些功能,就需要重写 WebSecurityConfigurerAdapter 中的另一个方法


配置了三个用户, root 用户具备 ADMIN 和 DBA 的角色, admin 用户具备 ADMIN 和 USER 的角色, sang 用户具备USER 的角色
authorizeRequestsO方法开启 HttpSecurity 的配直






关闭csrf
调试

目前登录表单一直使用 Spring Security 提供的页面,登录成功后也是默认的页面跳转
前后端分离正在成为企业级应用开发的主流,在前后端分离的开发方式中,前后端的数据交互通过JSON,进行登录成功后不是页面跳转了,而是一段 JSON提示,要实现这些功能, 只需要继续完善上文的配置


配直了loginPage,即登录页面,配直了 loginPage 后,如果用户未获授权就访问一个需要授权才能访问的接口,就会自动跳转到 login_page 页面让用户登录,这个 login_page 就是开发者自定义的登录页面,而不再是 Spring Security 提供的默认登录页

配置了 loginProcessingUrl,表示登录请求处理接口,无论是自定义登录页面还是移动端登录,都需要使用该接口

定义了认证所需的用户名和密码的参数名,默认用户名参数是 usemame,密码参 数是 password,可以在这里自定义






想要注销登录, 也只需要提供简单的配置即可





是否使 Session 失效,默认为住ue
配直一个 LogoutHandler,开发者可以在 LogoutHandler 中完成一些数据清除工作,例 如 Cookie 的清除。 Spring Security 提供了一些常见的实现
配置一个 LogoutSuccessHandler, 开发者可以在这里处理注销成功后的业务逻辑, 例 如返回一段JSON提示或者跳转到登录页面等
如果业务比较复杂,开发者也可以配置多个 HttpSecurity, 实现对 WebSecurityConfigurerAdapter 的多次扩展
密码加密一般会用到散列函数(散列算法,哈希函数)(常用的散列函数有 MD5 消息摘要算法、安全散列算法 (Secure Hash Algorithm))
使用散列函数还不够,为了增加密码的安全性,一般在密码加密过程中还需要加盐(随机数)
Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder, BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选 择提供由ength 和 SecureRandom 实例。 strength 越大,密钥的迭代次数越多,密钥i是代次数为 2"strength。 strength 取值在 4~31 之间,默认为 10




在 Controller 中注入 Service 井调用 Service 中的方法进行测试,这里比较简单,读者可 以自行测试。
先创建一个普通的SpringBootWeb 项目,添加 Shiro 依赖以及页面模板

不需要添加 spring-boot-starter-web 依赖, shiro-spring-boot-web-starter 中已经依赖了 spring-boot-starter-web
本案例使用 Thymeleaf 模版,因此添加 Thymeleaf 依赖,另外,为 了在 Thymeleaf 中使用 shiro 标签,因此引入了 thymeleaf-extra-shiro 依赖
application.properties 中配置 Shiro 的基本信息


在 Java 代码中配置 Shiro,提供两个最基本的 Bean 即可

配置登录接口以及页面的访问接口

对于其他不需要角色就能访问的接口,直接在 WebMvc 中配置即可

在 resources/templates 目录下创建 5 个 HTML 页面进行测试




轮询
长轮询
Applet 和 Flash
AMQP (Advanced Message Queuing Protocol,高级消息队列协议)是一个线路层的协议规范, 而不是 API 规范(例如 JMS)
由于 AMQP 是一个线路层协议规范,因此它天然就是跨平台的, 就像 SMTP、 HTTP 等协议一样,只要开发者按照规范的格式发送数据,任何平台都可以通过 AMQP 进行消息交互。像目前流行的 StormMQ、 RabbitMQ 等都实现了 AMQP
JMS 从 API 的层面对消息中间件进行了统一, JMS 不支持跨平台,
AMQP 从协议层面来统一,而 AMQP 天然地具备跨平台功能。 AMQP 支持的消息模型也更加丰富
在前后端分离开发中,为了减少与其他团队的沟通成本,一般构建一份RESTful API 文档来描述所有的接口信息,但是这种做法有很大的弊端
开源软件框架,可以帮助开发人员设计、构建、记录和使用RESTful Web 服务,它将代码和文档融为一体,可以完美解决上面描述的问题,使开发人员将大部分精力集中到业务中,而不是繁杂琐碎的文档中

Spring Boot 项目可以内嵌 Serviet 容器, 因此它的部署变得极为方便,可以直接打成可执行 JAR 包部署在有 Java 运行环境的服务器上,也可以像传统的 Java Web 应用程序那样打成 WAR 包运行
spring-boot-maven-plugin 插件可以创建一个可执行的 JAR 应用程序, parent 为 spring-boot-starter-parent
<build>
<plug ins>
<plug in>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
</plugi n> </plugins>
</build>
配置完成后,在当前项目的根目录下执行如下 Maven 命令进行打包:
mvn package
IntelliJ IDEA 中单击 Maven Project,找到 Lifecycle 中的 package 双击打包
打包成功后,在当前项目的根目录下找到 target 目录, target 目录中就有刚刚打成的 JAR 包
对于parent不是 springboot-starter-parent,需要额外配置

Windows 中的运行比较容易,直接进入 target 目录中执行如下命令即可启动项目
java - jar jar-0.0.1-SNAPSHOT. jar
Linux 上运行 Spring Boot 项目需要确保 Linux 上安装了 Java 运行环境
java - jar jar-0.0.1-SNAPSHOT. jar
由于在生产环境中, Linux 大多数情况下都是远程服务器, 开发者通过远程工具连接 Linux,如果使用上面的命令启动 JAR, 一旦窗口关闭, JAR 也 就停止运行了,因此一般通过如下命令启动 JAR
nohup java - jar jar-0.0.1-SNAPSHOT. jar &
- nohup, 表示当窗口关闭时服务不挂起,继续在后台运行的
- &表示让项目在后台运行(信息不打印在控制台)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。