15

<iframe></iframe>iframe の内容が jsf ページであるウェルカム ページ index.jsp を使用するアプリケーションがあります。index.jsp にアクセスすると、最初の get in firebug にすでに Cookie が表示されます。

Set-Cookie  JSESSIONID=C615DA89B6EF73F801973EA3DCD3B226; Path=/

のページは、<iframe>この jsessionid を継承しています。BUT: のページに直接アクセスする<iframe/>と、最初のリクエストで jsessionId が Cookie なしですべての URL に書き換えられます。その後、Cookie が使用されます。これで問題ありません。次の場合: セキュリティ システムにより、URL の書き換えが許可されます。

jboss 4.2.2を実行しています

index.jsp と同じ動作を実現したいと考えています。たとえば、常に Cookie を使用し、http の書き換えを常に回避します。

[編集] baluscの回答のおかげで、私はこれを書きました:

public class JsessionIdAvoiderFilter implements Filter {

            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
                    ServletException {
                boolean allowFilterChain = redirectToAvoidJsessionId((HttpServletRequest) req, (HttpServletResponse)res);

                         //I'm doing this because if I execute the request completely, it will perform a pretty heavy lookup operation. No need to do it twice.
                if(allowFilterChain)
                    chain.doFilter(req, res);
            }


            public static boolean redirectToAvoidJsessionId(HttpServletRequest req, HttpServletResponse res) {
                HttpSession s = req.getSession();
                if(s.isNew()) {

 //after the redirect we don't want to redirect again.
if(!(req.isRequestedSessionIdFromCookie()&&req.isRequestedSessionIdFromURL()))
                    {
                                //yeah we have request parameters actually on that request.         
                        String qs = req.getQueryString();

                        String requestURI = req.getRequestURI();
                        try {
                            res.sendRedirect(requestURI+"?"+qs);
                            return false;
                        } catch (IOException e) {
                            logger.error("Error sending redirect. " + e.getMessage());
                        }
                    }
                }
                return true;
            }
}

に追加することを忘れないでくださいweb.xml

    <filter> 
    <display-name>JsessionId Filter</display-name> 
    <filter-name>jsessionIdAvoiderFilter</filter-name> 
    <filter-class>my.namespace.JsessionIdAvoiderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>jsessionIdAvoiderFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter> 
4

3 に答える 3

14

サーブレット3.0以降、これに使用できます<tracking-mode>COOKIE</tracking-mode>。ただし、JBoss4.2.2はサーブレット3.0に準拠していないため、これはオプションではありません。

最も簡単なのは、 returnのHttpServletRequest#getRequestURI()ときにリダイレクトを送信するサーブレットフィルタを作成することです。クライアントがCookieをまったくサポートしていない場合に、無限のリダイレクトループを防ぐために、をチェックすることを忘れないでください。HttpSession#isNew()trueHttpServletRequest#isRequestedSessionIdFromCookie()

于 2012-07-05T19:00:58.827 に答える
2

これは、HttpServletRequest.encodeURL と HttpServletRequest.encodeRedirectURL をオーバーライドする HttpServletRequest でリクエストをラップする単純なフィルターで実行できます。渡された String 引数を返すだけで、URL の書き換えが無効になります。これは、単一の webapp でのみ機能することに注意してくださいconf/web.xml(推奨されません)、または個別のすべての webapps で構成する場合を除きます。

この手法は、リクエストを遅くする可能性のあるリダイレクトを必要としないため、質問の後半に投稿された手法よりも優れています。IMO、それもきれいです。

于 2012-07-09T13:57:54.950 に答える