工作中,想在controller接收参数前修改入参值,比如前端将部分参数加密,我想在controller接收参数前解密然后将字段重新赋值,下面代码可以帮你实现。
@Component
@WebFilter(filterName="handleFilter",urlPatterns="/*")
public class HandleFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ModifyParametersWrapper mParametersWrapper = new ModifyParametersWrapper(request);
filterChain.doFilter(mParametersWrapper, response);
}
}
public class ModifyParametersWrapper extends HttpServletRequestWrapper{
private Map parameterMap; // 所有参数的Map集合
public ModifyParametersWrapper(HttpServletRequest request) {
super(request);
parameterMap = request.getParameterMap();
}
/**
* 获取所有参数名
* @return 返回所有参数名
*/
@Override
public Enumeration getParameterNames() {
Vector vector = new Vector(parameterMap.keySet());
return vector.elements();
}
/**
* 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
* @param name
* 指定参数名
* @return 指定参数名的值
*/
@Override
public String getParameter(String name) {
String[] results = parameterMap.get(name);
if (results == null || results.length <= 0)
return null;
else {
return results[0];
}
}
/**
* 获取指定参数名的所有值的数组,如:checkbox的所有数据
* 接收数组变量 ,如checkobx类型
*/
@Override
public String[] getParameterValues(String name) {
String[] results = parameterMap.get(name);
if (results == null || results.length <= 0)
return null;
else {
int length = results.length;
if (needDecrpty()) {
for (int i = 0; i < length; i++) {
results[i] = decrpty(results[i]);
}
}
return results;
}
}
/**
* 是否需要解密
* @return
*/
private boolean needDecrpty() {
String[] needDecrpty = parameterMap.get("needDecrpty");
if (needDecrpty == null || needDecrpty.length == 0) {
return false;
} else {
if ("true".equals(needDecrpty[0])) {
return true;
}
}
return false;
}
/**
* 解密操作
* @return
*/
private String decrpty(String oldValue) {
return oldValue+"已解密";
}
}