2016-07-21 35 views
0

力登陆我使用RestEasy的3.0.11.Final与JBoss AS 5.1.0 GA。我有一个定义的REST Web服务。整个服务通过具有自定义安全域的BASIC身份验证进行保护。当我使用邮差发送一个请求(#1)与用于用户 BASIC认证,JBoss应用服务器调用用户登录模块,然后调用本地EJB(抬头与初始上下文)与呼叫者主要的方法。 Immidiately后我发送另一个请求(#2)与用于用户 BASIC认证,在此情况下的JBoss AS不调用登录模块并调用调用者主体再次本地EJB方法。经过一段时间后发送具有用户乙请求产生所希望的结果(与呼叫者主要本地EJB方法调用)。我不知道是什么原因造成的问题,RestEasy的服务配置/会话处理或JBoss应用服务器的安全域配置,它负责登录模块(视超时?缺乏方法后,注销的被称为?)?基本上,我想配置RestEasy的强行与一个新的登录模块调用本地EJB方法调用每一个休息的请求一个新的会话。JBoss AS中5.1.0 GA RestEasy的应用 - 在每次请求

web.xml中:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>my-app</display-name> 
    <context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider,com.mycompany.infrastructure.ExceptionMapper</param-value> 
    </context-param> 
    <context-param> 
    <param-name>resteasy.resources</param-name> 
    <param-value>com.mycompany.resource.Resource</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
    </listener> 
    <servlet> 
    <servlet-name>my-app-resteasy-servlet</servlet-name> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.core.Application</param-name> 
     <param-value>com.mycompany.application.Application</param-value> 
    </init-param> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>my-app-resteasy-servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    <security-constraint> 
    <web-resource-collection> 
     <web-resource-name>my-app-resteasy-servlet</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>User</role-name> 
    </auth-constraint> 
    </security-constraint> 
    <login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>MyRealm</realm-name> 
    </login-config> 
    <security-role> 
    <role-name>User</role-name> 
    </security-role> 
</web-app> 

的JBoss-web.xml中

<jboss-web> 
    <context-root>/path</context-root> 
    <security-domain>java:/jaas/MyRealm</security-domain> 
</jboss-web> 

的beans.xml

<beans 
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="all"> 
</beans> 

登录-config.xml为MYREALM

<application-policy name="MyRealm"> 
    <authentication> 
     <login-module code="com.mycompany.security.UsernamePasswordLoginModuleImpl" 
     flag="required"> 
     <module-option name="password-stacking">useFirstPass</module-option> 
     </login-module> 
    </authentication> 
</application-policy> 

Resource.java

@Path("/resource") 
@Stateless 
public class Resource { 

    @POST 
    @Path("/execute") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public ResponseDTO execute(RequestDTO dto) { 
     try { 
      // code 
     } catch (Exception exception) { 
      // handle 
     } 
    } 
} 

回答

0

我发现了一个非常粗糙的溶液:

Resource.java:

@Path("/resource") 
@Stateless 
public class Resource { 

    @POST 
    @Path("/execute") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public ResponseDTO execute(RequestDTO dto, @Context HttpServletRequest request) { 
     try { 
      // code 
     } catch (Exception exception) { 
      // handle 
     } finally { 
      if (request != null) { 
       request.getSession().invalidate(); 
      } 
     } 
    } 
} 

或相同的结果,不同的实施方式(没有在每个方法重复相同的码在一个资源中,显然):

SessionInvalidatorFilter.java

public class SessionInvalidatorFilter implements ContainerResponseFilter { 
    @Context 
    private HttpServletRequest request; 

    public void filter(ContainerRequestContext requestCtx, ContainerResponseContext responseCtx) throws IOException { 
     if ((request != null) && (request.getSession() != null)) { 
      request.getSession().invalidate(); 
     } 
    } 
} 

的web.xml

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.mycompany.infrastructure.filter.SessionInvalidatorFilter</param-value> 
</context-param> 
相关问题