过滤器对指定的路径不进行过滤的方法 filter exclude path struts fckeditor date datetimepicker

问题是这样的,工程中使用了struts提供的 sx:datetimepicker 这个widget,这个widget就是用来选择日期的,挺好用的就用了。另外编辑器使用fckeditor。之前使用struts的过滤器StrutsPrepareAndExecuteFilter的时候指定的url-pattern都是使用/*,也就是所有请求这个过滤器都将处理,后来发现fckeditor的上传功能经过上面过滤器时会发生错误(当然这里我们是不希望上面的过滤器对fckeditor的上传文件进行过滤操作的)。然后就把url-pattern做了修改,例如改成/struts/*,这样所有归struts处理的请求都要指定的url-pattern为/struts/*,而fckeditor则使用默认的<url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern>。这样基本上没问题,直到有一天发现<sx:datetimepicker这个widget既然显示不出来了,后来参考了<sx:head的一些说明,以及自己的推断,应该是资源没有加载进来导致无法显示,<sx:head中有设置资源是只加载一次进来以后只需要从缓存中读取,还是每次都去加载,我设置为从缓存中读取,当我把url-pattern改为/*后可以正常显示,然后再改为/struts/*后还是可以正常显示,原因就是因为后面读取资源是直接冲缓存中读取的缘故。

目前为止还是没发现这个资源如何配置的,所以没办法还是要把url-pattern恢复为/*,然后过滤器进行过滤时要把/fckeditor/editor/filemanager/connectors/*路径排除在外。最简单的方法就是我们写个过滤器,这个过滤器继承StrutsPrepareAndExecuteFilter,然后在它的doFilter中对路径进行判断,如果是/fckeditor/editor/filemanager/connectors/的则不处理,让下一个过滤器去处理这个请求。下面是简单的代码:

public class MyStrutsPrepareAndExecuteFilter extends
        StrutsPrepareAndExecuteFilter {
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        // TODO Auto-generated method stub
        String requestURI = ((HttpServletRequest) arg0).getRequestURI();
        if(requestURI != null && requestURI.contains("/fckeditor/editor/filemanager/connectors/"))           
            arg2.doFilter(arg0, arg1);       
        else
            super.doFilter(arg0, arg1, arg2);       
    }
   
}

代码很简单,只有两三行,就是获得uri,判断uri,这里web容器里的过滤器是一整串的,所以你的过滤器不过滤,但是要把请求交给下个过滤器过滤,这里需要对FilterChain做doFilter。

这个代码是写死的,如果需要灵活的就是可以在web.xml中传个初始的参数,包括所以希望不进行过滤的路径(exclude path)。然后再init函数中导入进来,最后在destroy函数中销毁掉。

你可能感兴趣的:(Date,struts,String,fckeditor,filter,Path)