下面列出了javax.servlet.ServletRequestWrapper#getRequest ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private HttpServletRequest findHttpServletRequestInChain(ServletRequest request) {
ServletRequest currentRequest = request;
while (currentRequest instanceof ServletRequestWrapper) {
ServletRequestWrapper wrapper = (ServletRequestWrapper) currentRequest;
currentRequest = wrapper.getRequest();
if (currentRequest instanceof HttpServletRequest) {
return (HttpServletRequest) currentRequest;
}
}
return null;
}
/**
* Unwrap the servlet request.
*
* @param <T> the type.
* @param request the request to unwrap.
* @return the unwrapped request.
*/
@SuppressWarnings("unchecked")
private <T extends ServletRequest> T unwrapFully(ServletRequest request) {
ServletRequest currentRequest = request;
while (currentRequest instanceof ServletRequestWrapper) {
ServletRequestWrapper wrapper = (ServletRequestWrapper) currentRequest;
currentRequest = wrapper.getRequest();
}
return (T) currentRequest;
}
public HttpServletRequest unwrap(HttpServletRequest request) {
ServletRequest currentRequest = request;
while (currentRequest instanceof ServletRequestWrapper) {
ServletRequestWrapper wrapper = (ServletRequestWrapper) currentRequest;
currentRequest = wrapper.getRequest();
}
return (WebApplicationRequest) currentRequest;
}
private void asyncNonHttpForward(AsyncNonHttpDispatchWrapper asyncNonHttpDispatchWrapper, ServletResponse servletResponse) throws ServletException, IOException {
// A typical chain to arrive here is DefaultAsyncContext#dispatch -> DefaultAsyncDispatcher#dispatch -> forward -> asyncForward -> asyncNonHttpForward
ServletRequest asyncStartRequest = asyncNonHttpDispatchWrapper.getRequest();
if (asyncStartRequest instanceof ServletRequestWrapper) {
ServletRequestWrapper applicationProvidedWrapper = (ServletRequestWrapper) asyncStartRequest;
HttpServletRequest httpServletRequestInChain = findHttpServletRequestInChain(applicationProvidedWrapper);
if (httpServletRequestInChain != null) {
// We swap our asyncHttpDispatchWrapper from being the head of the chain, with a new wrapper, wrapping the HttpServletRequest that we found, and put
// that in between the request that was provided by the application and the request it is wrapping.
ServletRequest wrappedRequest = applicationProvidedWrapper.getRequest();
AsyncHttpDispatchWrapper newAsyncHttpDispatchWrapper = new AsyncHttpDispatchWrapper(null);
// Note that by doing this, methods called on HttpServletRequestWrapper itself (and not its super interface) will throw.
newAsyncHttpDispatchWrapper.setRequest(wrappedRequest);
applicationProvidedWrapper.setRequest(newAsyncHttpDispatchWrapper);
// Original chain: asyncNonHttpDispatchWrapper -> applicationProvidedWrapper (asyncStartRequest) -> wrappedRequest -> .... -> HttpServletRequest
// New chain: applicationProvidedWrapper (asyncStartRequest) -> newAsyncHttpDispatchWrapper -> wrappedRequest -> .... -> HttpServletRequest
invokeTargetAsyncServlet(asyncStartRequest, httpServletRequestInChain, newAsyncHttpDispatchWrapper, servletResponse);
}
}
}