`
javafan_303
  • 浏览: 958835 次
  • 性别: 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;
	}


}

 

分享到:
评论

相关推荐

    java filter打印请求返回参数

    ### Java Filter 打印请求返回参数详解 #### 一、背景与目的 在Web开发过程中,经常需要在请求处理流程中增加一些通用的功能,比如日志记录、性能监控、安全控制等。Java Servlet规范提供了Filter机制来实现这些...

    防止SQL注入和XSS攻击Filter

    - **实现细节**:这里并没有直接修改请求参数,而是通过包装器模式间接地实现了对请求参数的过滤。 ##### 2. XssHttpServletRequestWrapper类 ```java public class XssHttpServletRequestWrapper extends ...

    css-filter.js:CSS 过滤器的 js 包装器

    **CSS过滤器JS包装器详解** 在Web开发中,CSS Filter是一种强大的技术,它允许开发者对元素的视觉表现进行各种变换,例如模糊、灰度、饱和度调整等。`css-filter.js`是一个JavaScript库,旨在为CSS过滤器提供便利的...

    Filter程序开发与应用上机手册

    - 在 Filter 的 `doFilter()` 方法中,可以通过 HttpServletRequest 对象获取请求参数,并将其添加到记录信息中。 ##### 案例二:用Filter实现登录检查和访问权限控制 **案例目标:** 1. **熟悉Filter的编写和...

    struts的request包装替换的思想

    // 将包装后的请求传递给下一个过滤器或Servlet chain.doFilter(customRequest, response); } } ``` 在`CustomRequestWrapper`类中,我们可以重写HttpServletRequest的一些方法,以便在调用它们时执行额外的操作...

    java 过滤器filter防sql注入的实现代码

    // 创建RequestWrapper以包装原始请求,以便我们可以修改请求参数 RequestWrapper rw = new RequestWrapper(httpServletRequest); // 获取请求参数 String param = httpServletRequest.getQueryString(); // ...

    用Filter来解决中文表单提交问题

    为了解决这个问题,我们可以利用Java的Servlet Filter机制来创建自定义过滤器,如在本例中的`TomcatFormFilter`。 Filter是Java Servlet API中的一种机制,它允许开发者在请求到达目标Servlet或JSP之前以及响应离开...

    winform利用ffmpeg给视频添加背景乐

    5. **配置过滤器**: 设置过滤器参数,如音频混合的比例,然后连接输入流到过滤器,最后连接过滤器到输出。 6. **分配输出流**: 创建新的输出文件格式上下文,复制输入视频流,并添加经过处理的音频流。 7. **写入...

    C#采用DirectShowLib读取相机数据

    在这个示例中,我们首先获取系统上可用的相机设备,然后创建一个Filter Graph,添加相机源过滤器和渲染过滤器。`RenderStream`方法用于连接这两个过滤器,并开始数据流。`StartCapture`方法启动捕获,而`StopCapture...

    jQuery 第二课 操作包装集元素代码

    它们将相应元素或匹配选择器的元素添加到包装集中。 6. `not(expression)` 和 `filter(expression)`:这两个函数用于过滤包装集。`not()`移除匹配选择器或数组中元素的那些元素,而`filter()`则保留它们。`...

    Interceptor.doc

    - 装饰器(Decorator):提供动态的可插拔包装器,可以用于扩展或改变对象的行为。 3. **创建拦截器的基本步骤**: - 实现`Filter`接口:这是定义拦截器的基础,需要实现`doFilter()`方法。 - 调用`FilterChain`...

    JSP过滤器防止Xss漏洞的实现方法(分享).docx

    这个过滤器在请求到达业务层之前拦截它们,并使用`XssHttpServletRequestWrapper`包装原始的`HttpServletRequest`对象。 `XssHttpServletRequestWrapper`类继承自`HttpServletRequestWrapper`,它覆盖了`...

    JavaEE Filter敏感词过滤的方法实例详解

    管理员可以通过添加新方法(如`addWord()`)来动态地向列表中添加敏感词。 ```java public class WordUtils { private static List&lt;String&gt; list = new ArrayList(); static { list.add("坑货"); list.add(...

    HttpServletRequestWrapper应用(二):包装文件上传请求

    首先,`HttpServletRequestWrapper`是Servlet API中的一个抽象类,它是`HttpServletRequest`的一个包装器。它的主要作用是为原始请求提供一种装饰模式,让我们可以在不修改原始请求的情况下添加额外的功能或改变其...

    c# DirectShow打开USB相机拍照

    这个库提供了一个C#包装器,使开发者能够方便地调用DirectShow API。 接下来,我们创建一个C#项目。在Visual Studio 2012中,选择"新建项目",然后选择"C# Windows Forms应用程序"。创建项目后,将DirectShow.NET库...

    用装饰模式装饰HttpServletRequest对象

    在Servlet环境中,我们可以创建一个实现了Filter接口的类,这个类包装了HttpServletRequest,从而在不修改原始请求对象的情况下,对其进行操作,如删除空白字符。 **装饰模式结构** 装饰模式通常包含以下组件: 1. ...

    SpringMVC 学习总结

    - **包装类参数绑定**:通过一个JavaBean接收所有请求参数。 - **注解参数绑定**:使用`@RequestParam`或`@PathVariable`等注解绑定参数。 - **POJO对象参数绑定**:控制器的方法参数为POJO对象,框架会自动将...

    xssprotect防止XSS攻击源码

    首先,XSSProtect通常会采用过滤器(Filter)机制,这是Java Web开发中的一个核心概念。过滤器可以在请求被实际处理之前或之后执行一些预处理或后处理操作,例如身份验证、数据过滤等。在防止XSS攻击的情况下,过滤...

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

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

    Android使用Mina与服务器通信Demo(包括服务端)

    - **设置Filter**: 添加自定义或预定义的过滤器,例如,数据编码解码过滤器、心跳包过滤器等,以处理网络传输的数据。 - **发送/接收数据**: 通过Session对象来发送和接收数据,数据通常会被包装成IoBuffer对象...

Global site tag (gtag.js) - Google Analytics