Springboot Jersey - Пользовательский фильтр с ServletProperties.FILTER_STATIC_CONTENT_REGEX - PullRequest
0 голосов
/ 10 июня 2019

У меня есть приложение Springboot, работающее со строкой конфигурации в Джерси property(ServletProperties.FILTER_STATIC_CONTENT_REGEX, "/mywebpage/.*"), чтобы включить рендеринг статического содержимого html / js / css / image ... для этого конкретного префикса пути. Все в порядке, и mywebpage отлично загружается на /mywebpage/index.html.

Теперь, после запуска mywebpage в течение нескольких месяцев, мы хотим перенаправить процент пользователей (включенных для бета-тестирования) на новую веб-страницу (скажем, https://stackoverflow.com/). Так что я пытаюсь написать Filter для пути /mywebpage/index.html для перенаправления пользователя на новую страницу, если он включен для бета-версии. Теперь часть, которая поставила меня в тупик, заключается в том, что по какой-то причине никакие фильтры не вызываются для каких-либо вызовов /mywebpage/.* ( вызовы, сделанные браузером для получения содержимого html / js / css / ...) (проверяется с помощью точек останова и фиктивных журналов). Я предполагаю, что подозрительным будет свойство ServletProperties.FILTER_STATIC_CONTENT_REGEX.

У меня уже есть бит, чтобы вычислить, включена ли у пользователя бета-версия, и мне просто нужно вставить его в Filter.

Вот что я пытался:

@Provider
public class RedirectionFilter implements ContainerRequestFilter {

    @Autowired
    private BetaAudienceService betaAudienceService;

    @Context
    private UriInfo info;

    private static final Logger log = LogManager.getLogger(getClass());

    @Override
    public void filter(ContainerRequestContext request) throws IOException {
        log.info("Test Log :: Path=" + request.getUriInfo().getAbsolutePath().getPath());
        if (request.getUriInfo().getAbsolutePath().getPath().equals("/mywebpage/index.html") && isBetaEnabled(request)) {
            try {
                request.abortWith(Response.temporaryRedirect(new URI("https://stackoverflow.com/")).build());
            } catch (URISyntaxException e) {
                throw new IOException("Failed to build or respond with Redirection URI", e);
            }
        }
    }

    private boolean isBetaEnabled(ContainerRequestContext request) { ... }
}

и

public class JerseyConfig extends ResourceConfig {

    @Autowired
    private ApplicationContext appCtx;

    @PostConstruct
    public void setup() {
        register(A.class);
        register(B.class);
        ...
    }

    public JerseyConfig() {
        property(ServletProperties.FILTER_STATIC_CONTENT_REGEX, Constants.STATIC_CONTENT_PATH);
    }
}

Любые предложения о том, как я могу обойти это? Или, возможно, мой подход вообще неверен?

1 Ответ

0 голосов
/ 11 июня 2019

Я смог понять это.

В этом случае для Джерси задано значение Filter (поскольку нам нужно использовать ServletProperties.FILTER_STATIC_CONTENT_REGEX), а Джерси обрабатывает все запросы на обслуживание, кроме определенных путей /mywebpage/*, где Джерси настроен на игнорирование запроса. из-за свойства фильтра статического содержимого. Следовательно, эти пропущенные / отфильтрованные запросы обрабатываются Springboot напрямую, что означает, что мы можем просто использовать Springboot filter.

Вот код для фильтра:

public class RedirectionFilter extends OncePerRequestFilter /* can also just `implements Filter` instead */ {

    public static final String REDIRECT_PATH = "/mywebpage/index.html";
    private static final Logger log = LogManager.getLogger(RedirectionFilter.class);
    private final MyConfig myConfig;

    public UnifiedShellRedirectionFilter(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        log.info("Test Log :: Path: " + request.getPathInfo());
        if (isBetaEnabled(request)) {
            response.sendRedirect(myConfig.getRedirectionEndpoint() /* "https://stackoverflow.com/" */);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        log.info("Destructing Filter: " + this.getClass().getSimpleName());
    }

    private boolean isBetaEnabled(HttpServletRequest request) { ... }
}

И поместите в свой класс @Configuration следующее:

    @Bean
//    @Autowired
    public FilterRegistrationBean registerRedirectionFilter(MyConfig myConfig) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setName(RedirectionFilter.class.getSimpleName());
        registrationBean.setFilter(new UnifiedShellRedirectionFilter(myConfig));
        registrationBean.addUrlPatterns(RedirectionFilter.REDIRECT_PATH);
        return registrationBean;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...