我要求需要在用户浏览器中从自定义瘦客户端启动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?
答案 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");