사실 토마스 (질문에 덧붙음 참조)가 질문에 대답했습니다. @ 토마스 : 고마워. 이전 연구에서 내가 놓쳤던 바로 그 것이었다.
몇 가지 세부 정보를 추가 할 수 있습니다.
이
IMyServiceAsync service = GWT.create(IMyService.class);
((ServiceDefTarget)service).setRpcRequestBuilder(new MyCustomRpcRequestBuilder());
이
이 약 요청을 조작 할 수 doSetRequestData
를 오버라이드 (override) 할 필요가 RpcRequestBuilder 사용자 정의가 전송 될 : 클라이언트 측에서, 토마스 비동기 서비스 인터페이스에 설정해야합니다 RpcRequestBuilder 사용자 지정 제안으로
이 처리되기 전에 doSetCallback
는 그 응답에 손을 얻을 : 서블릿 필터가 사용될 수있는 서버 측
private final class MyCustomRpcRequestBuilder extends RpcRequestBuilder {
@Override
protected void doSetRequestData(RequestBuilder rb, String payload) {
// do whatever you need to do on the payload, request header, ...
String checksum = calculateChecksum(payload);
rb.setHeader(MY_CUSTOM_HEADER_NAME, checksum);
super.doSetRequestData(rb, payload);
}
@Override
protected void doSetCallback(RequestBuilder rb, final RequestCallback callback) {
super.doSetCallback(rb, new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
// do whatever you need to do on the response header, ...
String receivedChecksum = response.getHeader(MY_CUSTOM_HEADER_NAME);
if (receivedChecksum.equals(calculateChecksum(response.getText())) {
callback.onResponseReceived(request, response);
}
else {
callback.onError(request, new InvalidChecksumException(...));
}
}
@Override
public void onError(Request request, Throwable exception) {
callback.onError(request, exception);
}
});
}
}
한다.
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest)req;
HttpServletResponse httpResp = (HttpServletResponse)resp;
String receivedChecksum = httpReq.getHeader(MY_CUSTOM_HEADER_NAME);
String reqPayload = RPCServletUtils.readContentAsGwtRpc(httpReq);
if (receivedChecksum.equals(calculateChecksum(reqPayload)) {
final ServletInputStream inputStream = new ByteArrayServletInputStream(reqPayload.getBytes(RPCServletUtils.CHARSET_UTF8));
HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(httpReq) {
@Override
public ServletInputStream getInputStream() throws IOException {
return inputStream;
}
};
final CachingServletOutputStream outputStream = new CachingServletOutputStream();
HttpServletResponseWrapper respWrapper = new HttpServletResponseWrapper(httpResp) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
return outputStream;
}
};
filterChain.doFilter(reqWrapper, respWrapper);
// possibly you also need to handle gzipped payload
String respPayload = new String(outputStream.getCachedDataAsBytes(), RPCServletUtils.CHARSET_UTF8);
String checksum = calculateChecksum(respPayload);
httpResp.setHeader(MY_CUSTOM_HEADER_NAME, checksum);
httpResp.getOutputStream().write(outputStream.getCachedDataAsBytes());
} else {
httpResp.setContentType("text/plain");
httpResp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
httpResp.getOutputStream().write("Invalid checksum".getBytes(RPCServletUtils.CHARSET_UTF8));
}
}
static class ByteArrayServletInputStream extends ServletInputStream {
private final InputStream delegate;
ByteArrayServletInputStream(byte[] data) throws IOException, ServletException {
delegate = new ByteArrayInputStream(data);
}
@Override
public int read() throws IOException {
return delegate.read();
}
}
static class CachingServletOutputStream extends ServletOutputStream {
private final ByteArrayOutputStream cache;
CachingServletOutputStream() {
this.cache = new ByteArrayOutputStream(4096);
}
@Override
public void write(int b) throws IOException {
cache.write(b);
}
@Override
public void flush() throws IOException {
cache.flush();
}
byte[] getCachedDataAsBytes() {
return cache.toByteArray();
}
}
}
출처
2017-05-16 09:32:44
Pat
방법 서버 측에 서블릿 필터를 사용하고 사용자 정의 ['RpcRequestBuilder'] (약 http://www.gwtproject.org/javadoc/latest/com : GWT의 RPCServletUtils는 몇 가지 유용한 방법의 herefore있다 /google/gwt/user/client/rpc/RpcRequestBuilder.html)? –