如果您不介意使用 spring 4.1.3 或更高版本,您可以将您的请求包装到ContentCachingRequestWrapper类的自定义子类中。
public class MyHTTPServletRequestWrapper extends ContentCachingRequestWrapper {
private UUID uuid;
public MyHTTPServletRequestWrapper (HttpServletRequest request) {
super(request);
uuid = UUID.randomUUID();
}
public UUID getUUID() {
return uuid;
}
}
在您的 spring 控制器中,将请求添加到方法的参数中,并将其转换为您的自定义包装器:
@RequestMapping(value="/get", method = RequestMethod.GET, produces="application/json")
public @ResponseBody String find(@RequestParam(value = "id") String id, HttpServletRequest request) {
MyHTTPServletRequestWrapper wrappedRequest = (WGHTTPServletRequestWrapper)request;
System.out.println(wrappedRequest.getUUID());
...
}
您将需要用户过滤,以连接点:
public class RequestLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest requestToCache = new MyHTTPServletRequestWrapper((HttpServletRequest) request);
System.out.println(((WGHTTPServletRequestWrapper)requestToCache).getUUID());
chain.doFilter(requestToCache, response);
}
}
您会发现 RequestLoggingFilter.doFilter() 和控制器 getId() 中的 printlin 将产生相同的 UUID。
您只需要在适当的地方尝试使用 UUID,但至少您在控制器中具有值,这是您的业务逻辑的开始。