0

私はlog in時々データベースにセッションIDを保存しています。私が直面している問題は、別のユーザーが最初のユーザーの後にログインすると、同じセッションが DB に入力さwelcome usernameれ、同じマシンに最初にログインしたユーザーの名前が反映されることです。ユーザーがログインするたびに新しいセッション ID を作成したいのですが、なぜかコードが機能しません。

HttpSession session = request.getSession();
String sessionID;
request.getSession(true);
sessionID = session.getId();

注: 上記のコードは、ユーザーが [ログイン] ボタンをクリックすると呼び出され、サーブレットに含まれています。

セッション ID には、デフォルトで古いセッションの有効期限が切れるまで、セッションの古い値が保持されます。つまり、10 人のユーザーがログインすると、全員が同じセッション ID と同じウェルカム ネームを持つことになります。

ここで達人からの専門家のアドバイスが必要です:)。記入する必要がある詳細を見逃している場合はお知らせください。

私が使用する場合 -

if(session.isNew()){
            System.out.println("New session created by default");
            request.getSession(true);
            sessionID = session.getId();
            createTime = new Date(session.getCreationTime());
            lastAccessTime = new Date(session.getLastAccessedTime());
            initialtime = System.currentTimeMillis();
        }else{
            System.out.println("You have created a new session");
            request.getSession().invalidate();
            request.getSession(true);
               sessionID = session.getId();
            createTime = new Date(session.getCreationTime());
            lastAccessTime = new Date(session.getLastAccessedTime());
            initialtime = System.currentTimeMillis();
         }

以下の例外を取得します -

SEVERE: Servlet.service() for servlet LoginToApp threw exception
java.lang.IllegalStateException: getCreationTime: Session already invalidated
    at org.apache.catalina.session.StandardSession.getCreationTime(StandardSession.java:1025)
    at org.apache.catalina.session.StandardSessionFacade.getCreationTime(StandardSessionFacade.java:74)
    at LoginToApp.doGet(LoginToApp.java:56)
    at LoginToApp.doPost(LoginToApp.java:208)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:843)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:679)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1303)
    at java.lang.Thread.run(Thread.java:595)
4

2 に答える 2

1

変数を新しいセッションに設定しsessionます。古い無効化されたセッションで作業しようとしています。

于 2012-08-09T15:58:40.713 に答える
0

まず、ログアウト中にセッションを無効にする必要があります。これにより、サーバー内のセッションとそれに関連するデータが削除されます。

実際には、セッション ID は jsessionid という名前でクライアント ブラウザの Cookie にも保存されます。セッションを無効にした後でも、クライアントには残りますが、サーバーでは削除されます。新しいものを作成します。

したがって、ログアウト中は無効にすることが重要です。

 HttpSession session = request.getSession(false); 
 session.invalidate();    

ログアウト時にクライアントの現在のセッションのデータをクリアしたい場合でも。以下のコードを使用してください。

Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        cookie.setMaxAge(0);
        cookie.setValue(null);
        cookie.setPath("/");
        response.addCookie(cookie);
    }
于 2014-11-28T00:19:03.187 に答える