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

有同事使用我上篇文章中使用的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)。



Spring BootFilter是一种拦截所有请求的方式,无论是GET请求还是POST请求都会被Filter拦截到。但是有时候会遇到Filter获取不到POST请求参数的情况,这时候需要检查一下请求的Content-Type是否是application/x-www-form-urlencoded。 如果Content-Type是application/x-www-form-urlencoded,则需要通过HttpServletRequest.getParameter()方法来获取请求参数。例如: ``` java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取请求参数 String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); ... // 继续处理请求 chain.doFilter(request, response); } } ``` 如果Content-Type是application/json,则需要通过读请求体来获取请求参数。例如: ``` java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取请求体 BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } // 解析JSON参数 JSONObject json = JSONObject.parseObject(sb.toString()); String param1 = json.getString("param1"); String param2 = json.getString("param2"); ... // 继续处理请求 chain.doFilter(request, response); } } ``` 总之,要根据请求的Content-Type来确定获取POST请求参数的方法,否则会导致获取不到参数的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值