使用HttpServletRequestWrapper的请求中的自定义标头不会出现在客户端

时间:2013-02-04 15:16:37

标签: java http servlets header request

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

首先,我构建了一个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中读取请求,那么我没有那个标题

1 个答案:

答案 0 :(得分:3)

当然它没有出现在Firebug中。浏览器不是设置了标题。服务器端的代码是接收到浏览器请求后执行的操作。在服务器端对该请求所做的任何更改,以便欺骗浏览器发送它的堆栈中的剩余服务器端代码,将不会反映在浏览器所做的原始请求中。浏览器检索的所有内容都是HTTP响应。无法通过HTTP响应更改初始HTTP请求。

无论您考虑的是哪种功能要求,您认为这是正确的解决方案,最有可能以不同方式解决。