Nano Hash - криптовалюты, майнинг, программирование

Изменить URL-адрес ответа с фильтром перед перенаправлением сервлета (Java/Tomcat)

Я пытаюсь изменить URL-адрес ответа servlet с помощью servlet filter, прежде чем сам сервлет выдаст response.sendRedirect. Но я ничего не получаю с этим. Сначала я протестировал сервлет, а затем настроил несколько фиктивных JSP страниц, чтобы воспроизвести то же базовое поведение сервлета. Сервлет от стороннего поставщика и не может быть изменен.

Я буду придерживаться страниц JSP для этого вопроса и притворюсь, что их нельзя изменить. Если бы я мог изменить сервлет, не было бы необходимости публиковать этот вопрос.

Я также сослался на два раздела ниже, чтобы помочь мне создать фильтр.

Перенаправление запроса с использованием сервлетов и метода setHeader не работает

Ищем пример для вставки содержимого в ответ с помощью фильтра сервлета

Что происходит в сервлете/JSP, так это то, что он загружается с помощью https, а затем создает новый URL на основе текущего URL-адреса с http, добавляя querystring parameter, cacheid и перезагружая страницу, т.е.

  1. https://example.com/test/testfilter.jsp
  2. http://example.com/test/testfilter.jsp?cacheid=123456

Я хочу, чтобы это выглядело так:

  1. https://example.com/test/testfilter.jsp
  2. https://example.com/test/testfilter.jsp?cacheid=123456

Итак, моя идея состоит в том, чтобы создать фильтр, который перехватывает ответ, прежде чем сервлет/JSP выдаст response.sendRedirect, измените заголовки местоположения и статуса, и он должен работать. Но это не совсем работает.

testfilter.jsp

<%

if (request.getParameter("cacheid") == null) {
    response.sendRedirect("http:/example.com/test/testfilter.jsp?cacheid=123456");
}

%>
<html>
<head></head>
<body>Test</body>
</html>

Фильтр

Вот мой метод doFilter:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    System.out.println("BEFORE filter");

    PrintWriter out = response.getWriter();

    CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response);

    if ( ((HttpServletRequest)request).getParameter("cacheid") == null ) {
        // Not sure how to append querystring parameter
        responseWrapper.setHeader("location", "https://example.com/test/testfilter.jsp?cacheid=123456");
        responseWrapper.setStatus(HttpServletResponse.SC_FOUND);
    }       

    chain.doFilter(request, responseWrapper);

    String servletResponse = new String(responseWrapper.toString());

    out.write(servletResponse + " filtered"); // Here you can change the response

    System.out.println("AFTER filter, original response: " + servletResponse);

    if ( ((HttpServletRequest)request).getParameter("cacheid") == null ) {
        // Not sure how to append querystring parameter
        responseWrapper.setHeader("location", "https://example.com/test/testfilter.jsp?cacheid=123456");
        responseWrapper.setStatus(HttpServletResponse.SC_FOUND);
    }  
}

Незначительная проблема: я не уверен, как добавить параметр строки запроса, cacheid и его значение в этот измененный ответ.

Основная проблема заключается в том, что фильтр срабатывает только при втором вызове testfilter.jsp (с параметром строки запроса, cacheid). Вот необработанный ответ:

https://example.com/test/testfilter.jsp

HTTP/1.1 302 Moved Temporarily
Content-Length: 0
Content-Type: text/html;charset=ISO-8859-1
Location: http://example.com/test/testfilter.jsp?cacheid=123456
Server: Microsoft-IIS/7.5
Set-Cookie: JSESSIONID=66ACCD1EFF485CE820BB9E705311C31D; Path=/test; Secure
Date: Thu, 25 Aug 2016 19:18:54 GMT

http://example.com/test/testfilter.jsp?cacheid=123456

HTTP/1.1 200 OK
Content-Length: 60
Content-Type: text/html;charset=ISO-8859-1
Server: Microsoft-IIS/7.5
Set-Cookie: JSESSIONID=1342FB2D65F5568AC7EA1EF21E6FB8E4; Path=/test
Date: Thu, 25 Aug 2016 19:18:54 GMT

<html>
<head></head>
<body>Test</body>
</html> filtered

Если бы я мог просто заставить фильтр перехватывать его в первый раз, прежде чем он отправит собственное перенаправление, я был бы настроен. Но все никогда не кажется таким простым.

Надеюсь, я достаточно хорошо объяснил, в чем проблема. Любая помощь будет оценена по достоинству.

Спасибо.


  • Я застрял с той же проблемой. Вы нашли решение или обходной путь для этой проблемы? 23.11.2017

Ответы:


1

Настройте Nginx и переместите такую ​​логику в директиву Nginx proxy_redirect — это обходной путь.

26.10.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..