3

我正在尝试了解 J2EE 和 Web 服务(在 GlassFish 3.1 中)。这个问题是对此的一个跟进。

我已经弄清楚如何使用无状态会话 Bean 和 Web 服务。我实际上只是@WebService出于方便而使用 Web Service (),因为我宁愿不手动解析消息。虽然如果可能的话,我更喜欢比 SOAP 更轻的东西。但是,当我想保持某种状态(例如通过有状态会话 Bean)时,我遇到了问题。我已经搜索了这个站点和其他几个建议我避免这种情况的站点,因为它可能导致难以找到错误并限制可扩展性。

假设我有一个用户刚刚执行了“userLogin”方法并且成功了。然后我如何在服务器上知道用户已经登录。例如,在登录后,用户可能会通过 SOAP(不带任何参数)调用“getProfile()”,我会为该用户返回正确的信息。我知道通过附加到我的有状态会话 Bean 是不可能的,@WebService因为这仅对@Stateless.

如果我使用 HttpSession(带有 HttpServlet)和无状态会话 Bean,我知道如何存储状态,但是我不能使用生成良好的 SOAP 消息。

所以我的问题是:我将如何解决维护用户状态的问题,或者调整问题以使我不需要状态?

4

2 回答 2

5

WS 可以是有状态的:使用 @Stateful 注释和 WS-Addressing(例如,请参阅我的旧问题

拥有有状态的服务器并没有犯罪。毕竟,如果需要有状态,为什么要避免呢?确实,无状态更容易扩展和调试,但是如果您需要保持状态(例如在购物卡中)——那么就保持它。

不过要考虑的是在超时后清理有状态服务实例。使用 StatefulWebServiceManager 实例及其 setTimeout() 方法。

此外,状态可以保存在 WS 之外(例如数据库),并且状态(会话)标识符作为参数之一传递。工作得很好。

使用 HTTP 会话是保持无状态服务状态的一种非常简单的方法,但与 @Stateful 相比,我认为它已经过时了。理由是请求不必通过 HTTP 来;@Stateful/WS-Addressing 适用于任何通道,而 HTTP 会话需要 HTTP 传输。当然,在现实世界中,HTTP 是盛行的,所以这个论点是相当纯粹的。

于 2011-06-28T03:31:38.507 回答
0

将无状态 bean 公开为 Web 服务:

import javax.ejb.Remote;
import javax.jws.WebService;
import javax.jws.WebMethod; 


@WebService
/**
* This is an Enterprise Java Bean Service Endpoint Interface
*/
public interface HelloServiceInf extends java.rmi.Remote {

    /**
    * @param phrase java.lang.String
    * @return java.lang.String
    * @throws String The exception description.
    */
    @WebMethod
    java.lang.String sayHello(java.lang.String name) throws java.rmi.RemoteException;
}

将 Web 服务实现为无状态 bean

import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.Stateless;

/**
* This is a session bean class
*/
@Stateless(name="HelloServiceEJB")
public class HelloServiceBean implements HelloServiceInf {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

您需要在HttpSession中保留UserInfo(用户详细信息和配置文件信息对象),如果HttpSession中没有UserInfo,则需要调用bean(Web服务)。

于 2015-09-24T05:30:47.137 回答