2012-12-11 4 views
3

Spring Security가 보안을 처리하는 Spring MVC 애플리케이션이있다.GWT RPC 호출을 위해 Spring MVC-Spring Security 애플리케이션에서 세션 만료 예외를 처리하는 방법

UI는 GWT를 사용하여 RPC 접근 방식을 사용하여 서버에서 데이터를 가져옵니다.

세션이 만료되었을 때 UI를 처리해야합니다. 예를 들어 RPC AsyncCallback은 SessionExpiredException 예외 유형을 가져올 수 있으며 "세션이 만료되었습니다. 새로 고침 링크를 클릭하십시오."와 같은 메시지가 표시 될 수 있습니다.

누군가 이러한 문제를 처리 했습니까?

감사합니다.

답변

1

내가 약간 연구되고 여기 http://code.google.com/p/gspring/source/browse/#svn%2Ftrunk%2Fsample%2Fsession-expired%253Fstate%253Dclosed 용액 업로드 :

@RemoteServiceRelativePath("productRpcService.rpc") 
public interface ProductRpcService extends RemoteService { 
    List<Product> getAllProducts() throws ApplicationException; 
    void removeProduct(Product product) throws ApplicationException; 
} 

MyCustomSessionExpiredException extends ApplicationException 

그런 다음 클라이언트 측 코드 팝업 표시 각 동기 인터페이스의 각 메소드 서명 MyCustomSessionExpiredException 유형을 포함한다.

사용 mvn jetty:run-war는 체크 아웃 후 데모를보고 그것을를 해결하는 방법은 두 가지가 있습니다 rpc-security-sample/index.htm

로 이동합니다.

는 메소드 호출시 SessionExpiredException를 발생 GWT RemoteServlet 대리자 프록시를 통과하는 주변이다. 모든 RPC 서비스 메서드에서 Exception을 선언해야합니다.예 : http://code.google.com/p/gspring/source/browse/#svn%2Ftrunk%2Fsample%2Fsession-expired%253Fstate%253Dclosed

단계 :

  1. 단순에 대한 RuntimeException (구현이를 따를 필요가 없습니다)를 상속 할 수있는 각 RPC 방식 서비스에 SessionExpiredException를 선언 차단 새 필터를 개발

  2. 상위 일반 개발 AsyncCallback 처리기

  3. 들어오는 모든 RCP 요청을 처리하려면 http://code.google.com/p/gspring/ 솔루션을 사용하십시오. HTTP 401 오류를 반환하고 (GWT 네이티브 일반 예외 HTTP 상태 번호를 포함하는) UI 측 처리 :

더 간단한이 제 2

. 예 : http://code.google.com/p/gspring/source/browse/#svn%2Ftrunk%2Fsample%2Fsession-expired-401

두 번째 방법은 가장 간단하며 서비스 방법 계약에서 예외를 선언 할 필요가 없습니다. 그러나 첫 번째 방법을 따르면 다음과 같은 유연성을 얻을 수 있습니다. 마지막 로그인 시간 (SessionExpiredException)과 같은 몇 가지 추가 정보가 포함될 수 있습니다. 또한 두 번째 방법은 차단 목록에있는 사용자와 같이 SecurityException에서 상속 된 새로운 예외를 도입 할 수 있습니다 (예 : 사용자가 블랙리스트에 올린 경우 예를 들어 사용자가 매우 자주 로봇과 같은 작업을 수행하는 경우 (예 : 보안 문자를 전달할 수 있는지 묻는 질문)

4

들어오는 GWT 호출을 처리하기 위해 일부 Spring MVC 컨트롤러 또는 일부 서블릿을 사용한다고 가정합니다. 그것은

HttpServletRequest request = getRequest() ; 
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) { 
    return RPC.encodeResponseForFailure(..., new MyCustomSessionExpiredException(), …) ; 
} else { 
    // first code snippet goes here 
} 

그런 다음 사용자 세션이 클라이언트 측 코드에서 예외를 만료 잡아이 사건에 대한 논리를

try{ 
    // decode payload from GWT call 
    com.google.gwt.user.server.rpc.RPC.decodeRequest(...) 
    // get spring bean responsible for actual business logic 
    Object bean = applicationContext.getBean(beanName); 
    // execute business logic and encode response 
    return RPC.invokeAndEncodeResponse(bean, ….) 
} catch (com.google.gwt.user.server.rpc.UnexpectedException ex) { 
    // send unexpected exception to client 
    return RPC.encodeResponseForFailure(..., new MyCustomUnexpectedException(), …) ; 
} 

해결 방법을 다음과 같은 수 있습니다. RPC를 직접 사용하지 않으면 GWT와 Spring 간의 브리지 구현에 대한 자세한 내용을 제공하십시오.

또한 GWT 보안 정책이 클라이언트 쪽 예외 전파를 중지하는 경우를 방지하기 위해 GWT 컴파일러에서 MyCustomSessionExpiredException 유형을 직렬화 목록에 포함해야합니다. 해결책 :

public class ApplicationUncaughtExceptionHandler implements GWT.UncaughtExceptionHandler { 
    @Override   
    public void onUncaughtException(Throwable caught) { 
     if (caught instanceof MyCustomSessionExpiredException) { 
      Window.alert("Session expired"); 
     } 
    } 
} 

// Inside of EntryPoint.onModuleLoad method 
GWT.setUncaughtExceptionHandler(new ApplicationUncaughtExceptionHandler()); 
+0

지식을 공유해 주셔서 감사합니다. 귀하의 접근 방식은 좋지만 비즈니스 계층 하나와 전송 계층을 혼합하여 권장하지 않는 내부 GWT API를 사용합니다. Google 코드 호스팅에서 찾을 수있는 내 답변의 데모를 참조하십시오. 감사. –

관련 문제