Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Сервлет отрабатывает 2 или более раз

#java #servlet


Сайт написан на чистых сервлетах, никаких фреймворков не используется. При открытии
любой страницы сервлет этой страницы отрабатывает 2 или более раз.

В чем причина?



Маппинг сервлетов в аннотациях. Например, для главной страницы:

Index.java

@WebServlet(name = "index", urlPatterns = {"/index.html"})
public class Index extends AbstractServlet {

    protected static char[] page;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        doResponse(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        doResponse(request, response);
    }

    @Override
    protected void preparePage(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
        StringBuilder stringBuilder = new StringBuilder();

        ... creating page from template ...

        setPage(stringBuilder.toString().toCharArray());
    }
}




AbstractServlet.java

public abstract class AbstractServlet extends HttpServlet {

    protected char[] getPage() throws ServletException, IOException {
        return (char[]) this.getClass().getField("page").get(this.getClass());
    }

    protected void setPage(char[] page) {
        this.getClass().getField("page").set(this.getClass(), page);
    }

    protected void doResponse(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

        PrintWriter pw = response.getWriter();

        if (this.getPage() == null) {
            this.preparePage(request, response);
        }

        pw.write(this.getPage());
    }

    protected abstract void preparePage(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException;
}




Скриншот заголовков первого запроса





Скриншот заголовков второго запроса


    


Ответы

Ответ 1



Клиент указал в сообщении referrer: http://localhost/index.php, это означает что первый запрос инициировал второй (это аутентификация, либо переадресация, или иная ошибка). Теперь видно, что браузер создает второй запрос на /index.html. Но в ответе сервера нет заголовка Redirect /index.html и код ответа 200. Значит в теле ответа есть текст: Либо иные ссылки на /index.html. И судя по Accept идет запрос картинки. Если нет, приложите к вопросу "тело" первого сообщения сервера, разгадка в нем. А сервлет вполне нормально обрабатывает два разных запроса: GET(http://localhost/) GET(http://localhost/index.html)

Комментариев нет:

Отправить комментарий