java 过滤http请求头_JAVAWEB开发实现对请求头、请求参数的过滤
1、服務(wù)器容器取得客戶端發(fā)送的參數(shù)都是通過HttpServletRequest來獲取的,HttpServletRequest存在如下三種獲取參數(shù)的方法:
getParameter(name),返回單個(gè)值。
getParameterValues(name),返回一個(gè)數(shù)組。
getParameterMap(),把客戶端提交參數(shù)封裝為一個(gè)Map返回。K:name,V:value。
當(dāng)我們使用servlet的時(shí)候一般都是使用前兩種,struts1使用的第2種,struts2(xwork)則使用的第3種 。
2、 根據(jù)JavaEE servlet2.5規(guī)范要求,ServletRequest.getParameterMap()需返回一個(gè)immutable(不可改變)的java.util.Map實(shí)現(xiàn),tomcat在這方面沒有嚴(yán)格遵照規(guī)范,而weblogic嚴(yán)格遵照規(guī)范。JavaEE規(guī)范之所以這樣要求,是出于“安全因素”的考慮。規(guī)范描述如下:
public java.util.Map getParameterMap()
Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
3、對 2 中描述的情況進(jìn)行代碼調(diào)整,已在tomcat、weblogic下驗(yàn)證過,其中包括:請求裝飾類、過濾器、web.xml下配置過濾器:
請求裝飾類:JzHttpServletRequest
package com.juno.fw.wrapper;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang3.StringUtils;
/**
* 使用裝飾模塊模式(Decorator)包裝HttpServletRequest對象,實(shí)現(xiàn)請求頭、請求參數(shù)的特定字符轉(zhuǎn)義功能。
*
* @author Juno
* @since 1.6
* @version 1.0
* @date 2016.04.14
* @date Juno update at 2016.12.05
*/
public class JnHttpServletRequest extends HttpServletRequestWrapper {
public HttpServletRequest request;
public Map params = new HashMap();
public JnHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
// 創(chuàng)建對象時(shí),將immutable請求對象MAP復(fù)制到本實(shí)例的內(nèi)部對象params中
// 通過過濾params以實(shí)現(xiàn)過慮請求參數(shù)的特定字符
this.params.putAll(request.getParameterMap());
}
@Override
public String getHeader(String name) {
String value = this.request.getHeader(name);
if (value == null) {
return null;
}
return filterDatas(value);
// return super.getHeader(name);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value == null) {
return null;
}
return filterDatas(value);
// return super.getParameter(name);
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = filterDatas(values[i]);
}
}
return values;
// return super.getParameterValues(name);
}
/*
* STRUTS2調(diào)用此方法獲取請求參數(shù)
*
* WEBLOGIC下不允許修改request.getParameterMap()返回的MAP對象
*
*
* @see javax.servlet.ServletRequestWrapper#getParameterMap()
*/
@Override
public Map getParameterMap() {
// HashMap paramMap = (HashMap) super.getParameterMap();
for (Iterator> iterator = params.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry entry = (Map.Entry) iterator.next();
String[] values = (String[]) entry.getValue();
for (int i = 0; i < values.length; i++) {
if (values[i] instanceof String) {
values[i] = filterDatas(values[i]);
}
}
entry.setValue(values);
}
return params;
// super.getParameterMap();
}
/**
* 過濾參數(shù)內(nèi)容中的敏感字符
*
* @param input 被過濾字符串
* @return
* @author Juno add at 2016.09.05.
* @author Juno update at 2016.12.05.
*/
private String filterDatas(String input) {
if (StringUtils.isBlank(input)) {
return "";
}
// 過濾敏感字符
return input.replaceAll("\\s+\'|\'\\s+|\\s+\"|\"\\s+||(?i)\\s+or\\s+|(?i)\\s+and\\s+|(?i)exec\\s+|(?i)insert\\s+|(?i)select\\s+|(?i)delete\\s+|(?i)update\\s+|(?i)count\\s+|(?i)chr\\s+|(?i)mid\\s+|(?i)master\\s+|(?i)truncate\\s+|(?i)char\\s+|(?i)declare\\s+|(?i)script\\s+|(?i)frame\\s+|(?i)etc\\s+|(?i)style\\s+|(?i)expression\\s+", "");
}
}
過濾器類:
package com.jz.org.filter;
import java.io.IOException;
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 com.jz.org.wrapper.JzHttpServletRequest;
/**
* HTTP請求頭、請求參數(shù)等的轉(zhuǎn)義過濾器
*
* @author Juno
* @since 1.6
* @version 1.0
* @date Juno add at 2016.04.14
*/
public class JzServletRequestFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
JzHttpServletRequest jzHttpServletRequest = new JzHttpServletRequest(httpServletRequest);
chain.doFilter(jzHttpServletRequest, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}
過濾器配置:
JzServletRequestFilter
com.jz.org.filter.JzServletRequestFilter
JzServletRequestFilter
/*
總結(jié)
以上是生活随笔為你收集整理的java 过滤http请求头_JAVAWEB开发实现对请求头、请求参数的过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 码农故事2——岁前落脚得安定 年后求职寻
- 下一篇: 网络综合测试仪 都具备什么功能