我觉得这应该很容易。我有一个应用程序,其中我想要做的是有一个表单页面(index.jsp)调用servlet(CheckInfo.java),它设置一个新的标头(myHeader)并将用户重定向到另一个页面(redirect.jsp) 。所有这些文件都在同一台服务器上。 index.jsp发送请求很好,CheckInfo正在处理和重定向,但myHeader没有显示在redirect.jsp上。我已经阅读了几篇关于response.sendRedirect的帖子发送了一个302,它没有传递头文件,我应该使用RequestDispatcher,但似乎没有任何工作。有没有办法从servlet发送标头到jsp? 这是servlet代码:
response.setHeader("myHeader", "hey there");
response.sendRedirect("redirect.jsp");
我也试过这个:
response.setHeader("myHeader", "hey there");
RequestDispatcher view = request.getRequestDispatcher("redirect.jsp");
view.forward(request, response);
我在redirect.jsp中有这个:
System.out.println(request.getHeader("myHeader"));
这不会打印任何内容。
如果我的问题的答案是否定的......那么一旦我回到jsp,我就会想办法设置标题。我的反向代理正在查找特定标头以确定是否执行操作。显然我在redirect.jsp上尝试了response.addHeader(),但是那个页面已经加载了,所以这让我感到愚蠢。
答案 0 :(得分:3)
Location
您将其添加为响应标头,它是302响应。看到302响应的浏览器将只查找 00000000;Pikachu Muchacho;region1
11111111;SoSo good;region2
22222222;Marshaw williams;region3
33333333;larry Mikal Carter;region3
标头并向该位置发出新请求。响应中的自定义标头不受影响,而您希望这些自定义响应标头包含在未发送的请求(到新的重定向位置)中。
解决方案: -
1.您可以使用请求调度程序转发请求而不是外部重定向。你需要在这里使用请求属性。
2.你可以使用ajax请求调用提交表单可能是jquery like并手动处理响应(302响应)但不建议你使用这种方法,因为它不是一个更清晰和直观的方法。只需提及,以便您知道还有其他方法可以实现这一目标。
答案 1 :(得分:1)
我希望很明显,在要求客户端重定向到另一个URL的情况下,浏览器将不接受Cookie。
但是,第二种方法-服务器转发请求是可行的。主要错误似乎是在我们应该更改请求的同时对response
进行了更改。
然后,不能再直接改变HttpServletRequest对象。这是一种方法:
HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request){
public String getHeader(String name) {
String value = super.getHeader(name);
if(Strings.isNullOrEmpty(value)) {
...
value = myNewHeader;
}
return value;
}
public Enumeration<String> getHeaders(String name) {
List<String> values = Collections.list(super.getHeaders(name));
if(values.size()==0) {
...
values.add(myNewHeader);
}
return Collections.enumeration(values);
}
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
names.add(myNewHeaderName);
...
return Collections.enumeration(names);
}
}
其次:
RequestDispatcher view = request.getRequestDispatcher("redirect.jsp");
// OR (If you can get servletContext)
RequestDispatcher view = servletContext.getRequestDispatcher("redirect.jsp");
view.forward(requestWrapper, response);
参考:
注意:可能无法将请求转发到需要其他MIME类型的端点。
答案 2 :(得分:0)
客户端重定向会创建新的HTTP请求/响应对。 此链接可以帮助您更多地调试透视图 -
答案 3 :(得分:0)
问题在于响应的redirect()
方法完全发起了一个新请求,从而失去了重定向之前设置的属性。幸运的是,仍然有一种流畅的方法可以解决问题。见下文
response.setHeader("myHeader", "hey there");
request.getRequestDispatcher("redirect.jsp").forward(request, response);
然后在您的目的地,您可以response.getHeaders("myHeader")
我已经测试了代码。