目的: 改变请求参数的值,满足项目需求(如:过滤请求中 lang != zh 的请求)
方法: 1.使用 HttpServletRequestWrapper重写
代码语言:javascript复制public class ChangeRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> parameterMap; // 所有参数的Map集合
public ChangeRequestWrapper(HttpServletRequest request) {
super(request);
parameterMap = request.getParameterMap();
}
// 重写几个HttpServletRequestWrapper中的方法
/**
* 获取所有参数名
*
* @return 返回所有参数名
*/
@Override
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector<String>(parameterMap.keySet());
return vector.elements();
}
/**
* 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
*
* @param name 指定参数名
* @return 指定参数名的值
*/
@Override
public String getParameter(String name) {
String[] results = parameterMap.get(name);
return results[0];
}
/**
* 获取指定参数名的所有值的数组,如:checkbox的所有数据
* 接收数组变量 ,如checkobx类型
*/
@Override
public String[] getParameterValues(String name) {
return parameterMap.get(name);
}
@Override
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public void setParameterMap(Map<String, String[]> parameterMap) {
this.parameterMap = parameterMap;
}
}
代码语言:javascript复制 2.新增Filter
代码语言:javascript复制public class LangFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
String[] strings = parameterMap.get("lang");
//逻辑代码给定默认的参数值,如果参数不为中文,则直接返回异常
if (strings == null || strings.length == 0) {
strings = new String[1];
strings[0] = "zh";
parameterMap.put("lang", strings);
changeRequestWrapper.setParameterMap(parameterMap);
}else{
String language = strings[0];
if (!language.equals("zh")) {
Map<String,String> error = new HashMap<>();
error.put("code","500");
ServletOutputStream outputStream = null;
try {
outputStream = servletResponse.getOutputStream();
outputStream.write(JSONUtils.obj2Byte(error));
} finally {
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
}
return;
}
}
//使用复写后的wrapper
filterChain.doFilter(changeRequestWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
3.web.xml增加一个过滤器处理
代码语言:javascript复制<filter>
<filter-name>languageFilter</filter-name>
<filter-class>com.intercepor.LangFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>languageFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
所有.do的请求,都会验证此参数