ServletRequest获取不到getParameter和filter获取不到request请求中的Parameter

本文详细介绍了在处理表单数据时,由于 enctype 设置不同导致参数无法正常获取的问题,以及如何通过调整 enctype 解决此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有同事使用我上篇文章中使用的filter,过滤每一个request请求,然后根据请求中的parameter过滤有危险倾向的值,但是很神奇的事情发生了。

系统的调用顺序是:

            提交表单→filter(section1)→controller→filter(section2)→页面渲染相应。

fsection2 中的请求主要是获取页面UIROOT组件,跟本次过程没有关系。碰到的问题表现在,section1 中的filter方法:

        /**
	 * 覆盖getParameter方法,将参数名和参数值都做xss & sql过滤。
	 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
	 * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
	 */
	@Override
	public String getParameter(String name) {
		String value = super.getParameter(xssEncode(name));
		if (value != null) {
			value = xssEncode(value);
		}
		return value;
	}

无论如何实验,页面的所有参数根本在getParameter方法中都没有出现过,一个参数都获取不到,参数的值也拿不到。经过痛苦的排查,发现原因是两个系统提交表单方法的不同,然后发现是表单的enctype设置不一样。

我的系统enctype没有任何设置,也就是默认值x-www-form-urlencoded。他的系统设置为:multipart/form-data。



在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。


一、application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 
二、multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
三、text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。

form的enctype属性常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 
        当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 
        当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 
        如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 
如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。



Java中,如果你想要从POST请求获取参数并使用Servlet Filter进行处理,可以按照以下步骤操作: 1. **创建Filter**: 首先,你需要创建一个实现了`javax.servlet.Filter`接口的类。这个类通常会在`doFilter()`方法中拦截请求,并读请求参数。 ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class ParameterFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 获取POST请求参数 String paramValue = httpRequest.getParameter("yourParamName"); // 这里你可以对paramValue进行进一步处理,比如日志记录、验证等 // 继续请求处理链 chain.doFilter(request, response); } // 其他必要的Filter生命周期方法... } ``` 2. **注册Filter**: 在web.xml文件中配置你的Filter,将其添加到`<filter>`元素下,并指定`<filter-mapping>`来关联需要过滤的URL路径。 ```xml <filter> <filter-name>ParameterFilter</filter-name> <filter-class>YourParameterFilterClass</filter-class> </filter> <filter-mapping> <filter-name>ParameterFilter</filter-name> <!-- 可以选择性地指定特定资源或所有资源 --> <url-pattern>/*</url-pattern> 或 <url-pattern>/path/to/your/resource</url-pattern> </filter-mapping> ``` 3. **访问参数**: 现在,当有POST请求到达包含此Filter的应用程序,你可以通过`HttpServletRequest.getParameter()`方法获取名为"yourParamName"的参数值。 **相关问题--:** 1. 过滤器如何处理其他类型的HTTP请求(如GET)? 2. 如果参数不存在,`getParameter()`会抛出异常吗?怎么处理这种情况? 3. 我可以在Filter中如何进行参数校验或预处理?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值