URL-шаблон отображения фильтра, исключающий подкаталоги - PullRequest
7 голосов
/ 12 августа 2010

Есть ли способ сделать так, чтобы отображение фильтра не включало подкаталоги?

Например.

У меня есть файлы .xhtml в корне контекста, и у меня также есть подпапка с именем "test"с файлами с таким же расширением.Можно ли сопоставить фильтр файлам в корневом каталоге контекста, а не файлам в каталоге «test»?

Ответы [ 5 ]

18 голосов
/ 12 августа 2010

url-pattern действительно ограничивает соответствие. Это позволяет только точное, префиксное или суффиксное совпадение. Не соответствует среднему / общему / регулярному выражению. Так, например /*.xhtml то, что вы намереваетесь сделать, не сработает.

Если вы хотите исключить XHTML только в папке /test, тогда лучше всего будет Filter прослушивание url-pattern из *.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() в основном возвращает часть URI запроса из пути к контексту.

При необходимости вы можете настроить значение /test как <init-param> фильтра, чтобы вы могли управлять значением изнутри web.xml вместо кода фильтра.

3 голосов
/ 20 января 2014

Решение, в основном вам нужен собственный класс Filter, и вы определяете исключающие URL-адреса как 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);
            }
        }
    }
}

И определяете фильтр, сопоставляете и исключаете URL-адреса в web.xml

<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>
0 голосов
/ 17 ноября 2017

Вы можете добавить значение отображения URL для каждого файла, который у вас есть в корневом каталоге контекста, поэтому фильтр будет применяться к этим файлам, но не к файлам в тестовой папке (на самом деле он будет применяться только к этим конкретным файлам).Следующее сработало у меня

<url-pattern>/index.faces</url-pattern>
0 голосов
/ 12 августа 2010

Используя то, что доступно для стандартных сервлетов / фильтров, нет прямого способа исключить подкаталог, так как отображения стиля *.ext включают в себя подкаталоги.Вы можете обойти это, объявив другой фильтр, который специально обрабатывает отображение /test/*.xhtml и обрабатывает его соответственно.

0 голосов
/ 12 августа 2010

Некоторые контейнеры (например, смола) определяют расширение для определения отображения фильтра в web.xml, которое позволяет указать url-regexp, что позволяет сопоставлять URL-адреса на основе регулярного выражения. ( ссылка ). Посмотрите, есть ли в вашем контейнере что-то подобное.

...