Java 加载Jax rs资源时SessionContext丢失

Java 加载Jax rs资源时SessionContext丢失,java,jakarta-ee,jax-rs,Java,Jakarta Ee,Jax Rs,我使用的是JavaEE6,这是第一次使用jax-rs,我有这个资源类,但是我不知道为什么在访问服务时没有检索到我的会话。登录工作正常,可以在应用程序的其他部分检索主体 @Path("/countries") @Stateless public class CountryResource { @Resource SessionContext ctx; @EJB private CityBean cityBean; @Path("/countryid/{

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

@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;
    }
虽然我已成功登录,但仍将此输出发送到anonymous。在我尝试使用SessionContext之前,我试图使@RolesAllowed起作用,但没有取得进展。我还有jaxractivator类。关于会话的jax-rs,我需要知道什么

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

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

@Stateless
public class CountryResource {
检查,

手动维护状态

如您所见,对于传统的客户机服务器,应用程序状态是自动维护的。它不需要程序员的任何手动干预。无状态web应用程序并非如此,但有哪些手动步骤可用于维护请求之间的状态

在URL中使用参数。这可能会导致较大且不可管理的URL,并且URL的最大大小受到限制。这还意味着用户可以编辑URL并有效地更改状态,结果不可预测

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

使用cookies。一个cookie中可以存储的数据量是有限制的,一次可以活动的cookie数量是有限制的,较大的cookie传输时间会更长。更糟糕的是,客户端可以选择完全禁用cookie


使用服务器上的文件。在PHP中,这种能力是通过一种称为会话的工具提供的,它允许将数据记录在磁盘文件或数据库表中。这里的优点是所有数据都保存在服务器上,因此除了会话名称和id之外,不会向客户端传输任何内容。因此,客户端无法查看或编辑此会话数据。

首先确保CountryResource类部署为EJB bean。一些应用服务器,例如JBoss EAP 6.x+RestEasy 2.x,有一个缺点,即重新填充的资源不能是现成的EJB bean。如何启用它,例如,对于JBoss EAP 6.x+RestEasy 2.x,您可以查看我的另一个响应:

然后检查principalauthentication信息是否正确地从web资源传播到EJB beanSessionContext,例如,对于JBoss EAP 6.x+RestEasy 2.x,可以通过war文件中的以下更改来实现:

jboss-web.xml

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>
<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>