采用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;
	}


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值