HttpServletRequest如何添加请求头

AlenCheng 2017-07-31 03:52:49
javax.servlet.http.HttpServletRequest怎么添加请求头的...
困扰了很久..
求助各位..
谢谢!!
...全文
13901 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpkaiq 2019-03-29
  • 打赏
  • 举报
回复
https://blog.csdn.net/u010698072/article/details/79973830
藕咂 2018-12-05
  • 打赏
  • 举报
回复
你在服务端不是应该是在response里带数据回去吗,服务端还能发request到前端吗
加加爱 2018-12-04
  • 打赏
  • 举报
回复
大侠,你最后怎么处理的,怎么给request增加的头部信息,我以前用的方式跟你的一样,现在换成springboot就不起作用了,项目中还没用到zuul,但是现在把原来的代码拿过来,设置的头部信息,怎么都获取不到,其实就没放进去。请问你怎么处理的?
「已注销」 2017-08-01
  • 打赏
  • 举报
回复
引用 15 楼 ck199007081001 的回复:
感谢解答。
网上看到的就是你这段,我改了。不过我不是特别熟悉你说的场景,我也只是路过看看。
AlenCheng 2017-08-01
  • 打赏
  • 举报
回复
引用 10 楼 tianfang 的回复:
HttpServletRequest 是接口,没有设置header的方法。 需要找到HttpServletRequest实现类,然后使用它提供的方法设置header。这个类是由服务容器(如 tomcat)提供的
感谢解答。
AlenCheng 2017-08-01
  • 打赏
  • 举报
回复
引用 12 楼 SXJIAKE 的回复:
虽然我也不知道,不过我可以搜索到。参考网上的资料,修改了这么一段代码:
public class WritableHttpServletRequest extends HttpServletRequestWrapper {
	private final Set<String> names = new HashSet<>();
	private final Map<String, String> headers = new HashMap<>();
	WritableHttpServletRequest(HttpServletRequest request) {
		super(request);
		Enumeration<String> e = super.getHeaderNames();
		while (e.hasMoreElements()) {
			names.add(e.nextElement());
		}
	}
	public void addHeader(String name, String value) {
		headers.put(name, value);
		names.add(name);
	}
	@Override
	public String getHeader(String name) {
        if (headers.containsKey(name)) {
        	return headers.get(name);
        } else {
        	return super.getHeader(name);
        }
	}
	@Override
	public Enumeration<String> getHeaderNames() {
        return Collections.enumeration(names);
	}
}

// ......
WritableHttpServletRequest wr = new WritableHttpServletRequest(request);
wr.addHeader("Referer", "http://bbs.csdn.net");
doFilterInternal(wr, ...);
// ......
PrintWriter out = response.getWriter();
out.print(result);
感谢解答,这种写法应该可以,但是目前因为我使用了zuul,感觉可能是zuul导致转发到下游之后,header丢失了,准备看下zuul源码的转发过程了。 以下是我目前的写法。

public class HttpServletRequestCrossFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        ModifyHttpServletRequestWrapper httpServletRequestWrapper = new ModifyHttpServletRequestWrapper(request);
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Origin", "*");
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Headers", "Content-Type");
        httpServletRequestWrapper.putHeader("xxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxx");
        filterChain.doFilter(httpServletRequestWrapper, response);
    }

}

public class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String> customHeaders;

    public ModifyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.customHeaders = new HashMap<>();
    }

    public void putHeader(String name, String value) {
        this.customHeaders.put(name, value);
    }

    public String getHeader(String name) {
        String value = this.customHeaders.get(name);
        if (value != null) {
            return value;
        }
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    public Enumeration<String> getHeaderNames() {
        Set<String> set = new HashSet<>(customHeaders.keySet());
        Enumeration<String> enumeration = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement();
            set.add(name);
        }
        return Collections.enumeration(set);
    }

}
AlenCheng 2017-08-01
  • 打赏
  • 举报
回复
引用 11 楼 tianfang 的回复:
tomcat下的filter实现 https://tianweili.github.io/2015/01/26/Java中的Filter-过滤器/ http://sandeepmore.com/blog/2010/06/12/modifying-http-headers-using-java/


package com.sandeepmore.filters;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

import java.util.logging.*;

public class MyFilterExample implements javax.servlet.Filter {
private ServletContext servletContext;
private Logger log;

public MyFilterExample(){
super();
}

public void init(FilterConfig filterConfig) throws ServletException {
servletContext = filterConfig.getServletContext();
log = Logger.getLogger(MyFilter.class.getName());
}

public void doFilter( ServletRequest req,
ServletResponse res,
FilterChain filterChain)
throws IOException, ServletException {

MyServletRequestWrapper httpReq = new MyServletRequestWrapper((HttpServletRequest)req);
HttpServletResponse httpRes = (HttpServletResponse)res;

HttpSession session = httpReq.getSession();

httpReq.addHeader("myHeader", "value");

filterChain.doFilter(httpReq, httpRes);

}

public void destroy(){
}
}
感谢解答,这种写法应该可以,但是目前因为我使用了zuul,感觉可能是zuul导致转发到下游之后,header丢失了。 以下是我目前的写法。

public class HttpServletRequestCrossFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        ModifyHttpServletRequestWrapper httpServletRequestWrapper = new ModifyHttpServletRequestWrapper(request);
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Origin", "*");
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        httpServletRequestWrapper.putHeader("Access-Control-Allow-Headers", "Content-Type");
        httpServletRequestWrapper.putHeader("xxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxx");
        filterChain.doFilter(httpServletRequestWrapper, response);
    }

}

