Servlet中请求未插入自定义标头

4

有一个第三方应用程序需要通过自定义HTTP头获取信息,因此我编写了一个简单的测试应用程序,创建这些标头,然后重定向到列出所有标头的页面。

生成标头的servlet片段如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    response.setHeader("cust-header", "cust-val");
    response.sendRedirect("header.jsp");
}

另一方面,header.jsp 中相关代码如下:
<%
    Enumeration enumeration = request.getHeaderNames();
    while (enumeration.hasMoreElements()) {
    String string = (String)enumeration.nextElement();
    out.println("<font size = 6>" +string +": " + request.getHeader(string)+ "</font><br>");
    }
    %>

这将显示以下标头:

Host: localhost:9082
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:9082/HdrTest/login.jsp
Cookie: JSESSIONID=0000tubMmZOXDyuM4X9RmaYYTg4:-1

仿佛自定义标头从未插入。我该如何修复它?谢谢。
1个回答

8

使用转发,你基本上是指示客户端(Web浏览器)发出全新的HTTP请求。 全新的请求也意味着全新的响应。 将其替换为转发

request.getRequestDispatcher("header.jsp").forward(request, response);

如果您确实希望将其放在重定向的请求中,则需要创建一个过滤器,该过滤器映射到/header.jsp并相应地修改标头。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    ((HttpServletResponse) response).setHeader("foo", "bar");
    chain.doFilter(request, response);
}

请注意,您正在在 header.jsp 中显示请求头而不是响应头。由于没有直接的API可用于显示响应头,您需要使用外部HTTP头嗅探工具(如FirebugNet 面板)或Fiddler)来调查它们。

感谢您的回复;我已将代码更改为:response.setContentType("text/html;charset=UTF-8"); response.setHeader("cust-header", "cust-val"); request.getRequestDispatcher("header.jsp").forward(request, response); 但是自定义标头仍未列在标头中。 - xain
1
你列出了请求(request)头而不是响应(response)头。我建议使用Firebug来检查它们。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接