Skip to content

Commit c7cd82f

Browse files
committed
add 为http添加请求头通过后台
1 parent 5eb0f66 commit c7cd82f

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

docs/HomePage.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,10 @@
298298

299299
- [使用序列化保存对象信息的时候出现中文乱码问题.md](./兴趣爱好/使用序列化保存对象信息的时候出现中文乱码问题.md)
300300
- [微信聊天机器人.md](docs/兴趣爱好/微信聊天机器人.md)
301-
- [2019-07-10-hexo在GitHub上搭建个人博客.md](docs/兴趣爱好/2019-07-10-hexo在GitHub上搭建个人博客.md)
301+
- [2019-07-10-hexo在GitHub上搭建个人博客.md](./兴趣爱好/2019-07-10-hexo在GitHub上搭建个人博客.md)
302+
303+
# 经验总结:sunny:
304+
- [java在过滤器中为http请求加请求头header.md](./经验总结/java在过滤器中为http请求加请求头header.md)
302305

303306
# Java面试相关:musical_note:
304307

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# 前言
2+
现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的
3+
这个时候如何将请求头通过后台的方法加进来?
4+
想到用过滤器,用后台方法强制加入请求头。
5+
6+
# HTTP请求头
7+
关于http请求头的相关信息可以参考这票博客,这里就不画蛇添足了
8+
https://blog.csdn.net/alexshi5/article/details/80379086
9+
下面直接上如何通过filter为请求添加请求头参数:
10+
11+
# 新建请求控制类
12+
```java
13+
package com.bitplan.smartCRM.web;
14+
15+
import java.io.IOException;
16+
import java.util.Collections;
17+
import java.util.Enumeration;
18+
import java.util.HashMap;
19+
import java.util.List;
20+
import java.util.Map;
21+
22+
import javax.servlet.Filter;
23+
import javax.servlet.FilterChain;
24+
import javax.servlet.FilterConfig;
25+
import javax.servlet.ServletException;
26+
import javax.servlet.ServletRequest;
27+
import javax.servlet.ServletResponse;
28+
import javax.servlet.http.HttpServletRequest;
29+
import javax.servlet.http.HttpServletRequestWrapper;
30+
31+
public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
32+
/**
33+
* construct a wrapper for this request
34+
*
35+
* @param request
36+
*/
37+
public HeaderMapRequestWrapper(HttpServletRequest request) {
38+
super(request);
39+
}
40+
41+
private Map<String, String> headerMap = new HashMap<String, String>();
42+
43+
/**
44+
* add a header with given name and value
45+
*
46+
* @param name
47+
* @param value
48+
*/
49+
public void addHeader(String name, String value) {
50+
headerMap.put(name, value);
51+
}
52+
53+
@Override
54+
public String getHeader(String name) {
55+
String headerValue = super.getHeader(name);
56+
if (headerMap.containsKey(name)) {
57+
headerValue = headerMap.get(name);
58+
}
59+
return headerValue;
60+
}
61+
62+
/**
63+
* get the Header names
64+
*/
65+
@Override
66+
public Enumeration<String> getHeaderNames() {
67+
List<String> names = Collections.list(super.getHeaderNames());
68+
for (String name : headerMap.keySet()) {
69+
names.add(name);
70+
}
71+
return Collections.enumeration(names);
72+
}
73+
74+
@Override
75+
public Enumeration<String> getHeaders(String name) {
76+
List<String> values = Collections.list(super.getHeaders(name));
77+
if (headerMap.containsKey(name)) {
78+
values.add(headerMap.get(name));
79+
}
80+
return Collections.enumeration(values);
81+
}
82+
83+
}
84+
```
85+
# 新建过滤器
86+
注意:需要将请求头里面没有token的接口后面带上token参数,参数名是“”token“”
87+
```java
88+
public class RemoteAddrFilter implements Filter {
89+
90+
@Override
91+
public void destroy() {
92+
93+
}
94+
95+
@Override
96+
public void doFilter(ServletRequest request, ServletResponse response,
97+
FilterChain chain) throws IOException, ServletException {
98+
HttpServletRequest req = (HttpServletRequest) request;
99+
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req);
100+
//获得请求参数中的token值
101+
String token = request.getParamter("token");
102+
if!StringUtils.isEntry(token)){
103+
//如果请求中带有这个参数,则进行过滤加一个header头
104+
requestWrapper.addHeader("tokenr", token);
105+
chain.doFilter(requestWrapper, response); // Goes to default servlet.
106+
}
107+
chain.doFilter(request, response); // Goes to default servlet.
108+
109+
}
110+
111+
@Override
112+
public void init(FilterConfig filterConfig) throws ServletException {
113+
114+
}
115+
```
116+
这个时候请求头中是会带有这个token,但是你可能用右键F12看不到这个头,相当于是一层伪代理,我们的接口是已经加上token校验。
117+
118+
# 总结
119+
查找了很多资料,百度找到的和其他博客上说的感觉都是大同小异,并没有达到想要的效果。我觉得写博客就得一针见血,什么问题必须标书清楚,不要为了写而写,你可能不知道当人看了半天你的博客但是却没有得到问题的解决是一件多么痛苦的过程。最后是在https://stackoverflow.com上面找到的答案,当百度找不到答案时尝试谷歌,谷歌找不到时尝试下stackoverflow。
120+
查找问题的搜索词也很重要,这些都需要有相关的经验才可以快速的定位问题,快速的找到解决办法,这才是一个资深程序眼必须会的一项技能。

0 commit comments

Comments
 (0)