interceptor中 HttpServletRequestWrapper

【已解决】

使用注解的形式对参数值进行解密,通过拦截的方式修改request的参数值 继承HttpServletRequestWrapper 重写getParameter和getParameterMap 对值进行修改 debug模式下无法进入这两个方法

public class SecurityInterceptor implements Interceptor {

	@Override
	public void intercept(Invocation inv) {
		SecurityParameter parameter = inv.getMethod().getAnnotation(SecurityParameter.class);
		Controller c = inv.getController();
		HttpServletRequest request= c.getRequest();
		CustomWrapper customWrapper = null;
		if(parameter!=null){
			if(parameter.inDecode()){
				customWrapper = new CustomWrapper(request,new HashMap<String, Object>(inv.getController().getParaMap()),parameter.encrpet());
				c.setHttpServletRequest(customWrapper);				
			}
		}
		inv.invoke();
	}
}
这是CustomWrapper继承HttpServletRequestWrapper

        /***
           解决办法:
	 * 重写getParameterValues 对参数的值进行修改
	 */
	@Override
	public String[] getParameterValues(String name) {
		String[] value= pMap.get(name);
		if(null==value){
			return null;
		}
		value = new String[]{format(value[0], encrpet)};
		return value;
	}
	/**
	 * 重写getParameterMap
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Map<String, String[]> getParameterMap() {
		HashMap<String, String[]> paramMap = (HashMap<String, String[]>) super.getParameterMap();
		paramMap = (HashMap<String, String[]>) paramMap.clone();
		for (Iterator<?> iterator = paramMap.entrySet().iterator(); iterator.hasNext();) {
			Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
			String[] values = entry.getValue();
			for (int i = 0; i < values.length; i++) {
				if (values[i] instanceof String) {
					values[i] = format(values[i], encrpet);
				}
			}
			entry.setValue(values);
		}
		return paramMap;
	}

评论区

邓小杰

2019-07-10 17:32

JFinal

2019-07-10 18:02

看一下控制台输出的 jfinal action report, 看看被请求的 url、 controller、interceptor 等等信息是不是正确

邓小杰

2019-07-11 08:59

@JFinal 波总,我试着用自定义Filter可以拦截的 但是我的注解就无效了 继承HttpServletRequestWrapper重写的那两个方法还是进不去 控制台信息没什么错误

邓小杰

2019-07-11 10:12

@JFinal 波总 我解决了, 重写getParameterValues 就可以对值进行处理了

JFinal

2019-07-11 21:42

@邓小杰 解决就好,能回来再反馈更好,能帮到碰到同样问题的同学

邓小杰

2019-07-12 09:51

@JFinal 谢谢波总