客户端服务器请求过滤



我有大约90个菜单,每个菜单至少有4个代表Crud动作的屏幕。其中,有13个菜单具有波罗的海角色支持&其他人没有。但是,在这87个菜单中,仍然有很多用户的输入波罗的海角色在后端填充了垃圾数据。BE是一个不同的团队,他们无法容纳ATM的更改,因此我必须在前端处理。

我正在寻找一个通用解决方案,所以我只是写一个方法&在其他任何地方重复使用。

我决定的通用解决方案是迭代请求bean对象&通过反思迭代其方法&检查每个值的波罗的海字符。

我拥有的另一个解决方案是迭代httpservlet请求参数&检查它们是否存在波罗的海角色。

我使用的是Struts2和Java 7.我想知道以上两个选项中的哪个更好。我知道反思带有表演警告。但是我觉得这是一种更好的方法,然后httpservlet请求参数。

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

编辑:对于某些菜单,在我们的应用程序中,我们使用了JSP-Servlet架构,也需要在此类菜单中实现同样的菜单。

不确定"请求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 ERA(,但是应该足以让您完成。

最新更新