2012-03-15 7 views
0

私のWebアプリケーション(Apache Tomcat 7、JSP、Servlet)では、私はフィルターを使います。時々、コンソールに私はJavaScriptをJSPに含まれているパス(任意の* .jsファイル)をファイルに印刷している理由を、私は理解できない今フィルタが含まれている* .jsファイルをチェックする理由を教えてください。


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

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

//... until doFilter 
} 

doChain方法で、私は次のコードを入れて。 * .cssファイルでは発生せず、* .jsファイルでのみ発生します。さらに、* .jsファイルはサーブレットにアクセスするたびに出力されません。私は自分のものが無作為に印刷されているように見えました。

誰にも説明がありますか? なぜそれがランダムに起こるのですか?

ありがとうございました。

EDIT:実際には* .pngファイルでも発生します。しかし、この問題のランダムな性質を考慮に入れると、他のファイル(CSSを含む)で同じように動作する可能性があります。

NB:

  1. 私はそれをやろう理由です、ページ・パスに基づいて認証を作ってみます。問題は、* .jsページを考慮したくないことです。
  2. コードにしたい場合は教えてください。

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

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

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

    }

    そしてnetwork_view.jsp CO:


共通サーブレットのコードを更新しde:



<?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> 

これは私のコードのパターンです。

+0

はい、「web.xml」からサーブレットマッピングを見ることができます。また、あなたのブラウザや 'curl'から直接JSファイルにアクセスすると、ランダムに印刷されたメッセージもありますか? –

+0

@TomaszNurkiewicz JSPファイルに直接アクセスすると、* .jsファイルがコンソールに出力されませんが、JSPはロジックによってエラーをスローします。とにかく、それは私が興味を持っている動作に影響を与えるべきではありません。 'web.xml'に関連しています。ご覧のとおり、Servlet3.0アノテーションを使用します。 – artaxerxe

答えて

1

をロードされている: は、ここでは、*の.jsファイルを渡したくない場合などです。ネットワーク帯域幅とサーバー負荷を節約し、両者のパフォーマンスを向上させるので、良いことです。あなたが本当には、すべてのこれらのリソースは、すべての単一のリクエストに応じてサーバからダウンロードする必要があることを主張する場合

は、その後、あなたはないキャッシュにそれらの応答をブラウザに指示レスポンスヘッダを追加するためにフィルタを拡張する必要があります。

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

偉大な答え!ありがとう! – artaxerxe

-2

私はこのために2つの解決策を知っている:あなたがjsのファイルに対して「デフォルト」のサーブレットを追加することができます

  1. を。

ので、web.xmlが次のようになります。

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

2あなたはフィルタクラスにshouldExclude()メソッドを追加する必要があると思います。それが呼び出されていないときは、当該のリソースは、単にブラウザのキャッシュから

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; 
} 
+0

ソリューションをありがとう。ちょうど質問: 'default'は私のサーブレット名です(他の名前に置き換えることもできます)か、標準名(変更できません)ですか? – artaxerxe

+1

標準名なので、変更することはできません。 [DefaultServlet](http://tomcat.apache.org/tomcat-5.5-doc/default-servlet.html)は、Tomcatの静的リソース(jpg、html、css、gifなど)を提供するサーブレットです。詳細については、[ソースコード](http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java)を参照してください。 –

+0

ねえ、あなたの両方のアプローチを試みましたが、全く動作しません! – artaxerxe

関連する問題