在执行sendRedirect时使用Post

时间:2009-12-07 19:09:51

标签: jsf redirect

我要求需要在用户浏览器中从自定义瘦客户端启动jsf页面(瘦客户端执行http发布)。由于可以多次调用jsf页面,我使用jsp重定向到urs上带params的jsf页面。在jsp中我执行会话失效。 jsp代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page session="true" %>

<%
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
session.invalidate();

String outcome = request.getParameter("outcome");


String queryString = "outcome=" + outcome ;

response.sendRedirect("./faces/MyPage.jspx?"  + queryString);


%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>
    <title>title here</title>
  </head>
  <body></body>
</html>

我的jsf页面使用启用了autoSubmit的多个下拉项。我首先在表单中设置params,然后在用户最终点击操作按钮时从那里使用它。以下是我用来获取jsf支持bean构造函数中的参数的代码:

FacesContext ctx = getFacesContext();
Map sessionState = ctx.getExternalContext().getSessionMap();
outcome = (String)sessionState.get("outcome");
if(outcome == null)  //if not on session, get from url
    outcome = (String)JSFUtils.getManagedBeanValue("param.outcome");

这样我甚至可以在多次autodown提交下拉后得到参数。

我的问题是我无法在浏览器地址栏中显示参数。我需要一种方法,以便可以将参数传递给jsp页面。我无法从瘦客户端直接发送到jsp,因为每次客户端启动用户浏览器时我都需要jsf页面来创建一个新会话。这是因为上面的代码片段是关于如何在jsf页面中使用params。

有没有办法在执行sendRedirect时使用帖子,这样我就不必在url上传递params了?我无法使用forward,因为当autoSubmit在jsf页面上触发时,它会导致浏览器刷新jsp页面。

有没有更好的方法来处理jsf页面本身,这样我就不必依赖在连续的autoSubmit事件之间的会话中存储params?

2 个答案:

答案 0 :(得分:1)

由于你使会话无效,不,你不能。

唯一的方法是将它放在会话范围内。你为什么要在第一次请求时使会话无效?这没什么意义。

与您的实际问题无关,在scriptlet中执行sendRedirect()而不是Filter并且在同一个JSP页面中有一堆HTML是收到大麻烦。不要在JSP文件中编写原始Java代码,您不希望这样。 Java代码属于Java类。仅在JSP中使用taglibs / EL。

答案 1 :(得分:1)

没有。因为sendRedirect使用新位置向web浏览器/客户端发送302,并且根据以下内容,无论原始请求是什么,它通常都是GET。

根据HTTP / 1.1 RFC 2616 http://www.ietf.org/rfc/rfc2616.txt

If the 302 status code is received in response to a request other
than GET or HEAD, **the user agent MUST NOT automatically redirect the
request unless it can be confirmed by the user**, since this might
change the conditions under which the request was issued.

Note: RFC 1945 and RFC 2068 specify that the client is not allowed
to change the method on the redirected request.  However, ***most
existing user agent implementations treat 302 as if it were a 303
response, performing a GET on the Location field-value regardless
of the original request method***. The status codes 303 and 307 have
been added for servers that wish to make unambiguously clear which
kind of reaction is expected of the client.

也许用ajax仔细玩可以得到你的东西。

更新:然后,当用户:BalusC指出时,您可以通过手动设置标头重定向,如:

response.setStatus(307);
response.setHeader("Location", "http://google.com");