2

MVC webapp に OpenSessionInViewFilter を実装しましたが、ほぼ完璧に動作します。唯一の問題は、Web サーバーから要求されたすべてのイメージ、js、css などに対してもセッションを作成することです。これは欲しくない。

私はstruts2、spring、およびhibernateを使用しています。これは私のweb.xmlです

<filter>
    <filter-name>lazyLoadingFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>lazyLoadingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

したがって、url-pattern /* をマッピングしているため、すべての画像なども取得します。*.jsp と *.action に設定しようとしましたが、lazyloading-exceptions が再び発生します...どうすればよいですか? 私は今5時間答えを探していて、頭が少し頭がおかしくなっています.

私がする必要があるのは、このフィルターをすべての静的リソースを無視することだけです。それでおしまい!そして、それ以外はすべて実行できます。とても簡単に聞こえますが、どうすればいいのかわからなくて本当にイライラします。

どんな助けでも大いに感謝します。

フィルターを拡張して独自のフィルターを作成し、その中で除外する必要がありますか? そしてそうならば。どのように?

編集:フィルターチェーンの上部にある静的ファイルのフィルターマッピングを設定できるようです。そして、それらを「ByPassFilter」に送信して、これらの静的リソースのフィルターチェーンをバイパスします。これは行く方法ですか?

みんなありがとう!

4

5 に答える 5

1

このようなシナリオでの一般的な方法は、Apache Web サーバーとアプリケーション サーバー (Tomcat/JBoss) をmod_jk モジュールと組み合わせて使用​​することです。

この組み合わせの使用方法を説明するリンクは次のとおりです。(別リンク)

この構成を使用する主な利点は、

  1. 静的コンテンツは、Apache Web サーバーによって提供できます。
  2. 動的コンテンツ要求 (*.jsp、*.action など) は tomcat に委任されます。
  3. 静的コンテンツのコンテンツ圧縮などの他の有用なモジュールがあり、応答時間が改善されます。
  4. アプリサーバーがすべてを提供しているシナリオよりも安全です。

これがまさにあなたが探している解決策ではないかもしれないことを理解しています.これは一般的な慣行であるため、これを提案しました.

于 2012-04-26T10:20:48.963 に答える
0

バイパスフィルターを使用する実装を検討する限り、そのようなフィルターが前にある場合、フィルターチェーン内の次のフィルターをスキップすると、基本的にチェーン内の残りのフィルターもスキップされます(これはほとんどの状況で行うのが望ましいことです)。また、リクエストのフィルタ呼び出しは次のように動作します

Filter1-> Filter2-> Struts Action / BL-> Filter 2-> Filter 1

したがって、Strutsアクションでリクエストが処理された後にOpenSessionInViewFilterが開始されます(これは、web.xmlのビューフィルターでセッションを開いた後に別のバイパスフィルターを配置することで回避できます)。ただし、全体として、単一のフィルターをスキップするためにフィルターチェーン全体をスキップすることは常に望ましくないように思われます。

OpenSessionInViewFilterをスキップする必要に直面したことはありませんが、スキップする必要がある場合は、Bypassfilterを使用する代わりに、OpenSessionInViewFilterフィルターを拡張するフィルターを使用して、静的リソースの処理をスキップします。

于 2012-04-26T11:12:16.110 に答える
0

誰かが を拡張して解決策を必要とする場合に備えてOpenSessionInViewFilter。事前定義された静的リソースの Hibernate セッションの作成を防ぎます。

/**
 * Skips OpenSessionInViewFilter logic for static resources
 */
public class NonStaticOpenSessionInViewFilter extends OpenSessionInViewFilter {

    static final Pattern STATIC_RESOURCES = Pattern.compile("(^/js/.*)|(^/css/.*)|(^/img/.*)|(^/fonts/.*)|(/favicon.ico)");

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String path = request.getServletPath();
        if (STATIC_RESOURCES.matcher(path).matches()) {
            filterChain.doFilter(request, response);
        } else {
            super.doFilterInternal(request, response, filterChain);
        }
    }

}

基本的に、Spring はexcludePatternsfor のようなプロパティを提供する必要がありましたOpenSessionInViewFilter

于 2016-06-07T21:39:45.097 に答える
0

必要なパターンの要素のみを含めます。

このようなもの:

<filter-mapping>
    <filter-name>lazyLoadingFilter</filter-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>/profile/edit</url-pattern>
    <url-pattern>/cars/*</url-pattern>
</filter-mapping>
于 2016-01-28T15:21:34.197 に答える
-1

@Santoshからの回答に完全に同意します。

リソースを作成し、OpenSessionInViewFilterそれをオブジェクトに追加しThreadLocalます。セッションが使用されない場合、セッションが実際に作成されることはありません。これは、そのリクエストにデータベース接続が使用されないことも意味します。(これはおそらくあなたの質問に対する答えです)。

それでも物事を制御する必要がある場合は、いつでも別のフィルターを作成して拡張し、どのリソースが呼び出されているかに基づいてメソッドをOpenSessionInViewFilter実行できます。getSession

于 2012-04-26T10:51:13.527 に答える