2015-05-03 28 views
0

我正在使用Java EE 6,这是第一次使用jax-rs,我有这个资源类,但我不知道为什么我的会话在访问服务时没有检索。登录工作正常,可以在应用程序的其他部分检索主体。加载Jax-rs资源时SessionContext丢失

@Path("/countries") 
@Stateless 
public class CountryResource { 

    @Resource 
    SessionContext ctx; 

    @EJB 
    private CityBean cityBean; 

    @Path("/countryid/{countryid}") 
    @GET 
    @Produces("application/xml") 
    public String getCountryByPk(@PathParam("countryid") Long tlCountryId){ 
     if(ctx != null){ 
      System.out.println(ctx.getCallerPrincipal()); 
     } 

     String country; 
     ... 
     return country; 
    } 

此输出为匿名,但我已成功登录。在我尝试使用SessionContext之前,我试图让@RolesAllowed工作,但并没有取得进展。我也有JaxRsActivator类。我需要知道关于与会话相关的jax-rs?

@ApplicationPath("/rest") 
public class JaxRsActivator extends Application { 
} 

回答

0

正如我所看到的你是一个无状态的应用程序,所以会话不会固有使用。您必须在请求响应对象中显式添加cookie或会话标识符以维护应用程序的状态。

@Stateless 
public class CountryResource { 

检查this & this

维护国家手动

正如你所看到的,与传统的客户端 - 服务器应用程序的状态是自动维护的。它不需要编程人员的任何手动干预。无状态Web应用程序并非如此,但可以使用哪些手动步骤来维护请求之间的状态?

在URL中使用参数。这可能会导致大型且难以管理的URL,并且URL的最大大小有限制。这也意味着用户可以编辑URL并有效地改变状态,从而产生不可预测的结果。

在表单中使用隐藏字段。这可能会导致较大的形式,因此传输速度较慢。即使数据可能隐藏在渲染文档中,用户仍然可以通过使用浏览器的“查看源”选项来查看它。用户甚至可以编辑源文件并在传输回服务器之前更改其中的一些值。

使用cookie。可存储在cookie中的数据量有限制,任何时候都可以激活的cookie数量有限制,较大的cookie需要更长的时间才能转换。更糟糕的是,客户端可以选择完全禁用cookie

使用服务器上的文件。在PHP中,这种功能是通过一种称为会话的设施提供的,它允许将数据记录在磁盘文件或数据库表中。这样做的好处是所有的数据都保存在服务器上,所以没有任何东西被传输到客户端(除了会话名称和ID)。因此,客户端无法查看或编辑此会话数据。

0

首先确保CountryResource类被部署为EJB bean。某些应用程序服务器(例如JBoss EAP 6.x + RestEasy 2.x)具有缺陷,即resfull资源不能成为EJB bean的开箱即用功能。 (如何启用它,例如,对于JBoss EAP 6.x + RestEasy 2.x,你可以看看我的另一个响应:https://stackoverflow.com/a/35085385/466677

然后检查是否从web资源正确传播了principal(认证信息)到EJB bean(SessionContext ),例如用于JBoss EAP 6.x + RestEasy 2。X它可以通过下面的战争文件的变化来实现:

的jboss-web.xml中

<jboss-web> 
    <security-domain>my-security-domain-name-in-jboss-configuration</security-domain> 
</jboss-web> 

web.xml中 - 包含认证的声明,在这种情况下基本身份验证

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Resteasy auth</web-resource-name> 
     <url-pattern>/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>REST_USER</role-name> 
    </auth-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>My Realm</realm-name> 
</login-config> 
<security-role> 
    <role-name>REST_USER</role-name> 
</security-role>