京淘项目学习12

1. 关于Redis缓存

1.1 什么是缓存穿透

说明:在高并发情况下,用户大量访问缓存不存在的数据,称之为缓存穿透
如何解决:
-通过IP限流(即单位时间内IP请求次数)
-布隆过滤器

1.1.1 布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

1.1.2 布隆过滤器算法

在这里插入图片描述

1.1.3 算法优化

.说明:由于hahs碰撞带来的问题.所以需要对算法进行优化 降低hash碰撞的概率.
解决方案:

  1. 增加二进制向量的位数. 8/16/32/1024…
  2. 增加hash函数的个数.

总结: 适当的增加二进制向量的位数和hash函数个数,可以有效的降低hash碰撞的概率
在这里插入图片描述

1.2 什么是缓存击穿

说明:由于某个热点数据在缓存中失效,导致大量的用户直接访问数据库,导致数据库宕机
如何处理:采用多级缓存

1.3 什么是缓存雪崩

说明:由于大量的数据在缓存中失效,导致用户访问缓存的命中率低,则大量用户直接访问数据库。
如何处理:
1. 采用多级缓存
2. 设定超时时间不相同

2.京淘前台搭建

2.1 前台搭建说明

说明:根据规则实现前后端分离(业务分离)的操作,前端服务器只负责数据的页面展现,后端服务器负责数据的提取,前后端数据传输时一般采用Json方式返回。

2.2 搭建京淘前台(JT-WEB)

2.2.1 创建项目

在这里插入图片描述

2.2.2 导入pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>jt-web</artifactId>


    <parent>
    <artifactId>jt</artifactId>
    <groupId>com.jt</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>

    <!--动态web资源暂时打包为war-->
    <packaging>war</packaging>

    <!--添加依赖-->
    <dependencies>
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <!--跳过测试类打包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2.3 导入静态资源src包

在这里插入图片描述

2.2.4 启动类报错提示

在这里插入图片描述

package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/**
 *	由于继承了jt项目pom.xml的依赖包,基于开箱即用规则,默认记载依赖
 *	exclude=DataSourceAutoConfiguration.class	排除数据源启动
 */
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)//排除数据源启动
public class SpringBootRun {
	
	public static void main(String[] args) {
		
		SpringApplication.run(SpringBootRun.class,args);
	}
}

2.2.5 解决404报错问题

在这里插入图片描述

2.3 实现域名反向代理

2.3.1 遍历nginx配置文件

# 配置前台服务器
	server{
		listen 80;
		server_name  www.jt.com;
		location / {
			proxy_pass http://localhost:8092;
			#proxy_pass http://jtWindows;
			
		}
	}

2.3.2 编辑host文件

在这里插入图片描述

2.3.4 启动nginx反向代理服务器

在这里插入图片描述

2.4 关于https转化问题

说明:由于浏览器处于安全性的考虑,将http协议规范动态转化为https协议规范,由于没有购买域名,所以无法使用。
如何解决:
输入网址:chrome://net-internals/#hsts:
按照下图操作即可
在这里插入图片描述

2.5 关于伪静态

2.5.1 伪静态简介

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结:
1. 搜索引擎只对静态页面友好,增加搜索曝光率(搜索引擎工作原理)
2. 静态页面损失动态页面效果
3. 伪静态是将动态页面实现以.html结尾的动态页面技术(欺骗浏览器)

2.5.2 搜索引擎工作原理

倒排索引:用关键字检索文章位置
在这里插入图片描述

2.5.3 实际应用场景

在这里插入图片描述
springMVC中默认拦截的都是前缀型请求:http://www.jt.com/index 视图解析器
springMVC中如果遇到后缀型请求不拦截:http://www.jt.com/index.html 找具体页面

2.5.4 实现伪静态

说明:使用springMVC拦截后缀型请求
实现过程:
1. controller跳转
2. 编辑配置类,开启后缀类型匹配

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. 跨域业务说明

3.1 通用页面跳转

http://www.jt.com/user/login.html
http://www.jt.com/user/register.html
利用一个Controller的方法实现页面的统一跳转

