繁体   English   中英

从Servlet访问JSF会话范围的Bean,该Bean由嵌入在JSF Webapp中的applet调用

[英]Accessing JSF session scoped bean from servlet which is called by applet embedded in JSF webapp

我需要从Servlet访问会话范围的bean。 我已经试过了

UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");

在本作描述的职位 但是我只能得到null的结果,尽管UserBean的一个实例已经被无效化了。 这些是我用于userBean的注释/导入:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
 ... }

为什么不能摆脱servlet的一些背景知识:我的jsf页面中有一个文件上传小程序。 该applet期望可以发送POST请求的地址。 (我无法编辑此发布请求以添加更多字段或其他内容)。 然后,我的servlet的post方法存储文件。 托管bean无法完成此工作,因为该servlet必须使用@MultiPartConfig进行注释,并且我无法将此注释添加到jsf托管bean中。

如果返回null ,则只能表示两件事:

  1. JSF尚未预先创建bean。
  2. applet-servlet交互与Webapp使用的HTTP会话不同。

考虑到您描述功能需求的方式,我认为是后者。 您需要确保同时传递Web应用程序的会话标识符以及来自小程序的HTTP请求。 这可以采用JSESSIONID cookie或jsessionid URL路径属性的形式。

首先,您需要向applet告知该Webapp正在使用的会话ID。 您可以通过将参数传递给保存该applet的<applet><object>标记来实现

<param name="sessionId" value="#{session.id}" />

#{session}是一个隐式JSF EL变量,它引用当前的HttpSession ,而该HttpSession又具有getId()方法;您无需为此创建托管Bean,上面的代码行如下所示:是)

可以在小程序中按如下方式检索它:

String sessionId = getParameter("sessionId");

您没有描述如何与servlet交互,但是假设您为此使用标准的Java SE URLConnection ,指向@WebServlet("/servleturl") servlet,则可以使用setRequestProperty()设置一个请求头:

URL servlet = new URL(getCodeBase(), "servleturl");
URLConnection connection = servlet.openConnection();
connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId);
// ...

另外,您也可以将其作为URL路径属性传递:

URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + sessionId);
URLConnection connection = servlet.openConnection();
// ...

(请注意,这两种情况都重要)

无论哪种方式,applet-servlet交互都将在与JSF托管bean相同的HTTP会话中进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM