修改Request 中的数据
拦截器修改参数
今天一位网友开发中遇到一个需求,他需要在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 中的数据的更多相关文章
- sql server中如何修改视图中的数据?
sql server中如何修改视图中的数据? 我做个测试,视图的数据有标记字段时,如果是这种方式(0 as FlagState),是无法修改的 --创建视图语句 --- create view V_E ...
- (笔记)Mysql命令update set:修改表中的数据
update set命令用来修改表中的数据. update set命令格式:update 表名 set 字段=新值,… where 条件; 举例如下:mysql> update MyClass ...
- SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据(转)
在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据 insert Sale ([Name],[SaleTime] ...
- 修改MySQL中的数据
一:insert语句 1.介绍 在执行插入语句前,需要具有执行INSERT语句的INSERT权限. 2.准备环境 3.简单insert语句 4.插入多行 在这种形式中,每行的值列表用逗号分隔. 如果为 ...
- 获取 request 中 json 数据
import java.io.IOException; import javax.servlet.http.HttpServletRequest; /** * request 对象的相关操作 * @a ...
- Update 语句用于修改表中的数据。
语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
- 修改request请求参数
本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除: 但在后台程序中,一般对request的参数的操作,都是通过request的getParameter.getParameter ...
- oracle----修改表中的数据
1. 修改表中的数据:UPDATE语句: 语法: UPDTAE table_name SET column1 = value1,... [WHERE conditions] (2),无条件的更新(没有 ...
- java读取请求中body数据
java读取请求中body数据 /** * 获取request中body数据 * * @author lifq * * 2017年2月24日 下午2:29:06 * @throws IOExcepti ...
随机推荐
- PHP defined() 函数
定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语法 defined(name) 参数 描述 name 必需.规定要检查的常量的名称. ...
- web前端学习(2):开始编写HTML
在第一章中,我们初步了解了上网的过程,同时也明白了所谓网页,其本质就是主要用HTML语言所写的一份文档.相信大多数人在了解HTML文件前,最先接触的是利用"记事本"所写的文档或者是 ...
- mysql 两个时间段的差,可以是秒,天,星期,月份,年...
SELECT TIMESTAMPDIFF(SECOND, now(), "2012-11-11 00:00:00") 语法为:TIMESTAMPDIFF(unit,datetime ...
- Java泛型解析
1. 概述 在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型. 例如原先的类型List,现在在细分成List< ...
- ajax和跨域
一.简介 ajax是什么? AJAX(Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX, (异步的JavaSc ...
- Docker镜像导致centos-root根分区容量爆满
当虚拟机服务器运行Docker久了后,发现Docker的文件越来越大,某天发现此台机上的数据库访问不了了,再重启数据库等日志,提示空间不足,查看磁盘空间: root分区满载啊,前段时间还有不少空间的, ...
- 红米 Note3 (kenzo)刷入 Lineage OS
红米 Note3 (kenzo)刷入Lineage OS 的过程 详细的教程请看 Install LineageOS on kenzo 本文做一些额外的补充 0 刷机之的准备工作 如果登陆了 Goog ...
- myeclipse环境搭建
公司来了几个新人,老是在教他们环境搭建这些,每次在帮他们调试代码的时候老是不厌其烦的看着他们坐等myeclipse编译了,校验了什么的,而且在编码的时候也不使用快捷键,然后我就只能默默的坐回去了.为了 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- 为mysql数据库建立索引
前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...