2010-05-01 7 views
2

저는 웹 서비스를 작성하는 데 상당히 익숙합니다. 저는 JAXWS를 사용하는 SOAP 서비스에 대해 작업하고 있습니다. 사용자 로그인이 가능하고 내 서비스에서 어떤 사용자가 명령을 내리고 있는지 알고 싶습니다. 다른 말로하면 세션 처리를해야합니다.JAXWS 및 세션

내가 한 일은 쿠키를 사용하고 웹 서비스에서 HTTP 레이어에 액세스하는 것입니다. 그러나 이것은 HTTP를 전송 레이어로 사용하는 것에 대한 의존성을 둡니다 (HTTP는 거의 항상 전송 레이어이지만 필자는 순수 주의자입니다).

서비스 계층이 전송 계층을 인식하지 못하게하는 더 나은 방법이 있습니까? 서블릿 필터로 이것을 수행 할 수있는 방법이 있습니까? 가능한 한 프레임 워크에 독립적 인 대답을 원합니다.

답변

5

내가 잭스 - WS를 사용하여 SOAP 서비스에 일하고 있어요. 사용자 로그인이 가능하고 내 서비스에서 어떤 사용자가 명령을 내리고 있는지 알고 싶습니다. 다른 말로하면 세션 처리를해야합니다.

기존의 웹 서비스는 자연 상태 비 저장 (발신자를 식별하는 할 수있는 말 아무것도에 의해가) 웹 서비스에는 세션 처리이 없습니다.

  1. 이 인증 토큰을 반환하는 "인증"웹 서비스 (사용자 자격 증명을 전달)을 노출 :

    하면 사용자를 필요로 할 경우

    이 서비스를 호출 인증을, 전통적인 접근 방식은 것입니다.
  2. 사용자가이 인증을 먼저 호출하도록하십시오.
  3. 사용자가 "비즈니스"웹 서비스를 계속 호출 할 때 사용자 정의 헤더에 토큰을 전달하도록하십시오. 서버 측에

:

  1. 유효한 토큰을 포함하지 않는 모든 통화를 거부합니다.
  2. 무효화 토큰 활동

몇 시간 후에는이 방법에 대한 사용자 정의 솔루션을 (이것은 매우 상호 운용 솔루션) 구현할 수 있습니다. 또는 상자 밖에서 비슷한 것을 제공하는 WS-Security/UsernameTokens을 사용할 수 있습니다. WS-Security는 표준 (Metro가 구현)이며 "프레임 워크"와 관련이 없습니다.

+0

뛰어난 답변. 고맙습니다. – Pace

1

언급 한 것처럼 서블릿 필터는 솔루션의 기초를 제공 할 수 있습니다. 필터를 사용하여 현재 세션 세부 정보 (예 : 세션 컨텍스트 Map)를 threadLocal 저장소에 저장합니다. 이것은 응용 프로그램 클래스로 구현되므로 전송에 영향을받지 않습니다. 서비스는 단순히 정적 메서드를 사용하여 현재 컨텍스트를 가져오고 어디에서 왔는지 인식하지 못합니다.

예.

class ServiceSessionContext 
{ 
    static ThreadLocal<Map> local = new ThreadLocal<Map>(); 

    // context set by the transport layer, e.g. servlet filter 
    static public void setContext(Map map) 
    { 
     local.put(map); 
    } 

    // called when request is complete 
    static public void clearContext() 
    { 
     local.put(null); 
    } 

    // context fetched by the service 
    static public Map getContext() 
    { 
     return local.get(); 
    } 
}  
+0

감사합니다.이 패턴을 사용하여 위에서 언급 한 토큰을 내 서비스 계층에 전달할 수 있다고 생각합니다. – Pace