public class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String> customHeaders;

    public ModifyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.customHeaders = new HashMap<>();
    }

    public void putHeader(String name, String value) {
        this.customHeaders.put(name, value);
    }

    public String getHeader(String name) {
        String value = this.customHeaders.get(name);
        if (value != null) {
            return value;
        }
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    public Enumeration<String> getHeaderNames() {
        Set<String> set = new HashSet<>(customHeaders.keySet());
        Enumeration<String> enumeration = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement();
            set.add(name);
        }
        return Collections.enumeration(set);
    }

}
hugh_z 2017-08-01
  • 打赏
  • 举报
回复
get请求用httpGet.addHeader(name, value); post用httpPost.addHeader(name, value); 正解.
「已注销」 2017-07-31
  • 打赏
  • 举报
回复
虽然我也不知道,不过我可以搜索到。参考网上的资料,修改了这么一段代码:
public class WritableHttpServletRequest extends HttpServletRequestWrapper {
	private final Set<String> names = new HashSet<>();
	private final Map<String, String> headers = new HashMap<>();
	WritableHttpServletRequest(HttpServletRequest request) {
		super(request);
		Enumeration<String> e = super.getHeaderNames();
		while (e.hasMoreElements()) {
			names.add(e.nextElement());
		}
	}
	public void addHeader(String name, String value) {
		headers.put(name, value);
		names.add(name);
	}
	@Override
	public String getHeader(String name) {
        if (headers.containsKey(name)) {
        	return headers.get(name);
        } else {
        	return super.getHeader(name);
        }
	}
	@Override
	public Enumeration<String> getHeaderNames() {
        return Collections.enumeration(names);
	}
}

// ......
WritableHttpServletRequest wr = new WritableHttpServletRequest(request);
wr.addHeader("Referer", "http://bbs.csdn.net");
doFilterInternal(wr, ...);
// ......
PrintWriter out = response.getWriter();
out.print(result);
tianfang 2017-07-31
  • 打赏
  • 举报
回复
tomcat下的filter实现 https://tianweili.github.io/2015/01/26/Java中的Filter-过滤器/ http://sandeepmore.com/blog/2010/06/12/modifying-http-headers-using-java/


package com.sandeepmore.filters;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

import java.util.logging.*;

public class MyFilterExample implements javax.servlet.Filter {
private ServletContext servletContext;
private Logger log;

public MyFilterExample(){
super();
}

public void init(FilterConfig filterConfig) throws ServletException {
servletContext = filterConfig.getServletContext();
log = Logger.getLogger(MyFilter.class.getName());
}

public void doFilter( ServletRequest req,
ServletResponse res,
FilterChain filterChain)
throws IOException, ServletException {

MyServletRequestWrapper httpReq = new MyServletRequestWrapper((HttpServletRequest)req);
HttpServletResponse httpRes = (HttpServletResponse)res;

HttpSession session = httpReq.getSession();

httpReq.addHeader("myHeader", "value");

filterChain.doFilter(httpReq, httpRes);

}

public void destroy(){
}
}
tianfang 2017-07-31
  • 打赏
  • 举报
回复
HttpServletRequest 是接口,没有设置header的方法。 需要找到HttpServletRequest实现类,然后使用它提供的方法设置header。这个类是由服务容器(如 tomcat)提供的
李德胜1995 2017-07-31
  • 打赏
  • 举报
回复
引用 8 楼 ck199007081001 的回复:
[quote=引用 7 楼 pany1209 的回复:] 可以在ajax请求里面加。。。。。
不是客户端,是服务端需要新增。 [/quote] 过滤器里面使用request添加请求头估计不行...写一个类继承HttpServletRequestWrapper重写getHeader方法试试。。。
AlenCheng 2017-07-31
  • 打赏
  • 举报
回复
引用 7 楼 pany1209 的回复:
可以在ajax请求里面加。。。。。

不是客户端,是服务端需要新增。
李德胜1995 2017-07-31
  • 打赏
  • 举报
回复
可以在ajax请求里面加。。。。。
AlenCheng 2017-07-31
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
客户端还是服务端? HttpServletRequest是请求的头信息,服务端不添加,只解析 客户端要根据你用的httpclient 工具包 API编写代码
是服务端,不能用httpclient,服务端是spring cloud zuul做反向代理,但是需要新增请求头。 没有其他办法可以添加么?
AlenCheng 2017-07-31
  • 打赏
  • 举报
回复
引用 2 楼 minemine0418 的回复:
你是想请求接口的时候设置请求头信息??
get请求用httpGet.addHeader(name, value);
post用httpPost.addHeader(name, value);

不是客户端,是服务端给HttpServletRequest新增请求头。
AlenCheng 2017-07-31
  • 打赏
  • 举报
回复
引用 3 楼 u011015550 的回复:
addHeader()方法可以实现吧

不是客户端,是在服务端,需要给HttpServletRequest新增请求头。
Neo_whl 2017-07-31
  • 打赏
  • 举报
回复
addHeader()方法可以实现吧
minemine0418 2017-07-31
  • 打赏
  • 举报
回复
你是想请求接口的时候设置请求头信息?? get请求用httpGet.addHeader(name, value); post用httpPost.addHeader(name, value);
tianfang 2017-07-31
  • 打赏
  • 举报
回复
客户端还是服务端? HttpServletRequest是请求的头信息,服务端不添加,只解析 客户端要根据你用的httpclient 工具包 API编写代码

81,123

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