@WebFilter排除url-pattern

时间:2015-07-09 13:05:45

标签: java servlets servlet-filters url-pattern

我使用过滤器检查登录用户的URL模式。

但我需要过滤许多网址格式。

{ "/table/*", "/user/*", "/contact/*", "/run/*", "/conf/*", ..., ..., ...}

它变得不可维护。排除以下内容会更简单:

{ "/", "/login", "/logout", "/register" }

我怎样才能做到这一点?

@WebFilter(urlPatterns = { "/table/*","/user/*", "/contact/*","/run/*","/conf/*"})
public class SessionTimeoutRedirect implements Filter {

    protected final Logger logger = LoggerFactory.getLogger("SessionFilter");

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        if (request.getSession().getAttribute("Id") != null) {
            chain.doFilter(req, res);
        } else {
            logger.debug("session is null:"+request.getRequestURL());                    
            response.sendRedirect(request.getContextPath()+"/login");
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}

2 个答案:

答案 0 :(得分:25)

servlet API不支持“排除”URL模式。

您最好的选择是在var resp = ["Football", ['Football', 'Soccer'], ['FootballDescription', 'SoccerDescription'], ['http://football.com', 'http://soccer.com'] ]; // Mimic python's zip behavior -> assume arrays are of equal size function zip(arrays) { return arrays[0].map(function(_, i){ return arrays.map(function(array){ return array[i]; }); }); } // 1. Throw away the first string, e.g. "Football" resp.shift(); // 2. Use zip to make an array of intersected arrays, i.e // [ // ['Football', 'FootballDescription', 'http://football.com'], // ['Soccer', 'SoccerDescription', 'http://soccer.com'] // ] // and then use map to make each array into a nicely named object var objects = zip(resp).map(function(x) { return ({ name: x[0], desc: x[1], link: x[2] }); }); console.log(objects); /* Output: [ { name: 'Football', description: 'FootballDescription', link: 'http://football.com' }, { name: 'Soccer', description: 'SoccerDescription', link: 'http://soccer.com' } ] */ 上进行映射,并将HttpServletRequest#getRequestURI()与允许路径集进行比较。

/*

答案 1 :(得分:3)

您可以使用initParam来排除某些模式并实现您的逻辑。这与BalusC's回答基本相同,除非使用initParam,如果您需要/需要,可以在web.xml中编写。

下面我忽略了一些二进制(jpeg jpg png pdf)扩展名:

@WebFilter(urlPatterns = { "/*" },
    initParams = { @WebInitParam(name = "excludedExt", value = "jpeg jpg png pdf") }
)
public class GzipFilter implements Filter {

    private static final Set<String> excluded;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String excludedString = filterConfig.getInitParameter("excludedExt");
        if (excludedString != null) {
            excluded = Collections.unmodifiableSet(
                new HashSet<>(Arrays.asList(excludedString.split(" ", 0))));
        } else {
            excluded = Collections.<String>emptySet();
        }
    }

    boolean isExcluded(HttpServletRequest request) {
        String path = request.getRequestURI();
        String extension = path.substring(path.indexOf('.', path.lastIndexOf('/')) + 1).toLowerCase();
        return excluded.contains(extension);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.print("GzipFilter");
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        if (isExcluded(httpRequest)) {
            chain.doFilter(request, response);
            return;
        }

        // Do your stuff here
    }
}