2011-09-29 4 views
3

서버, 독립 실행 형 SE 응용 프로그램, Spring 2.5.6 및 내장 된 부두. 클라이언트 인 Swing 응용 프로그램은 HttpInvoker를 사용하여 서버에 연결합니다.감사 HttpInvoker 호출

서버에 의해 노출 된 많은 서비스가 있으며 이제는 클라이언트가 작성한 모든 호출을 (거의) 기록해야한다는 새로운 요구 사항이 발생했습니다.

클라이언트가 몇 가지 추가 정보 (사용자 이름, 워크 스테이션 ID 등의 문자열과 정수)를 보내고 싶습니다. 서버 일반적인 방법은 그래서

public void doStuff(int someParam) { 
    // Do stuff 
    List result = method(someParam) 

    // Audit 
    // get the client information from somewhere?!! 
    String username; 
    int workstationId; 

    auditDao.doStuffPerformed(username, workstationId, someParam, result); 

} 

과 같을 것이다, 내가 서버의 방법 내에서 클라이언트 정보를 얻는 방법에 대해 설명합니다.

내가 시도한 한 가지 해결책은 클라이언트 정보를 요청 속성으로 추가하고 RequestContextHolder.getRequestAttributes() 메서드를 호출하는 것입니다. 메서드 내에서.

추가 정보를 추가하기 위해 클라이언트쪽에 CommonsHttpInvokerRequestExecutor를 추가하고 다음 메서드를 오버로드했습니다.

@Override 
protected PostMethod createPostMethod(HttpInvokerClientConfiguration config) throws IOException { 
    PostMethod postMethod = super.createPostMethod(config); 
    postMethod.addRequestHeader("someHeader", "someHeader2"); 
    postMethod.addParameter("someParam", "someParam2"); 
    postMethod.setRequestHeader("someRequestHeader", "someRequestHeader2"); 
    return postMethod; 
} 

그러나 이것은 작동하지 않습니다. 헤더 또는 매개 변수는 서버에서 액세스 할 수 없습니다.

모든 응답은 크게 감사하겠습니다.

답변

0

나는 당신이 올바른 길에 있다고 생각합니다. 서버 측에서 사용자 정의 SimpleHttpInvokerServiceExporter 하위 클래스를 사용하고 클라이언트가 설정 한 헤더를 추출하려면 readRemoteInvocation을 대체해야합니다 (HttpExchange 인수).

이러한 헤더 값은 서버 측 코드에서 액세스 할 수있는 고정 ThreadLocal 세션 변수에 저장할 수 있습니다.

+0

도움 주셔서 감사합니다. CommonsHttpInvokerRequestExecutor를 사용하여 서비스를 호출하지 않는 것으로 나타났습니다. 그 이유는 헤더가 나타나지 않았기 때문입니다. 이 문제가 해결되면 RequestContextHolder.getRequestAttributes();를 호출해야합니다. 서버에서 메서드 내부에서 요청한 스레드가 안전해야하고 모든 이후 가장 쉬운 방법입니다 추측 헤더를 얻으려면 :) – user971483