使用HttpServletRequest对象,你可以访问客户端用于发出请求的URL,使用的方法(GET,POST,PUT等),查询字符串和标头。
获取RequestBody可能会有些棘手,并且可能需要使用HttpServletRequestWrapper对象。由于请求正文只能被读取一次,因此你需要扩展包装器以访问它,以便你的目标控制器以后仍可以访问它,以将JSON反序列化为POJO对象。
public class MyRequestWrapper extends HttpServletRequestWrapper { private final String body; public MyRequestWrapper(HttpServletRequest request) throws IOException { super(request); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try { InputStream inputStream = request.getInputStream(); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead = -1; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } else { stringBuilder.append(""); } } catch (IOException ex) { throw ex; } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException ex) { throw ex; } } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; }}要在中央位置访问请求,可以使用过滤器或Spring拦截器。这两个请求都在将请求委派给控制器之前被调用,并且都可以访问servlet。
这是一个使用Spring Interceptor的实际记录示例:
package com.vaannila.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.Logger;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler. HandlerInterceptorAdapter;public class LoggerInterceptor extends HandlerInterceptorAdapter { static Logger logger = Logger.getLogger(LoggerInterceptor.class); static { BasicConfigurator.configure(); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("Before handling the request"); return super.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("After handling the request"); super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("After rendering the view"); super.afterCompletion(request, response, handler, ex); }}<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="viewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <bean id="handlerMapping" p:interceptors-ref="loggerInterceptor" /> <bean id="loggerInterceptor" /> <bean id="userService" /> <bean name="/userRegistration.htm" p:userService-ref="userService" p:formView="userForm" p:successView="userSuccess" /></beans>在LoggerInterceptor中,你可以使用以下代码访问请求:
MyRequestWrapper myRequestWrapper = new MyRequestWrapper((HttpServletRequest) request);String body = myRequestWrapper.getBody();String clientIP = myRequestWrapper.getRemoteHost();int clientPort = request.getRemotePort();String uri = myRequestWrapper.getRequestURI();System.out.println(body);System.out.println(clientIP);System.out.println(clientPort);System.out.println(uri);



