2

リクエストをログに記録するためにリクエストを処理するフィルターがあるので、どのセッションがどのリクエスト パラメータでいつページにヒットしたかを追跡できます。うまく機能します... jspからjspへの投稿、またはjspへの直接呼び出しを行います。ただし、そのリクエストを新しい JSP に転送するサーブレットにフォームがポストされると、リクエストがどの JSP に転送されたかを確認できません。

たとえば、LoginServlet に投稿するログイン ページがあり、その後、リクエストを index.jsp または index1.jsp に転送するとします。LoginServlet が index.jsp または index1.jsp を返すかどうかをリクエストから判断するにはどうすればよいですか?

これは、2.3 サーブレット仕様を使用する Java 1.5 環境にあります。

public class PageLogFilter implements Filter {

    FilterConfig filterConfig = null;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void destroy() {
        this.filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest req = (HttpServletRequest) request;
                HttpSession session = req.getSession(false);

                //For non-forwards, I can call req.getRequestURI() to determine which 
                //page was returned. For forwards, it returns me the URI of the  
                //servlet which processed the post. I'd like to also get the URI
                //of the jsp to which the request was forwarded by the servlet, for
                //example "index.jsp" or "index1.jsp"
            }
        } catch (Exception e {
            System.out.println("-- ERROR IN PageLogFilter: " + e.getLocalizedMessage());
        }

        chain.doFilter(request, response);
    }
}
4

2 に答える 2

2

追加のチェックを実行しても問題ない場合は、属性を使用して元のリクエスト URI を設定/取得できます。あなたのLoginServletセットで属性:

//LoginServlet
public void doFilter(...) {
      HttpServletRequest oReq = (HttpServletRequest)request;
      ..
      ...
      //save original request URI
      oReq.setAttribute("originalUri", oReq.getRequestURI());
}

そして、PageLogFilteroriginalUri 属性に値があるかどうかのチェックで、この値をリクエスト URI と見なします

//PageLogFilter 
public void doFilter(...) {
      HttpServletRequest req = (HttpServletRequest) request;
      if(req.getAttribute("originalUri") != null) {
          String strOriginalUri = (String) req.getAttribute("originalUri");
          //set it back to null
      req.setAttribute("originalUri", null);
      }
}
于 2012-01-27T16:18:56.910 に答える
0

差し迫った問題の解決には役立ちませんが、サーブレット2.4は、ディスパッチャにさらに詳細な制御を追加しました。これは、必要なものです。

これを使用すると、次のディスパッチャー要素を追加するようにフィルターを構成できます。これにより、フィルターは転送にも適用されます。

<filter-mapping>
       <filter-name>PageLogFilter</filter-name>
       <url-pattern>/*</url-pattern>
       <dispatcher>FORWARD</dispatcher>
</filter-mapping>

次の記事で詳しく説明します

http://www.ibm.com/developerworks/java/library/j-tomcat2/

于 2012-01-27T16:30:39.360 に答える