package com.jt.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import sun.security.pkcs11.Secmod;

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 实现页面通用跳转
     */
    @RequestMapping("/{model}")
    public String model(@PathVariable String model){
        return model;
    }

}

3.2 跨域测试

在这里插入图片描述

3.2.1 同域测试

域名地址:http://manage.jt.com/test.html
Ajax地址:http://manage.jt.com/test.json
测试发现:协议|域名|端口号相同时,可以相互通信
在这里插入图片描述

3.2.2 跨域测试

域名地址: http://www.jt.com/test.html
Ajax地址: http://manage.jt.com/test.json
测试发现: 如果域名不相同时,无法实现远程的访问

3.2.3同源策略说明

说明: 浏览器出于安全性的考虑要求发起Ajax时,必须满足同源策略的规定.
要求: 1.协议名称相同 http/https
2.域名相同
3.端口号相同
如果上述的3条违反任意的一条即违反了同源策略.称之为跨域访问. 反之为同域访问
在这里插入图片描述

3.3 JSONP

3.3.1 JSONP介绍

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

3.3.2 JSONP跨域原理说明

步骤:
1. 利用javaScript中的src属性,实现跨域
2. 自定义回调函数

3.	将返回值结果进行特殊的格式封装:callback(json)

在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>	
	<script type="text/javascript">
		/*JS是解释执行的语言  */
		/*定义回调函数  */
		function hello(data){
			alert(data.name);
		}
	</script>
	<!--该json一直保存到浏览器中等待调用,但是没有函数名称无法调用  -->
	<script type="text/javascript" src="http://manage.jt.com/test.json"></script>
	<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
</head>
<body>
	<h1>JS跨域问题</h1>
	
</script>
</body>
</html>

3.3.3 JSONP的API学习

  1. 编辑页面,发起跨域请求
    在这里插入图片描述
  2. 编辑JSONPController
    在这里插入图片描述
  3. 使用JSONP高级API
    在这里插入图片描述

3.4 CORS

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

3.4.1 CORS工作原理

说明:在服务器中添加响应头信息.告知客户端 程序可以正常执行
在这里插入图片描述

3.4.2 CORS使用说明

  1. 客户端支持CORS
    在这里插入图片描述
  2. 配置服务器端
    在这里插入图片描述

4. 单点登录系统

4.1 创建项目

4.1.1 创建项目

在这里插入图片描述

4.1.2 添加继承/依赖/插件

 <parent>
        <artifactId>jt</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>jt-sso</artifactId>

    <!--添加依赖 jt-common-->
    <dependencies>
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--添加插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

4.1.4 编辑User POJO

package com.jt.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;

@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{
    @TableId(type = IdType.AUTO)//设定主键自增
    private long id;//id用户信息
    private String username;//用户名
    private String password;//密码
    private String phone;//电话号码
    private String email;//邮箱,暂时用电话号码代替
}

4.1.5 编辑UserMapper接口

package com.jt.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.User;

public interface UserMapper extends BaseMapper<User> {
	
}

4.2 SSO案例

需求:通过http://sso.jt.com/findUserAll 获取全部的user的JSON数据.

4.2.1 编辑Controller

package com.jt.controller;

import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.jt.service.UserService;

import java.util.List;

@RestController
public class UserController {
	
	@Autowired
	private UserService userService;
	@RequestMapping("/findUserAll")
	public List<User> findAll(){
		return userService.findAll();
	}
	
	
	
}	

4.2.2 编辑Service以及ServiceImpl

package com.jt.service;

import com.jt.pojo.User;

import java.util.List;

public interface UserService {

    List<User> findAll();
}
package com.jt.service;


import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jt.mapper.UserMapper;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
	
	@Autowired
	private UserMapper userMapper;


	@Override
	public List<User> findAll() {

		return userMapper.selectList(null);
	}
}

4.2.3 nginx的配置文件配置

#配置单点登录服务器
	server {
		listen 80;
		server_name sso.jt.com;
		location / {
			proxy_pass http://localhost:8093;
		}
	}

4.2.4 页面测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Solider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值