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