4

SessionAwareインターフェイスを実装してインターセプター内からセッション オブジェクトにアクセスしようとしています (setSessionメソッドを実装しました) が、この方法でセッション オブジェクトを取得できません。

それから試しActionContext.getContext().getSession()てみたところ、セッションを取得できましたが、わかりませんが、すべてのユーザーのすべてのブラウザーで初めて空になり、別のアクションが呼び出されるといっぱいになります。

セッションで何か問題が発生していると思います。初めて空のセッションが表示されるのはなぜですか? 初めて空のセッションを与えた後にのみ何かを設定しますか?

この場合、全員が最初のリクエストでゲストとして表示され、2 回目のリクエストでユーザー名が表示され、それ以降は表示されます。

または、間違った方法でセッションを取得していますか?

インターセプターでセッションを取得するコードを見ましたが、定数が見つからないため、これは機能しませんHTTP_REQUEST

final ActionContext context = invocation.getInvocationContext();

HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);

HttpSession session = request.getSession(true);

Object user = session.getAttribute(Constants.USER_HANDLE);

問題を解決するための提案はありますか?

言い忘れたこと - 私のウェブサイトは安全なサイト (https) であるため、ユーザーがログインしていない場合、ユーザーはウェブサイトにアクセスできません。ログインしている場合、少なくともユーザー名がセッションに存在する必要があります。 . そうではないでしょうか?

4

5 に答える 5

3

セッションをマップとして取得するインターセプターもあります。このようなことを試しましたか?これは私にとってはうまくいきます。

public String intercept( ActionInvocation actionInvocation ) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();
于 2011-08-12T13:50:59.220 に答える
0

以下を使用して -- を返し、HttpSession存在しない場合は作成できます。

HttpSession session = ServletActionContext.getRequest().getSession(true);

代わりにマップが必要な場合は、最後の呼び出しの直後にこれを呼び出すことができます (true を渡したので、セッションが作成され、次の呼び出しで空のセッション マップが返されます)。

Map<String, Object> session = ActionContext.getContext().getSession();

CreateSessionInterceptorまたは、必要な時間までにセッションが作成されるように、スタックの早い段階で使用できます。次に、上記のマップの例を使用して取得します。

参考までに、例で試したように定数を使用する必要なく、リクエストとレスポンスを取得するための便利なメソッドを持つServletActionContextサブクラスです。ActionContext

于 2011-08-12T17:31:20.313 に答える
0

これを試して。Struts 2.0.14でうまくいきました。

public String intercept(ActionInvocation ai) throws Exception {

     Map session = ActionContext.getContext().getSession(); 
于 2013-05-14T11:14:53.210 に答える
-1

インポートを追加します。

import org.apache.struts2.StrutsStatics;
于 2016-11-08T22:35:12.040 に答える