我有一个servlet A ,我在HTTP响应中设置了一个标头:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName=request.getParameter("userName");
String newUrl = "http://somehost:port/ServletB";
response.addHeader("REMOTE_USER", userName);
response.sendRedirect(newUrl);
}
现在在servlet B 中,我正在尝试获取在servlet A 中设置的标头值:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userid = request.getHeader("REMOTE_USER");
}
但是这里 userid 的值是null
。请让我知道我在这里缺少什么。
答案 0 :(得分:10)
首先,您必须了解
的性质response.sendRedirect(newUrl);
它给客户端(浏览器)302带有URL的http代码响应。 然后,浏览器在该URL上发出单独的GET请求。 并且该请求在第一个请求中不知道标题。
因此,如果需要将头文件从Servlet A传递给Servlet B,sendRedirect将无效。
如果您希望此代码有效 - 请在Servlet A中使用RequestDispatcher(而不是sendRedirect)。此外,使用相对路径总是更好。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String userName=request.getParameter("userName");
String newUrl = "ServletB";
response.addHeader("REMOTE_USER", userName);
RequestDispatcher view = request.getRequestDispatcher(newUrl);
view.forward(request, response);
}
========================
public void doPost(HttpServletRequest request, HttpServletResponse response)
{
String sss = response.getHeader("REMOTE_USER");
}
答案 1 :(得分:3)
在我的控制器中,我只添加了一个HttpServletResponse参数并手动添加了标头,不需要过滤器或拦截器,并且效果很好:
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, X-Auth-Token, X-Csrf-Token, WWW-Authenticate, Authorization");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "false");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
答案 2 :(得分:0)
标题字段不会复制到后续请求中。您应该使用cookie(addCookie方法)或在会话中存储“REMOTE_USER”(可以使用getSession方法获取)。