@WebFilter exclude url-pattern

27,966

Solution 1

The servlet API doesn't support an "exclude" URL pattern.

Your best bet is to just map on /* and compare the HttpServletRequest#getRequestURI() against the set of allowed paths.

@WebFilter("/*")
public class LoginFilter implements Filter {

    private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(
        Arrays.asList("", "/login", "/logout", "/register")));

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", ""); 

        boolean loggedIn = (session != null && session.getAttribute("Id") != null);
        boolean allowedPath = ALLOWED_PATHS.contains(path);

        if (loggedIn || allowedPath) {
            chain.doFilter(req, res);
        }
        else {
            response.sendRedirect(request.getContextPath() + "/login");
        }
    }

    // ...
}

Solution 2

You can use initParam to have some excluded patterns and implement your logic. This is basically the same as BalusC's answer except by using initParam it can be written in the web.xml if you want/need to.

Below I am ignoring some binary (jpeg jpg png pdf) extensions:

@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
    }
}
Share:
27,966

Related videos on Youtube

user2492364
Author by

user2492364

Updated on July 09, 2022

Comments

  • user2492364
    user2492364 almost 2 years

    I use a filter to check URL patterns for the logged in user.

    But I have many URL patterns I need to filter.

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

    It's becoming unmaintainable. It will be simpler just to exclude:

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

    How can I achieve this?

    @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() {
    
        }
    
    }