gpt4 book ai didi

java - 使用 HttpServletRequestWrapper 请求的自定义 header 不会出现在客户端

转载 作者:可可西里 更新时间:2023-11-01 16:30:44 24 4
gpt4 key购买 nike

我想在 Servlet 请求中添加自定义 header 。

首先,我构建了一个HttpServletRequestWrapper

public class HeaderRequest_DEBUG extends HttpServletRequestWrapper {

private static final String DEBUG_NAME="Authorization";
private static final String DEBUG_VALUE="foccalabindella";

public HeaderRequest_DEBUG(HttpServletRequest request) {
super(request);
}

@Override
public String getHeader(String name) {
if(name.equalsIgnoreCase(HeaderRequest_DEBUG.DEBUG_NAME)){
return HeaderRequest_DEBUG.DEBUG_VALUE;
}
return super.getHeader(name);
}


@Override
public Enumeration getHeaderNames() {
//create an enumeration of the request headers

//create a list
List list = new ArrayList();

//loop over request headers from wrapped request object
HttpServletRequest request = (HttpServletRequest)getRequest();
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()) {
//add the names of the request headers into the list
String n = (String)e.nextElement();
list.add(n);
}

list.add(HeaderRequest_DEBUG.DEBUG_NAME);

//create an enumeration from the list and return
Enumeration en = Collections.enumeration(list);
return en;
}

}

因此,我构建了一个 Fileter 来包装标准请求:

public class Filter_DEBUG implements Filter{


@Override public void init(FilterConfig config) throws ServletException {}
@Override public void destroy() {}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

//if the ServletRequest is an instance of HttpServletRequest
if(servletRequest instanceof HttpServletRequest) {
//cast the object
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
//create the FakeHeadersRequest object to wrap the HttpServletRequest
HeaderRequest_DEBUG request = new HeaderRequest_DEBUG(httpServletRequest);
//continue on in the filter chain with the FakeHeaderRequest and ServletResponse objects
filterChain.doFilter(request, servletResponse);
} else {
//otherwise, continue on in the chain with the ServletRequest and ServletResponse objects
filterChain.doFilter(servletRequest, servletResponse);
}
}
}

最后,我建立了一个测试页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Initial page</title>
</head>
<body>
header: <%=request.getHeader("Authorization")%>
</body>
</html>

因此,对于 Firefox/Firebug,我遇到了这种情况:在浏览器窗口中,我收到了这条消息:

header: foccalabindella

但是在 Firebug 中我没有看到那个标题:

GET /myServer/jsp/welcome.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=465C24CC9A113E270F72829E35155BBB
Connection: keep-alive

为了确认这一点,如果我添加一个提交按钮并在 servlet 中读取请求,我没有那个 header

最佳答案

当然它不会出现在 Firebug 中。设置该 header 的不是浏览器。 收到来自浏览器的请求后,服务器端是您自己的代码执行此操作的。在服务器端对该请求所做的任何更改都不会在浏览器发出的原始请求中反射(reflect)出来,以欺骗浏览器发送的堆栈中剩余的服务器端代码。浏览器检索回的所有内容都是 HTTP 响应。无法从 HTTP 响应更改初始 HTTP 请求。

无论您想到什么功能需求,您认为这是正确的解决方案,最有可能需要以不同的方式解决。

关于java - 使用 HttpServletRequestWrapper 请求的自定义 header 不会出现在客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14689712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com