前面讲解的一个PrepareInterceptor也是继承自MethodFilterInterceptor,当时没有讲解,是因为PrepareInterceptor在defaultStack没有进行方法过滤,ParametersInterceptor拦截器在defaultStack中对方法也没有进行过滤,所以暂时也不讲放到AnnotationValidationInterceptor讲解,先把该拦截器的doIntercept方法看成是以前的intercept方法。但该拦截器配置了请求参数过滤,下面是ParametersInterceptor拦截器在defaultStack中配置的参数过滤参数:
<interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref>
@Override public String doIntercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction();//获取当前执行的Action对象 if (!(action instanceof NoParameters)) {//判断Action是否实现了NoParameters接口,实现该接口表示该Action没有任何请求参数 ActionContext ac = invocation.getInvocationContext();//获取ActionContext对象 final Map<String, Object> parameters = retrieveParameters(ac);//获取请求参数Map //省略... if (parameters != null) {//如果请求参数不为null Map<String, Object> contextMap = ac.getContextMap();//获取ActionContext内部的context Map,即OgnlContext对象 try { //省略... ValueStack stack = ac.getValueStack();//获取值栈 setParameters(action, stack, parameters);//为值栈设置参数 } finally { //省略... } } } return invocation.invoke();//调用下一个拦截器 }
protected Map<String, Object> retrieveParameters(ActionContext ac) { return ac.getParameters(); }//简单到不用解释
protected void setParameters(Object action, ValueStack stack, final Map<String, Object> parameters) { ParameterNameAware parameterNameAware = (action instanceof ParameterNameAware) ? (ParameterNameAware) action : null;//判断Action有无实现ParameterNameAware接口 Map<String, Object> params; Map<String, Object> acceptableParameters;//合法参数集合 //判断参数设置是否有序,ordered默认为false,即无序 if (ordered) { params = new TreeMap<String, Object>(getOrderedComparator());//如果有序则要获取比较器 acceptableParameters = new TreeMap<String, Object>(getOrderedComparator()); params.putAll(parameters); } else { params = new TreeMap<String, Object>(parameters); acceptableParameters = new TreeMap<String, Object>(); } //迭代请求参数 for (Map.Entry<String, Object> entry : params.entrySet()) { String name = entry.getKey(); //判断参数是否合法,如果Action实现了ParameterNameAware则acceptableName(name)返回true且parameterNameAware.acceptableParameterName(name) //也返回true该参数才是合法的;如果Action没有实现ParameterNameAware则参数是否合法由acceptableName(name)方法决定 boolean acceptableName = acceptableName(name) && (parameterNameAware == null || parameterNameAware.acceptableParameterName(name)); //如果参数合法 if (acceptableName) { acceptableParameters.put(name, entry.getValue());//把合法参数添加到合法参数集合中 } } ValueStack newStack = valueStackFactory.createValueStack(stack); //省略... for (Map.Entry<String, Object> entry : acceptableParameters.entrySet()) {//迭代合法参数 String name = entry.getKey();//参数名 Object value = entry.getValue();//参数值 try { newStack.setValue(name, value);//将该参数设置到ValueStack中 } catch (RuntimeException e) { //省略... } } //省略... //看该方法的名称是将合法参数添加到ActionContext中,但在该拦截器中,该方法为空实现,无任何代码 //该方法被声明为protected,即子类可以覆盖该方法以改变行为 addParametersToContext(ActionContext.getContext(), acceptableParameters); }
protected boolean acceptableName(String name) { //调用isAccepted与isExcluded方法判断 if (isAccepted(name) && !isExcluded(name)) { return true; } return false; }
protected boolean isAccepted(String paramName) { if (!this.acceptParams.isEmpty()) { for (Pattern pattern : acceptParams) { Matcher matcher = pattern.matcher(paramName); if (matcher.matches()) { return true; } } return false; } else return acceptedPattern.matcher(paramName).matches(); } protected boolean isExcluded(String paramName) { if (!this.excludeParams.isEmpty()) { for (Pattern pattern : excludeParams) { Matcher matcher = pattern.matcher(paramName); if (matcher.matches()) { return true; } } } return false; }
protected Comparator<String> getOrderedComparator() { return rbCollator; } static final Comparator<String> rbCollator = new Comparator<String>() { public int compare(String s1, String s2) { int l1 = 0, l2 = 0; for (int i = s1.length() - 1; i >= 0; i--) { if (s1.charAt(i) == '.') l1++;//通过循环得到请求参数key中'.'符号的个数 } for (int i = s2.length() - 1; i >= 0; i--) { if (s2.charAt(i) == '.') l2++;//通过循环得到请求参数key中'.'符号的个数 } return l1 < l2 ? -1 : (l2 < l1 ? 1 : s1.compareTo(s2)); } };