Почему фильтр проверяет включенные файлы * .js? - PullRequest
0 голосов
/ 15 марта 2012

В моем веб-приложении (Apache Tomcat 7, JSP, Servlet) я использую фильтр.В методе doChain я поместил следующий код:


public void doFilter(ServletRequest request, ServletResponse response, 
                    FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        System.out.println(req.getServletPath());

//... until doFilter
}

Теперь я не могу понять, почему иногда в консоли я печатал путь к файлам JavaScript, которые включены в JSP (любой *файл .js).Это не происходит с файлами * .css, только с файлами * .js.Более того, файлы * .js не печатаются каждый раз, когда я получаю доступ к сервлету.Мне показалось, что это напечатано случайно.

Кто-нибудь объяснил это?Почему это происходит случайным образом?

Спасибо.

РЕДАКТИРОВАТЬ: На самом деле это происходит и с * .png файлами.Но, учитывая случайный характер этой проблемы, можно вести себя так же и с другими файлами (включая CSS).

Примечание:

  1. Я пытаюсь сделать аутентификацию на основепуть страницы, поэтому я пытаюсь это сделать.Проблема в том, что я не хочу принимать во внимание страницы * .js.
  2. Если вы хотите какой-то код, дайте мне знать.

ОБНОВЛЕНО

Общий код в сервлете:

</p>

<p>@WebServlet("/site/network")
public class NetworkSettingsServlet extends HttpServlet {</p>

<p>protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {</p>

<pre><code>    //... business logic goes here

    request.getRequestDispatcher("/site/network/network_view.jsp").forward(
            request, response);
    //TODO log this authentication
}

}

И код network_view.jsp:



<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@include file="/site/fragments/lang.jspf"%>
<fmt:setLocale value="${siteLanguage}" />
<fmt:setBundle basename="i18n.network.network" var="networkBundle" />
<fmt:setBundle basename="i18n.home.home" var="homeBundle" />

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="/netnfork/stylesheets/commons.css" />
<script type="text/javascript" src="/netnfork/site/scripts/network/network_scripts.js"></script>
<title><fmt:message key="common_title" bundle="${homeBundle}" /></title>
</head>
<html>

html code here

</html>

Это шаблон в моем коде.

Ответы [ 2 ]

1 голос
/ 15 марта 2012

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

Если вы действительно настаиваете на том, что все эти ресурсы должны загружаться с сервера при каждом отдельном запросе, то вам нужно расширить фильтр, добавив заголовки ответа, который указывает браузеру , а не * 1008. * кэшируйте эти ответы.

HttpSerlvetResponse res = (HttpServletResponse) response;
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.

Не забудьте очистить кеш браузера перед тестированием.

0 голосов
/ 15 марта 2012

Я знаю два решения для этого:

  1. Вы можете добавить сервлет по умолчанию для файлов js.

Итак, web.xml выглядит так:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

2 Вам нужно добавить метод shouldExclude () в класс фильтра. Вот пример, если вы не хотите передавать файлы * .js:

public void doFilter(ServletRequest request, ServletResponse response, 
                FilterChain chain) throws IOException, ServletException {

    if(shouldExclude(req)) {
          chain.doFilter(req, res);

    }
}



private boolean shouldExclude(ServletRequest req) {
     if(req instanceof HttpServletRequest) {
         HttpServletRequest hreq = (HttpServletRequest) req;
         return (hreq.getRequestURI().endsWith(".js"));
     }
     return false;
}
...