Filter mapping url-pattern that excludes subdirectories

前端 未结 5 1175
遥遥无期
遥遥无期 2020-12-30 13:48

Is there any way to make a filtermapping not include subdirectories?

For example.

I have .xhtml files in my context root, and I also have a subfolder named \

5条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-30 14:12

    The solution, basically you need your own Filter class and define excluding URLs as init-param for filter

    package test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginValidationFilter implements Filter {
    
        private String loginPage = "";
        private List excludedURLs;
    
        public void init(FilterConfig filterConfig) throws ServletException {
            this.loginPage = filterConfig.getInitParameter("loginPage");
    
            String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";");
            excludedURLs = new ArrayList();
            for (int i = 0; i < excluded.length; i++) {
                excludedURLs.add(excluded[i]);
            }
        }
    
        public void destroy() {
            this.loginPage = "";
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
                ServletException {
    
            HttpServletRequest httpRequest = request instanceof HttpServletRequest ? (HttpServletRequest) request : null;
            HttpServletResponse httpResponse = response instanceof HttpServletResponse ? (HttpServletResponse) response
                    : null;
    
            if (httpRequest == null || httpResponse == null) {
                filterChain.doFilter(request, response);
                return;
            }
    
            boolean isExcludedURL = false;
            for (int i = 0; i < excludedURLs.size(); i++) {
                if (httpRequest.getRequestURL().indexOf(excludedURLs.get(i)) > -1) {
                    isExcludedURL = true;
                    break;
                }
            }
    
            if (isExcludedURL) {
                filterChain.doFilter(request, response);
            } else {
                if (UserUtil.validateUserLogin(httpRequest)) {
                    filterChain.doFilter(request, response);
                } else {
                    httpResponse.sendRedirect(httpRequest.getContextPath() + loginPage);
                }
            }
        }
    }
    

    And define the filter, mapping and exclude URLs in web.xml

    
        LoginValidationFilter
        test.LoginValidationFilter
        
            loginPage
            /login.jsp
        
        
            excludedURLs
            /admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=
        
    
    
        LoginValidationFilter
        /*
    
    

提交回复
热议问题