1.SpringBoot整合Redis集群
1.1 编辑redis.properties配置文件
redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
1.2 编辑配置类
@Configuration //我是一个配置类 一般都会与@Bean联用
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
/**
* spring整合Redis集群
*/
@Value("${redis.nodes}")
private String redisNodes;
@Bean
public JedisCluster jedisCluster() {
Set<HostAndPort> nodeSet = new HashSet<HostAndPort>();
String[] clusters = redisNodes.split(",");
for (String cluster : clusters) { //host:port
String host = cluster.split(":")[0];
int port = Integer.parseInt(cluster.split(":")[1]);
nodeSet.add(new HostAndPort(host, port));
}
return new JedisCluster(nodeSet);
}
}
1.3编辑AOP注入
1.4页面效果展现
2.京淘分布式架构-jt-web服务器
2.1 项目架构图设计
2.2 JT-WEB项目构建
2.2.1 新建项目
2.2.2 选择打包类型
2.2.3 添加继承依赖插件
<parent>
<groupId>com.jt.vip</groupId>
<artifactId>jt</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.jt.vip</groupId>
<artifactId>jt-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<!--3.添加插件 -->
<!--负责项目打包 更新 maven操作相关的配置 必须添加 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.2.4 导入静态资源文件
说明: 将课前资料中的文件 添加到jt-web的项目中.
2.2.5 编辑主启动类
/**
* Failed to configure a DataSource: 'url' attribute is not
* specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
* @author pc
* springBoot项目 特点:开箱即用
* 该springBoot启动时,不需要添加数据源
*/
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class,args);
}
}
2.2.6 项目启动测试
2.2.7 配置nginx实现反向代理
1).修改HOST文件
2).修改nginx配置文件
#配置前端服务器 www.jt.com:80 转向到http://localhost:8092服务器中
server {
listen 80;
server_name www.jt.com;
location / {
proxy_pass http://localhost:8092;
}
}
3).效果展现
2.2.7 关于JT-WEB服务器发布问题
问题1: 访问http://www.jt.com时,访问报错
问题2: 访问http://www.jt.com时,跳转的是国外的网站
解决方案1: 让谷歌浏览器禁止将http自动的转化为https
地址栏中输入
chrome://net-internals/#hsts
在这里插入图片描述
键入之后,点击delete,之后清楚缓存,重启浏览器即可.
解决方式2: 如果改完hosts/nginx服务器之后依然跳转国外网站,则需要检查谷歌浏览器是否开启了VPN(翻墙工具)
3.用户数据校验
3.1页面通用跳转
3.1.1关于静态页面访问问题
说明: 浏览器通过网址查询静态页面时,需要在后端服务器中准备固定的页面.才能正确的访问.
准备页面:
疑问: 京东家的商品有上千万.如果采用上述的方式进行访问,则必须准备上千万的.html页面,才能实现商品的展现. 这样的方式不合理.
正确的方式: 应该准备一个公共的页面,之后根据商品的ID进行查询.之后在同一个页面中展现不同的商品信息即可.
3.1.2 开启后缀类型匹配
问题:如何能够拦截.html为结尾的请求,之后实现由mvc通过视图解析器实现程序的页面跳转
解决方案: 添加配置类
package com.jt.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfigurer implements WebMvcConfigurer{
//开启匹配后缀型配置
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
}
}
3.1.3 编辑UserController
说明:编辑userController实现用户注册/登录页面跳转.
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 实现用户页面跳转
* http://www.jt.com/user/register.html 后端页面register.jsp
* http://www.jt.com/user/login.html 后端页面login.jsp
* 重点:为了实现业务功能,拦截.html结尾的请求.
*/
@RequestMapping("/register")
public String register() {
//经过视图解析器,跳转指定的页面中
return "register";
}
@RequestMapping("/login")
public String login() {
//经过视图解析器,跳转指定的页面中
return "login";
}
}
3.1.4 为什么页面以.html结尾
说明: .html结尾的请求更容易被搜索引擎收录.增强网站的曝光率.
倒排索引: 根据关键字检索文件的位置
搜索引擎工作原理:
3.1.5 伪静态
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结: 以.html为结尾的展现动态页面的技术称之为伪静态.
3.2 创建jt-sso
3.2.1 创建jt-sso项目
3.2.2 选择jar包
3.2.3 添加继承/依赖/插件
<parent>
<groupId>com.jt.vip</groupId>
<artifactId>jt</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>jt-sso</artifactId>
<dependencies>
<dependency>
<groupId>com.jt.vip</groupId>
<artifactId>jt-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<!--3.添加插件 -->
<!--负责项目打包 更新 maven操作相关的配置 必须添加 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2.4.编辑POJO对象
@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password; //密码加密处理
private String phone; //电话
private String email; //邮箱
}
3.2.4.构建JT-SSO代码
3.2.5 编辑nginx配置文件
说明:要求 用户通过sso.jt.com的方式访问服务器localhost:8093
#配置前端服务器 sso.jt.com:80 转向到http://localhost:8093服务器中
server {
listen 80;
server_name sso.jt.com;
location / {
proxy_pass http://localhost:8093;
}
}
3.3 跨域实现
3.3.1 跨域访问测试
案例1:
页面网址:http://manage.jt.com:80/test.html
ajax请求: http://manage.jt.com:80/test.json
结论: 当请求协议://域名:port端口号都相同时 访问正常的.
案例2:
页面网址: http://www.jt.com:80/test.html
ajax请求: http://manage.jt.com:80/test.json
结论: 当浏览器的地址与ajax地址不同时,请求不能正常执行.
3.3.2 同源策略说明
说明:浏览器在发起AJAX请求时,必须遵守同源策略的规定.否则数据无法正常解析.
策略说明: 发起请求时,必须满足 协议://域名:端口都相同(和当前页面对比)时.满足同源策略要求.浏览器可以正确的发起请求,并且解析结果.,
但是如果上述的三项中有一项不同,则表示跨域访问.浏览器不予解析返回值结果.
例题: 问http://manage.jt.com/test.html 和http://localhost:8091/test.json 能否通信?
答案: 不能通信 1)域名不一致 2)端口不同
3.3.3 什么是跨域
定义: 当浏览器解析ajax时,ajax发起请求的地址如果与当前页面所在的地址违反同源策略时,则称之为跨域(请求)
3.4 JSONP(难)
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的
3.4.1 JSONP跨域实现原理
1).利用javascript中的src属性实现跨域
<script type="text/javascript" src="http://manage.jt.com/test.json"></script>
2).自定义回调函数 function callback(){}
function hello(data){
alert(data.name);
}
3).将返回值结果 进行特殊的格式封装 callback(JSON数据)
hello({"id":"1","name":"tomcat猫"})
3.4.2 jQuery实现JSONP跨域访问
3.4.2.1 编辑html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSONP测试</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
alert("测试访问开始!!!!!")
//网页位置: www.jt.com/JSONP.html
$.ajax({
url:"http://manage.jt.com/web/testJSONP",
type:"get", //jsonp只能支持get请求 不支持post,因为src支持get
dataType:"jsonp", //dataType表示返回值类型 如果是跨域访问,则必须添加jsonp
//jsonp: "callback", //指定参数名称
//jsonpCallback: "hello", //指定回调函数名称
success:function (data){ //data经过jQuery封装返回就是json串
alert(data.id);
alert(data.name);
//转化为字符串使用
//var obj = eval("("+data+")");
//alert(obj.name);
}
});
})
</script>
</head>
<body>
<h1>JSON跨域请求测试</h1>
</body>
</html>
3.4.2.2 页面url分析
3.4.2.3 编辑JSONPController
说明: 在jt-manage中添加JSONPController.实现跨域访问
@RestController
public class JSONPController {
/**
* url:http://manage.jt.com/web/testJSONP?callback=jQuery111107990405330439474_1595323762313&_=1595323762314
* @return JSONPObject 专门负责封装JSONP的返回值结果的.
* 注意事项: 返回值结果必须通过特殊的格式封装 callback(JSON数据)
*/
@RequestMapping("/web/testJSONP")
public JSONPObject jsonp(String callback) {
//准备返回数据
User user = new User();
user.setId(100L).setPassword("我是密码");
return new JSONPObject(callback, user);
}
}