`
javafan_303
  • 浏览: 949895 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

采用filter包装器动态的添加参数

 
阅读更多

背景:需要动态的给url添加一些参数,需要重写httprequest包装器

由于servlet的参数map不可写,直接在map中添加参数会报如下错误

java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap

 因此需要重新new一下这个ParameterMap

Map<String, String[]> map = new HashMap(super.getParameterMap());
		map.put("path", new String[]{"teacher"});
		if (map != null) {
			// 遍历转换字符
			for (String[] values : map.values()) {
				for (String value : values) {
					value = convertCharacter(value);
				}
			}

		}

 重新new之后就可以任意在请求参数中加东西了。

 完整的代码如下,动态的给请求参数中添加一个path的参数

/**
 * File Name:CharacterFilter.java
 * Package Name:org.springframework.filter
 * Date:2016年11月12日上午11:33:54
 * Function: 动态添加参数给包装器 <br/>
 * Copyright (c) 2016, 北京大生知行科技有限公司.
 *
 */
package org.springframework.filter;

/**
 * ClassName: WrapperFilter <br/>
 * Function:采用filter动态的添加参数 <br/>
 * date: 2016年11月12日 上午11:33:54 <br/>
 * @author cailin
 * @version 

 */
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

public class WrapperFilter implements Filter {
	@Override
	public void init(FilterConfig fConfig) throws ServletException {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		req.setCharacterEncoding("utf-8");// 解决request乱码
		resp.setContentType("text/html;charset=utf-8"); // 解决response乱码
		if ("get".equalsIgnoreCase(request.getMethod())) {
			WrapperServlet wapperServlet = new WrapperServlet(request); // 使用包装的request
			request = wapperServlet;
			chain.doFilter(request, response);// 放行
			return;
		}
		doFilter(request, response, chain);
	}

	@Override
	public void destroy() {
	}
}

/**
 * 
 * ClassName: WrapperServlet <br/>
 * Function:包装器Servlet <br/>
 * Reason:动态的添加请求参数给servlet对象<br/>
 * date: 2016年11月12日 下午12:12:17 <br/>
 * @author cailin
 */
class WrapperServlet<E> extends HttpServletRequestWrapper {
	public WrapperServlet(HttpServletRequest request) {
		super(request);
	}


	@SuppressWarnings("finally")
	private String convertCharacter(String value) {
		String resultValue = value;
		try {
			resultValue = new String(value.getBytes("ISO-8859-1"), "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} finally {
			return resultValue;
		}
	}

	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);// 调用被包装对象的方法
		if (value != null) {
			value = convertCharacter(value);// 转换字符
		}
		return value;
	}

	@Override
	public Map<String, String[]> getParameterMap() {
		//Map<String, String[]> map = super.getParameterMap();
		//必须重写这个map才可以
		Map<String, String[]> map = new HashMap(super.getParameterMap());
		map.put("path", new String[]{"teacher"});
		if (map != null) {
			// 遍历转换字符
			for (String[] values : map.values()) {
				for (String value : values) {
					value = convertCharacter(value);
				}
			}

		}
		return map;
	}

	@Override
	public String[] getParameterValues(String name) {
		String[] values = super.getParameterValues(name);
		if (values != null) {
			// 遍历转换字符
			for (String value : values) {
				value = convertCharacter(value);
			}
		}
		return values;
	}


}

 

分享到:
评论

相关推荐

    sample-zuul-filters:用于Spring Cloud Netflix的自定义Zuul 1过滤器的示例

    Zuul过滤器样本 运行3个应用程序类作为spring boot应用程序。 ZuulGatewayApplication :在端口8080上... PrefixRequestEntityFilter :通过使用请求包装器和RequestContext.setRequest()将前缀添加到请求主体。 仅在

    HttpClient以及获取页面内容应用

    3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。 3.调用HttpClient...

    C++网络爬虫项目

    2.4.3. 超文本传输协议响应包头过滤器插件(HeaderFilter) 根据配置文件的ACCEPT_TYPE配置项,对超文本传输协议响应的内容类型进行 限制。 2.4.4. 超文本标记语言文件存储插件(SaveHTMLToFile) 将用超文本标记语言...

    python入门到高级全栈工程师培训 第3期 附课件代码

    12 函数闭包带参数装饰器 第21章 01 查询功能 02 修改功能 03 程序的解耦 04 module模块和包的介绍 05 模块的执行以及__name__ 06 关于模块的介绍 07 time时间模块 08 random模块 第22章 01 模块的补充 02 sys...

    git-2.22.0-2019-06-07更新.rar

    过滤器规范“--filter = sparse:path = ”用于 创建一个惰性/部分克隆已被删除。使用blob 仍支持稀疏规范的项目的一部分 “--filter = sparse:oid = ”选项。 用户界面,工作流程和功能 *“git checkout --...

    kalmanrs:Rust中一个(至今)全面的卡尔曼滤波器库

    kalmanrs的设计必须为两个结构(包括kalmanrs的Kalman滤波器, LinearKalman和KalmanState创建一个包装器。 允许尺寸通用的是宏kalmanrs提供的lkf_builder ; 它为您的卡尔曼滤波器实现了预测和更新方法。 一个不...

    jQuery详细教程

    当我们在教程中演示 jQuery 时,会将函数直接添加到 &lt;head&gt; 部分中。不过,把它们放到一个单独的文件中会更好,就像这样(通过 src 属性来引用文件): 实例 &lt;script type="text/javascript" src="jquery.js"&gt;&lt;/...

    jQuery完全实例.rar

    根据提供的原始 HTML 标记字符串,动态创建由 jQuery 对象包装的 DOM 元素。 你可以传递一个手写的 HTML 字符串,或者由某些模板引擎或插件创建的字符串,也可以是通过 AJAX 加载过来的字符串。但是在你创建 input ...

    新版Android开发教程.rar

    包装盒内附 数据工具包。 更多信息 https://sites.google.com/a/android.com/opensource/release-features Android Android Android Android 盈利模式 Android 的 App Market 模式,软件开发者获得 7 成收入, 3 成...

    Java™ Servlet 规范.

    1.6.1 监听器(Listener)顺序 ...............................................................................................................14 1.6.2 注解处理 .............................................

    Servlet3.1规范(最终版) PDF

    1.6.1 监听器(Listener)顺序 ...............................................................................................................14 1.6.2 注解处理 ...............................................

Global site tag (gtag.js) - Google Analytics