Ⅰ 开发者如何扣用户的token
在浏览器上打开网页,按F12,在出现的控制面板里面查找碧和可以找到token的信息,一般会在network栏中,接口的header里面。
时常也有开发者把token 放在客户端三个位置:1、存空敏储在localStorage中;2、存储在cookie中;3、存储在localStorage中。
token 其实就是访问资源对凭证。一般是用户通过用户名和密码悔亏盯登录成功之后,服务器将登录凭证做数字签名,加密之后得到的字符串作为token。
Ⅱ 单点登陆TOKEN的处理
API接口的安全性主要是为了保证数据不会被篡改和重复调用,实现方案主要围绕Token、时间戳和Sign三个机制展开设计。
1. Token授权机制
用户使用用户名密码登录后服务器给客户端返回一个Token(必须要保证唯一,可以结合UUID和本地设备标示),并将Token-UserId以键滑瞎伏值对的形式存放在缓存服务器中(我们是使用Redis),并要设置失效时间。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端信携的凭证。
2. 时间戳超时机制
用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如30秒),则认为该请求失效。时间戳超时机制是防御重复调用和爬取数据的有效手段。
当然这里需要注意的地方是保证客户端和服务端的“当前时间”是一致的,我们采取的对齐方式是客户端第一次连接服务端时请求一个接口获取服务端的当前时间A1,再和客户端的当前时间B1做一个差异化计算(A1-B1=AB),得出差异值AB,客户端再后面的请求中都是传B1+AB给到服务端。
3. API签名机制
将“请求的API参数”+“时间戳”+“盐”进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说神嫌明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。
4. 注意事项
5. 安全保障总结
在以上机制下,
如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;
如果有人使用已经劫持的URL进行DOS攻击和爬取数据,那么他也只能最多使用30s;
如果签名算法都泄露了怎么办?可能性很小,因为这里的“盐”值只有我们自己知道。
Ⅲ 为什么对外接口不能用token
具纳卜轮有时间限制。token接口具有时间限制,因此不能进行对外接口的使用。为了安全考虑要访问的服务的接口需要token验证才洞信能访弊轮问,因此需要携带token才能访问。
Ⅳ 怎么处理微信"token验证失败”
一.
1. 首先要了解的是什么是URL和Token,
在这里,URL就是放置了接口程序的网址,这个网址一般得是你自己的服务器或空间地址。你自己在这个空间上某个目录已经有接口程序了,你知道这个接口程序在互联网上的访问地址是什么。而Token就闭渗是一个令牌,该令牌是个数字或字母形式的字符串,用于微信服务器与你的服务器进行通讯的时候的身份验证。防止非法数据来搞乱。
2. 然后要了解的是开发模式为什么要使用Url和Token,
使用url是为了让微信服务器和你的服务器进行通讯对话,从而达到开发模式下自动回复的目的。而实现这个通讯,必须有相应的程序为你完成这个功能,而这个程序必须已经开发完成并且放置于url路径下面,当你中配填写完url和token的时候,微信服务器就会和你的服务器下的程序进行一次认证过程,认证通过表明这个服务器是你的并且程序没有问题。不然你填个不存在的url或者url下面个没有相应的接口功能,那是通不过的。
3.那么如何处理如下问题”token验证失败”
valid(); class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be e to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = " %s 0 "; if(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."轿培脊; } }else { echo ""; exit; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
2.在微擎中修改token值也是为roselife
3.登陆微信公众平台中:开发——基本配置——修改配置中
a.服务器配置地址(URL):域名后后面跟wx_sample.php
b.token填写的也是roselife
Ⅳ HTTP接口POST请求如何通过或关闭CSRF的TOKEN验证
真有那么容易通过验证的话,加那个验证干啥呢?天真
Ⅵ 你的服务器没有正确响应Token验证
检查你的服务器上的的接口文件是否能够访问,token是否配置正确
Ⅶ getway不校验白名单怎么设置
lovenuo1314
码龄11年
关注
1、若依后端gateway模块配置白圆纤名单
顾名思义,就是允许访问的地址。且无需登录就能访问。在ignore中设置whites,表示允橘茄仿许匿名访问。
1.1、在nacos中gateway配置文件中配纳昌置
1.2、代码
package com.ruoyi.gateway.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.HttpStatus;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
import io.jsonwebtoken.Claims;
import reactor.core.publisher.Mono;
/**
* 网关鉴权
*
* @author ruoyi
*/
@Component
public class AuthFilter implements GlobalFilter, Ordered
{
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
// 排除过滤的 uri 地址,nacos自行添加
@Autowired
private IgnoreWhiteProperties ignoreWhite;
@Autowired
private RedisService redisService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest.Builder mutate = request.mutate();
String url = request.getURI().getPath();
// 跳过不需要验证的路径
if (StringUtils.matches(url, ignoreWhite.getWhites()))
{
return chain.filter(exchange);
}
String token = getToken(request);
if (StringUtils.isEmpty(token))
{
return unauthorizedResponse(exchange, "令牌不能为空");
}
Claims claims = JwtUtils.parseToken(token);
if (claims == null)
{
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
}
String userkey = JwtUtils.getUserKey(claims);
boolean islogin = redisService.hasKey(getTokenKey(userkey));
if (!islogin)
{
return unauthorizedResponse(exchange, "登录状态已过期");
}
String userid = JwtUtils.getUserId(claims);
String username = JwtUtils.getUserName(claims);
if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
{
return unauthorizedResponse(exchange, "令牌验证失败");
}
// 设置用户信息到请求
addHeader(mutate, SecurityConstants.USER_KEY, userkey);
addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
// 内部请求来源参数清除
removeHeader(mutate, SecurityConstants.FROM_SOURCE);
return chain.filter(exchange.mutate().request(mutate.build()).build());
}
private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value)
{
if (value == null)
{
return;
}
String valueStr = value.toString();
String valueEncode = ServletUtils.urlEncode(valueStr);
mutate.header(name, valueEncode);
}
private void removeHeader(ServerHttpRequest.Builder mutate, String name)
{
mutate.headers(httpHeaders -> httpHeaders.remove(name)).build();
}
private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg)
{
log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
}
/**
* 获取缓存key
*/
private String getTokenKey(String token)
{
return CacheConstants.LOGIN_TOKEN_KEY + token;
}
/**
* 获取请求token
*/
private String getToken(ServerHttpRequest request)
{
String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
// 如果前端设置了令牌前缀,则裁剪掉前缀
if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
{
token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
}
return token;
}
@Override
public int getOrder()
{
return -200;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.ruoyi.gateway.config.properties;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
* 放行白名单配置
*
* @author ruoyi
*/
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreWhiteProperties
{
/**
* 放行白名单配置,网关不校验此处的白名单
*/
private List<String> whites = new ArrayList<>();
public List<String> getWhites()
{
return whites;
}
public void setWhites(List<String> whites)
{
this.whites = whites;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
启动代码并测试
已经走到了sytem模块中,并且没有进行登录;说明我们的配置已经生效
文章知识点与官方知识档案匹配
Java技能树首页概览
84637 人正在系统学习中
打开CSDN,阅读体验更佳
Amazon API Gateway使用IP白名单控制后端服务访问_亚林瓜子的博客-CSD...
异地IP验证 使用移动IP调用,请求被拒绝了。 白名单IP验证 同样的请求,在白名单中的IP就可以正常请求。 总结 这里使用的AWS中国北京地区的API Gateway服务,通过策略控制对后台服务的访问控制。
SpringCloud Gateway网关配置(二)接口访问IP白名单配置(真实IP)
SpringCloud Gateway网关配置中,需要对访问的IP设置白名单,SpringCloud Gateway官方给出YML配置文件配置。 如下: 5.10. The RemoteAddr Route Predicate Factory The RemoteAddr route predicate factory takes a list (min size 1) of so...
Spring Cloud Gateway 网关实现白名单功能
对于微服务后台而言,网关层作为所有网络请求的入口。一般基于安全考虑,会在网关层做权限认证,但是对于一些例如登录、注册等接口以及一些资源数据,这些是不需要有认证信息,因此需要在网关层设计一个白名单的功能。本文将基于 Spring Cloud Gateway 2.X 实现白名单功能。注意事项: Gateway 网关层的白名单实现原理是在过滤器内判断请求地址是否符合白名单,如果通过则跳过当前过滤器。如果有多个过滤器,则需要在每一个过滤器里边添加白名单判断。......
继续访问
若依vue分离版(ruoyi-vue)跳过token验证,设置白名单
找到SecurityConfig类的configure方法 如图所示 在设置白名单后还需要把接口上的权限标识符去掉。然后需要重启一下项目,热加载不行,会报错。
继续访问
Kong Gateway - 13 基于网关服务的IP白名单限制访问(Whitelist IP Restri...
为名称为book的服务的路由{route_id启用IP白名单限制访问其中192.168.10.50表示限制macOS系统这一台计算机不能访问book服务的路由其中192.168.43.0/24表示限制IP地址是192.168.43这一整个网段的IP都不能访问book服务的路由(Windows 10在此...
服务网关:Gateway_青铜造白的博客
可以实现日志拦截、权限控制、解决跨域、限流、熔断、负载均衡,隐藏服务端的ip,黑名单与白名单拦截、授权等。 二:gateway的核心概念 1、Route(路由):就是转发规则 Spring Cloud Gateway的基础元素,可简单理解成一条转发的规则。包含:ID...
SpringCloud Gateway网关配置(二)接口访问IP白名单配置(真实IP)
SpringCloud Gateway网关配置中,需要对访问的IP设置白名单,SpringCloud Gateway官方给出YML配置文件配置。 如下: 5.10. The RemoteAddr Route Predicate Factory The RemoteAddr route predicate factory takes a list (min size 1) of sources, which are CIDR-notation (IPv4 or IPv6) strings, such as 1
继续访问
nacos权限认证(二) 开启权限认证
直接设置下述属性为true,就可以避免 nacos权限认证(一) 中的问题。 这个时候再访问nacos页面,则会直接报错。因此,还需要再设置两个属性(数值可以随便填)。添加好这两个属性时页面就能正常访问了。注意:如果你遇到这种情况,只需要关闭提示,点击用户名,登出,然后重新登录即可。这个时候,如果你加修改直接启动其他服务,则其他服务无法正常连接nacos,也需要坐一番配置。需要再其他服务的配置文件中加上如下配置。 这样,其他服务就能正常连接nacos了。至此,nacos的权限漏洞问题就解决了。
继续访问
若依RuoYi-Cloud代码学习三---ruoyi-gateway扩展gateway网关组件的知识
一、API 网关概述 作为微服务的门面,应用于服务数量众多、复杂度较高、规模比较大的系统。 优点: 客户端通过 API 网关与微服务交互时,客户端只需要知道 API 网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。 客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。 客户端与后端的服务耦合度降低。 节省流量,提高性能,提升用户体验。 API 网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。 常见API 网关实现方案 Spring Cloud G
继续访问
热门推荐 GateWay中添加白名单
最近开发中有一个鉴权的操作,最后需要进行添加白名单的,废话不多说,直接上代码吧, 这是我的项目结构 applicaton启动类: import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.spr...
继续访问
Spring Gateway+白名单+docker
域名解析 从物理机上调用外部服务正常,但是docker里的java服务去调用却有问题。 答案 docker并不能使用宿主机的host配置信息 为每一个http请求定制header 如果在RouteLocatorBuilder里设置header的话就会对所有http request生效,如果为了对每个request请求使用不同header需要如下设置 @Configuration public cl...
继续访问
GateWay网关应用案例(跨域、限流、黑白名单)
Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。属于异步非阻塞架构 Spring Cloud Gateway与Spring Data 和Spring Securit 技术不能同时使用 Spring Cloud Gateway基于Spring Boot和Spring Webflux提供的Netty运行。它在传统的Servlet容器中或用WAR的方式构建时不起作用 网关基本的功能 :鉴权、流量控制、熔断、路径重写
继续访问
ruoyi分离版前端白名单
ruoyi分离版前端白名单 先在router下的index.js中加上需要添加的路由 之后再permission.js下的whiteList中加上上面添加的路由就可以了 后端的接口 接口白名单 /**是匹配路径下的所有接口,也可以直接指定某一个具体的接口 ...
继续访问
若依后端gateway模块解决跨域问题
跨域问题
继续访问
微服务项目在gateway网关配置路径访问白名单
网关的鉴权:权限身份认证作用实际上就是由一串组合起来的过滤器实现的, 过滤器的自定义过程就是实现两个接口org.springframework.cloud.gateway.filter.GlobalFilter和org.springframework.core.Ordered 通过重写org.springframework.cloud.gateway.filter.GlobalFilter中的filter方法来定义过滤的逻辑 通过重写org.springframework.core.Ordered中的get
继续访问
若依微服务SpringCloud—使用Spring Cloud Gateway网关
一.API网关 API网关,就是指系统的统一入口,它封装来应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证,鉴权,监控,路由转发等等。 二.业界流行的网关 (1)Ngnix+lua :使用nginx的反向代理和负载均衡可实现api服务器的负载均衡及高可用。lua是一种脚步语言,可以来编写一些简单的nginx支持lua脚本。 (2)Kong:基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流,鉴权等等)可以开箱即用。缺点:只支持http协
继续访问
最新发布 若依前后端分离ruoyi-vue请求添加白名单403
【代码】若依前后端分离ruoyi-vue请求添加白名单403。
继续访问
Nacos配置与踩坑总结
核心问题: 1.不同域名,走不同配置 2.开关、配置、JSON三种配置类型 解决方案 设计思路: 1.分三大类: 业务配置、域名配置、域名自定义配置 业务配置:用于配置所有业务中的配置信息 针对业务情况,分为三类业务配置:开关配置、基础配置、数据配置(黑/白名单) 每种配置都为单独的nacos 针对大促情况:将三类配置各自再两个环境配置,共三个环境配置,方便在不同配置环境中自由切换 域名配置:用于配置域名走哪个配置环境,实现出现问题快速将某域名切换到不同环境 域
继续访问
微服务网关springcloud gateway自定义全局过滤器
微服务网关springcloud gateway自定义全局过滤器
继续访问
ruoyi-spring boot 升级为nacos配置
springboot集成nacos
继续访问
若依Cloud之旅(二):一次登录到出现界面,若依做了什么?
若依一次登录到出现界面的三个接口都做了什么
继续访问
实现登录验证
最近练习搭建了一个后台管理系统,首先第一步做了关于验证登录的功能.以下项目使用了Nacos作为服务发现和注册中心,将Auth和gateway,system等相关多个微服务注册进Nacos.每次刷新登录页面,就会获取新的验证码(,输入正确的验证码即可成功跳转至首页. 获取验证码url:http://localhost/dev-api/code - dev-api是前端设置的反向代理,实际访问的是网关路径和端口.即在网关gateway模块做了路由转发.返回给前端 /** * 路由转发...
继续访问
若依前后端分离-免登录
项目需要对若依进行不输入账号密码的登录,所以临时进行修改,增加获取不到token时,判断是否携带了某个特殊参数,有就用默认的账号密码调用登录达到验证登录的需求。 http://localhost/#/?index=1 // 没有token if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() } else if (to.query.index === '1') { let..
继续访问
gateway白名单
gateway
Ⅷ 登录时对于token的处理
在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下:
1、用户输入账号密码,前端调后端的登陆接口,发送用户名和密码,
2、后端收到请求,验证用户名和密码,验证通过后(即登录成功),后端返回token给前端;
3、前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面;
4、前端每次跳转路由,都要判断 localStroage 中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面( 通过router.beforeEach((to, from, next)=>{.....}))
5、每次调后端接口,都要在请求头中加上token;
6、后端判断请求头中有无token,有token,就拿到token并验证token,验证成功就返回数据,验证失败(例如:token过期)就返回编码401(编码由前台和后台约定好),请求头中没有token也返回编码401;
7、如果前端拿到状态码为401,则清除token信息并跳转到登录页面,并弹框提示用户当前缺少token或者token已失效,请重新登录;
一、调登录接口成功,在回调函数中将token存储到localStorage和vuex中
login.vue
store文件夹下的index.js
二、路由导航守卫
main.js
三、请求头加token,如果前端拿到状态码为401,就清除token信息并跳转到登录页面
Ⅸ jmeter接口测试,处理cookie和token的方法
cookie 是一个文件,存放在本地,chrome浏览器F12后的Application下可查看cookies。由服务器生成,故Response Headers中会存在Set-Cookie字段。
session 是为了保持服务器与客户端的会话状态,在用户登录后,服务器端生成一个sessionID传给客户端;之后的每次会话,客户端只需要传这个sessionID即可不用重新登录,保持在线状态。故服务器端需要保存所有在线的sessionID,从而影响服务器性能! sessionID是存在cookie中的。
token 是为了解决服务器压力,用户登录成功后,服务器端生产token(钥匙和锁)通过 cookie或请求头的方式 传给客户端,再次请求时带上token即可,无状态(服务端通过算法验证钥匙和锁是否正确)。
总之 ,就是两种鉴权方式,通过sessionID或者token,服务器来判断是否是某用户登录后的其他请求。
其他:
2、一个用户在一次会话(打开浏览器,访问服务器,直到浏览器关闭,称为一次会话,严格的说,一次会话应该是依赖 session 的生成机制)上就是一个session_id。裤世
3、每次登录时,总会产生一个token或者sessionID,生成这个的目的是为了每次操作其他接口的时候,会判断当前用户是否登录。
1)cookie的处理
准备:两个接口:一个登录、一个充值
登录接口
充值接口:会失橘喊败
1、添加:HTTPCookie管理器,放到最上面。
2、再次运圆纯野行:就会充值成功。
登录时会有set_Cookie存在
1、添加后置处理器>>>正则表达式提取器
设置:
2、添加:调试取样器
运行结果:已经拿到cookie
3、添加:右击线程组>>添加>>配置元件>>HTTPCookie管理器
设置:
4、添加:JSESSIONID:${正则表达式提取器提取到的变量名}
域:
路径:
5、查看运行结果:
2)token的处理
查询用户信息需要先登录,在查询用户信息的时候需要携带token。
1、在登录接口下面使用正则表达式提取器获取token
登录接口响应数据中返回token。
配置提取器:
2、添加:调试取样器,运行后查看是否可以获取到
3、添加HTTP信息头管理器
运用相关资料