使用HttpServletRequestWrapper在filter修改request参数
处理过程:
(1)页面提交请求“/sa?userid=123456789&username=rensanning”
(2)通过Filter处理加入新参数“name=newname”
(3)sa的Servlet中forward到“/sb?myname=rensanning&mycountry=china”
(4)sb的Servlet中生成页面输出所有参数:userid、username、myname、mycountry、name
第一步:
最简单,在页面上先输出一个href为改地址的链接即可。
<a href="<%=request.getContextPath()%>/sa?userid=123456789&username=rensanning">Click me!!!</a>
<filter-mapping><filter-name>ParameterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Map<String,String[]> m = new HashMap<String,String[]>(req.getParameterMap());m.put("name", new String[]{"newname"});req = new ParameterRequestWrapper((HttpServletRequest)req, m);chain.doFilter(req, res);
class ParameterRequestWrapper extends HttpServletRequestWrapper {private Map<String, String[]> params;public ParameterRequestWrapper(HttpServletRequest request,Map<String, String[]> newParams) {super(request);this.params = newParams;}@Overridepublic String getParameter(String name) {String result = "";Object v = params.get(name);if (v == null) {result = null;} else if (v instanceof String[]) {String[] strArr = (String[]) v;if (strArr.length > 0) {result = strArr[0];} else {result = null;}} else if (v instanceof String) {result = (String) v;} else {result = v.toString();}return result;}@Overridepublic Map getParameterMap() {return params;}@Overridepublic Enumeration getParameterNames() {return new Vector(params.keySet()).elements();}@Overridepublic String[] getParameterValues(String name) {String[] result = null;Object v = params.get(name);if (v == null) {result = null;} else if (v instanceof String[]) {result = (String[]) v;} else if (v instanceof String) {result = new String[] { (String) v };} else {result = new String[] { v.toString() };}return result;}}
RequestDispatcher rd = getServletContext().getRequestDispatcher("/sb?myname=rensanning&mycountry=china");rd.forward(request, response);
<filter-mapping><filter-name>ParameterFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>
class ParameterRequestWrapper extends HttpServletRequestWrapper {private Map<String, String[]> params;public ParameterRequestWrapper(HttpServletRequest request,Map<String, String[]> newParams) {super(request);this.params = newParams;// RequestDispatcher.forward parameterrenewParameterMap(request);}@Overridepublic String getParameter(String name) {String result = "";Object v = params.get(name);if (v == null) {result = null;} else if (v instanceof String[]) {String[] strArr = (String[]) v;if (strArr.length > 0) {result = strArr[0];} else {result = null;}} else if (v instanceof String) {result = (String) v;} else {result = v.toString();}return result;}@Overridepublic Map getParameterMap() {return params;}@Overridepublic Enumeration getParameterNames() {return new Vector(params.keySet()).elements();}@Overridepublic String[] getParameterValues(String name) {String[] result = null;Object v = params.get(name);if (v == null) {result = null;} else if (v instanceof String[]) {result = (String[]) v;} else if (v instanceof String) {result = new String[] { (String) v };} else {result = new String[] { v.toString() };}return result;}private void renewParameterMap(HttpServletRequest req) {String queryString = req.getQueryString();if (queryString != null && queryString.trim().length() > 0) {String[] params = queryString.split("&");for (int i = 0; i < params.length; i++) {int splitIndex = params[i].indexOf("=");if (splitIndex == -1) {continue;}String key = params[i].substring(0, splitIndex);if (!this.params.containsKey(key)) {if (splitIndex < params[i].length()) {String value = params[i].substring(splitIndex + 1);this.params.put(key, new String[] { value });}}}}}}