客户端服务器请求过滤

时间:2019-05-09 14:35:21

标签: java struts2

我有大约90个菜单,每个菜单至少有4个代表CRUD动作的屏幕。在这些菜单中,有13个菜单具有波罗的海字符支持,而其他菜单则没有。但是在这87个菜单中,仍然有大量用户输入波罗的海字符,这是由于在后端填充了垃圾数据。 BE是一个不同的团队,他们无法适应atm的更改,因此我必须在前端处理它。

我正在寻找一种通用的解决方案,所以我只写一种方法并在其他地方重用。

我决定的通用解决方案是迭代请求bean对象,并通过反射遍历其方法,并检查每个值是否包含波罗的海字符。

我的另一个解决方案是迭代HttpServlet请求参数并检查它们是否存在波罗的字符。

我正在使用Struts2和Java7。我想知道以上两个选项中的哪一个更好。我知道,反思伴随着性能警告。但是我觉得它比httpservlet请求参数更好。

如果还有其他解决方案,请要求您分享您的想法/建议。

编辑: 对于某些菜单,在我们的应用程序中,我们使用了jsp-servlet体系结构,同样需要在这些类型的菜单中实现相同的功能。

1 个答案:

答案 0 :(得分:0)

不确定“请求bean”指的是什么。

无论如何,拦截器可能是最好的选择,因为您可以访问参数映射。如果您的实际参数嵌套在没有类似地图访问权限的Bean中,则仍然需要进行反映。

这是我将S2视为Web和业务逻辑之间的薄层的原因之一:我倾向于不对发送给业务逻辑的内容进行预优化,这样我就可以在Web级别为诸如以下情况提供过滤这(例如,空白修剪过滤器可能适用于整个应用程序)。

修剪拦截器大致如下(从Struts 2.1开始):

public class TrimInterceptor extends MethodFilterInterceptor {

    private List<String> excluded = new ArrayList<String>();

    protected String doIntercept(ActionInvocation invocation) throws Exception {
        Map<String, Object> parameters = invocation.getInvocationContext().getParameters();

        for (String param : parameters.keySet()) {
            if (isIncluded(param)) {
                String[] vals = (String[]) parameters.get(param);
                for (int i = 0; i < vals.length; i++) {
                    vals[i] = vals[i].trim();
                }
            }
        }

        return invocation.invoke();
    }

    private boolean isIncluded(String param) {
        for (String exclude : excluded) {
            if (param.startsWith(exclude)) {
                return false;
            }
        }

        return true;
    }

    public void setExcludedParams(String excludedParams) {
        for (String s : StringUtils.split(excludedParams, ",")) {
            excluded.add(s.trim());
        }
    }
}

那里有一些其他代码,但是您主要要寻找的是我们在哪里获得参数值:

String[] vals = (String[]) parameters.get(param);

如果它是波罗的海,则您需要执行所有操作,然后将其设置回值:

vals[i] = vals[i].trim();

这里是修剪空白,但是您知道了。

现在可能会有一些区别(这是从Struts 2.1时代开始的),但这足以使您顺利通过。