代码之家  ›  专栏  ›  技术社区  ›  Stefan Rasmusson

排除子目录的筛选器映射url模式

  •  7
  • Stefan Rasmusson  · 技术社区  · 14 年前

    例如。

    5 回复  |  直到 14 年前
        1
  •  18
  •   BalusC    14 年前

    这个 url-pattern 在搭配上确实有限制。它只允许精确、前缀或后缀匹配。不是中间/整体/正则表达式匹配。例如。 /*.xhtml 你想做的事行不通。

    如果要在 /test Filter 收听广播 访问路径 *.xhtml doFilter()

    // First cast ServletRequest to HttpServletRequest.
    HttpServletRequest hsr = (HttpServletRequest) request;
    
    // Check if requested resource is not in /test folder.
    if (!hsr.getServletPath().startsWith("/test/")) {
        // Not in /test folder. Do your thing here.
    }
    

    这个 HttpServletRequest#getServletPath()

    如果需要,可以配置值 /试验 作为一个 <init-param> web.xml 而不是在过滤器的代码中。

        2
  •  3
  •   Java42    10 年前

    解决方案,基本上您需要自己的Filter类,并将排除url定义为Filter的init param

    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<String> excludedURLs;
    
        public void init(FilterConfig filterConfig) throws ServletException {
            this.loginPage = filterConfig.getInitParameter("loginPage");
    
            String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";");
            excludedURLs = new ArrayList<String>();
            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);
                }
            }
        }
    }
    

    并在web.xml中定义过滤器、映射和排除URL

    <filter>
        <filter-name>LoginValidationFilter</filter-name>
        <filter-class>test.LoginValidationFilter</filter-class>
        <init-param>
            <param-name>loginPage</param-name>
            <param-value>/login.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>excludedURLs</param-name>
            <param-value>/admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>LoginValidationFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
        3
  •  0
  •   mdma    14 年前

    使用标准servlet/filters可用的方法,没有直接的方法排除子目录,因为 *.ext /test/*.xhtml 映射并相应地处理。

        4
  •  0
  •   acaruci    7 年前

    您可以为上下文根目录中的每个文件添加一个url映射值,因此筛选器将应用于这些文件,而不会应用于测试文件夹中的文件(实际上它只应用于那些特定的文件)。下面这些对我有用

    <url-pattern>/index.faces</url-pattern>
    
        5
  •  -1
  •   Gopi    14 年前

    url-regexp reference ). 看看你的容器里有没有这样的东西。