修改Request 中的数据

拦截器修改参数

今天一位网友开发中遇到一个需求,他须要在Request中修改传递过来的数据。开始的时候他在拦截器中修改,在拦截器中能够获取到从前台request中
传递过来的数据。他写法大体以下:自定义拦截器继承HandlerInterceptorAdapterhtml

@Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        //在这里request中获取参数并修改。
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
       
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
      
    }

不过在controller 中获取在拦截器中修改的参数,发现参数仍是之前老的数据,也就是说在拦截器中修改request中出传递过来的数据并无生效。
数据没有生效 参考java

因而我看了 HttpServletRequestWrapper 源码,在Filter中测试了,发现能够成功修改传递过来的参数

public class HTMLFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        FilteredRequest requestWrapper = new FilteredRequest((HttpServletRequest) request);
        requestWrapper.getParameter("paramName");
        chain.doFilter(new FilteredRequest(request), response);
    }

    static class FilteredRequest extends HttpServletRequestWrapper {

        public FilteredRequest(ServletRequest request) {
            super((HttpServletRequest) request);
        }

        public String getParameter(String paramName) {
            String value = super.getParameter(paramName);
            return value + "modify";
        }

    }

    public void destroy() {
        // TODO Auto-generated method stub
    }

    public void init(FilterConfig paramFilterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}

测试结果以下图

  • URL请求地址
    app

  • 自定义过滤器修改传递参数的数据
    ide

  • Controller中查看传递过来的数据
    post

接下来咱们分析下代码

Controller 中的 request.getParameter("paramName") 这个调用的是什么?咱们看下源码发现调用的是
package javax.servlet 包 下面的 ServletRequest 抽象接口ServletRequest 中的
public abstract String getParameter(String paramString);测试

package javax.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;

public abstract interface ServletRequest
{
  public abstract Object getAttribute(String paramString);
  
  public abstract Enumeration<String> getAttributeNames();
  
  public abstract String getCharacterEncoding();
  
  public abstract void setCharacterEncoding(String paramString)  throws UnsupportedEncodingException;
  
  public abstract int getContentLength();
  
  public abstract String getContentType();
  
  public abstract ServletInputStream getInputStream()   throws IOException;
  
  public abstract String getParameter(String paramString);
  
  public abstract Enumeration<String> getParameterNames();
  
  public abstract String[] getParameterValues(String paramString);
  
  public abstract Map<String, String[]> getParameterMap();
  
  public abstract String getProtocol();
  
  public abstract String getScheme();
  
  public abstract String getServerName();
  
  public abstract int getServerPort();
  
  public abstract BufferedReader getReader()   throws IOException;
  
  public abstract String getRemoteAddr();
  
  public abstract String getRemoteHost();
  
  public abstract void setAttribute(String paramString, Object paramObject);
  
  public abstract void removeAttribute(String paramString);
  
  public abstract Locale getLocale();
  
  public abstract Enumeration<Locale> getLocales();
  
  public abstract boolean isSecure();
  
  public abstract RequestDispatcher getRequestDispatcher(String paramString);
  
  /**
   * @deprecated
   */
  public abstract String getRealPath(String paramString);
  
  public abstract int getRemotePort();
  
  public abstract String getLocalName();
  
  public abstract String getLocalAddr();
  
  public abstract int getLocalPort();
  
  public abstract ServletContext getServletContext();
  
  public abstract AsyncContext startAsync()  throws IllegalStateException;
  
  public abstract AsyncContext startAsync(ServletRequest paramServletRequest, ServletResponse paramServletResponse)   throws IllegalStateException;
  
  public abstract boolean isAsyncStarted();
  
  public abstract boolean isAsyncSupported();
  
  public abstract AsyncContext getAsyncContext();
  
  public abstract DispatcherType getDispatcherType();
}
接下来咱们看下Filter的实现类,
public String getParameter(String paramName) {
    String value = super.getParameter(paramName);
    return value + "modify";
}

咱们着重看super.getParameter 这个方法,咱们点进去看源码发现的是 ServletRequestWrapper 类下面的spa

public String getParameter(String name)
{
    return request.getParameter(name);
}

然而 public class ServletRequestWrapper implements ServletRequestcode

综上所述源头来源于 ServletRequest 咱们在Controller 中的 request.getParameter("paramName") 最后就是找的 ServletRequesthtm

咱们来看看HttpServletRequestWrapper
public class HttpServletRequestWrapper   extends ServletRequestWrapper   implements HttpServletRequest
 {
   public HttpServletRequestWrapper(HttpServletRequest request)
   {
     super(request);
   }
   
   private HttpServletRequest _getHttpServletRequest() {
   return (HttpServletRequest)super.getRequest();
   }
 
   public String getAuthType()
   {
      return _getHttpServletRequest().getAuthType();
   }
 
   public Cookie[] getCookies()
   {
   return _getHttpServletRequest().getCookies();
   }
 
   public long getDateHeader(String name)
   {
     return _getHttpServletRequest().getDateHeader(name);
   }
  
   public String getHeader(String name)
   {
   return _getHttpServletRequest().getHeader(name);
   }
 
   public Enumeration<String> getHeaders(String name)
   {
     return _getHttpServletRequest().getHeaders(name);
   }
  
   public Enumeration<String> getHeaderNames()
   {
    return _getHttpServletRequest().getHeaderNames();
   }
 
   public int getIntHeader(String name)
   {
   return _getHttpServletRequest().getIntHeader(name);
   }
   
   public String getMethod()
   {
      return _getHttpServletRequest().getMethod();
   }
 
   public String getPathInfo()
   {
     return _getHttpServletRequest().getPathInfo();
   }
   
   public String getPathTranslated()
   {
     return _getHttpServletRequest().getPathTranslated();
   }
 
   public String getContextPath()
   {
   return _getHttpServletRequest().getContextPath();
   }
  
 
   public String getQueryString()
   {
    return _getHttpServletRequest().getQueryString();
   }
 
   public String getRemoteUser()
   {
   return _getHttpServletRequest().getRemoteUser();
   }
 
   public boolean isUserInRole(String role)
   {
   return _getHttpServletRequest().isUserInRole(role);
   }
   
   public Principal getUserPrincipal()
   {
      return _getHttpServletRequest().getUserPrincipal();
   }
   
   public String getRequestedSessionId()
   {
      return _getHttpServletRequest().getRequestedSessionId();
   }
   
   public String getRequestURI()
   {
   return _getHttpServletRequest().getRequestURI();
   }
   
   public StringBuffer getRequestURL()
   {
   return _getHttpServletRequest().getRequestURL();
   }
   
   public String getServletPath()
   {
      return _getHttpServletRequest().getServletPath();
   }
   
 
   public HttpSession getSession(boolean create)
   {
     return _getHttpServletRequest().getSession(create);
   }
   
   public HttpSession getSession()
   {
      return _getHttpServletRequest().getSession();
   }
 
   public boolean isRequestedSessionIdValid()
   {
    return _getHttpServletRequest().isRequestedSessionIdValid();
   }
  
   public boolean isRequestedSessionIdFromCookie()
   {
     return _getHttpServletRequest().isRequestedSessionIdFromCookie();
   }

//省略底下的方法
相关文章
相关标签/搜索