拦截器修改参数

今天一位网友开发中遇到一个需求,他需要在Request中修改传递过来的数据。开始的时候他在拦截器中修改,在拦截器中可以获取到从前台request中

传递过来的数据。他写法大致如下:自定义拦截器继承HandlerInterceptorAdapter

    @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中出传递过来的数据并没有生效。

数据没有生效 参考

于是我看了 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请求地址

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

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

接下来我们分析下代码

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 类下面的

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

然而 public class ServletRequestWrapper implements ServletRequest

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

我们来看看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();
} //省略底下的方法

修改Request 中的数据的更多相关文章

  1. sql server中如何修改视图中的数据?

    sql server中如何修改视图中的数据? 我做个测试,视图的数据有标记字段时,如果是这种方式(0 as FlagState),是无法修改的 --创建视图语句 --- create view V_E ...

  2. (笔记)Mysql命令update set:修改表中的数据

    update set命令用来修改表中的数据. update set命令格式:update 表名 set 字段=新值,… where 条件; 举例如下:mysql> update MyClass ...

  3. SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据(转)

    在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据 insert Sale ([Name],[SaleTime] ...

  4. 修改MySQL中的数据

    一:insert语句 1.介绍 在执行插入语句前,需要具有执行INSERT语句的INSERT权限. 2.准备环境 3.简单insert语句 4.插入多行 在这种形式中,每行的值列表用逗号分隔. 如果为 ...

  5. 获取 request 中 json 数据

    import java.io.IOException; import javax.servlet.http.HttpServletRequest; /** * request 对象的相关操作 * @a ...

  6. Update 语句用于修改表中的数据。

    语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

  7. 修改request请求参数

    本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除: 但在后台程序中,一般对request的参数的操作,都是通过request的getParameter.getParameter ...

  8. oracle----修改表中的数据

    1. 修改表中的数据:UPDATE语句: 语法: UPDTAE table_name SET column1 = value1,... [WHERE conditions] (2),无条件的更新(没有 ...

  9. java读取请求中body数据

    java读取请求中body数据 /** * 获取request中body数据 * * @author lifq * * 2017年2月24日 下午2:29:06 * @throws IOExcepti ...

随机推荐

  1. JSP学习总结

    1. 为什么需要jsp?  Servlet对于逻辑处理是非常方便的,但是对于页面的展现是非常麻烦的.JSP的诞生是为了解决Servlet页面展现麻烦的问题的. 2. JSP的特点:     Jsp页面 ...

  2. 各大型邮箱smtp服务器及端口收集

    >新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sina.com.cn 收件服务器: ...

  3. Android 问题

    1.Cannot refer to a non-final variable 解决方法 内部类如果要引用外部类的变量,则该变量必须为final,这是规定 2.error: No resource id ...

  4. spring使用c3p0报错

    java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchang ...

  5. java面向对象的三大特性——多态

    多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底 ...

  6. Django_xamdin安装与使用

    有比Django更加强大的admin? xadmin? pip install xadmin 如何让xadmin生效? 新增两个注册app,xadmin,crispy_forms,通过run mana ...

  7. 【bird-java】分布式服务间的事件总线EventBus

    什么是EventBusEventBus是对发布-订阅模式的一种实现.其以一种非常优雅的方式实现了组件间的解耦与通信,在Android开发.DDD等领域都有非常广泛的应用. 事件流大致如下: Produ ...

  8. lambda高级进阶--返回函数

    在函数式编程语言中,函数是一级公民.如同你可以将数字传递给方法,也可以让方法产生数字一样,函数不仅可以作为参数,也可以作为返回值.这听起来好像有点抽象,在JAVA编码中,我们好像也很少这样子写到,但是 ...

  9. 重拾Python(1):使用Anaconda搭建Python开发环境(Windows7)

    1.为什么选择Anaconda? Anaconda解决了Python使用痛点. Python好用但是令人头疼的就是库管理与Python不同版本的问题,特别是Windows环境下. 2.什么是Anaco ...

  10. CentOS 下开启PHP错误提示

    我也是傻逼,一直在找图片无法上传的原因,这么久了才意识到自己没有在Linux系统的服务器下开启错误提示. 正文 默认模式下的apache是没有开启错误语法提示的,修改php.ini文件.不同的安装,p ...