Я пытаюсь изменить URL-адрес ответа servlet
с помощью servlet filter
, прежде чем сам сервлет выдаст response.sendRedirect
. Но я ничего не получаю с этим. Сначала я протестировал сервлет, а затем настроил несколько фиктивных JSP
страниц, чтобы воспроизвести то же базовое поведение сервлета. Сервлет от стороннего поставщика и не может быть изменен.
Я буду придерживаться страниц JSP для этого вопроса и притворюсь, что их нельзя изменить. Если бы я мог изменить сервлет, не было бы необходимости публиковать этот вопрос.
Я также сослался на два раздела ниже, чтобы помочь мне создать фильтр.
Перенаправление запроса с использованием сервлетов и метода setHeader не работает
Ищем пример для вставки содержимого в ответ с помощью фильтра сервлета
Что происходит в сервлете/JSP, так это то, что он загружается с помощью https
, а затем создает новый URL
на основе текущего URL-адреса с http
, добавляя querystring parameter
, cacheid и перезагружая страницу, т.е.
Я хочу, чтобы это выглядело так:
Итак, моя идея состоит в том, чтобы создать фильтр, который перехватывает ответ, прежде чем сервлет/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
Если бы я мог просто заставить фильтр перехватывать его в первый раз, прежде чем он отправит собственное перенаправление, я был бы настроен. Но все никогда не кажется таким простым.
Надеюсь, я достаточно хорошо объяснил, в чем проблема. Любая помощь будет оценена по достоинству.
Спасибо.