0

こんにちは..stackoverflowチームメンバー。

JavaでHttpSessionを使用して、useridなどの値を設定しようとしているので、セッションが存在するまで変数を使用できます。

リクエストのマッピングにspring3.0を使用しています。私のログインチェックコードは以下のとおりです

@RequestMapping(value = "/login/GetLoginCheck.action")
    public @ResponseBody
    Map<String, Object> loginCheck(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        List<Employee> emplist = null;
        try {

            GlobalController.session = request.getSession();
            if (!GlobalController.session.isNew()) {
                this.setUsername(request.getParameter("username"));
                this.setPassword(request.getParameter("password"));

                emplist = loginservice.getEmployee(this.getUsername(),this.getPassword());

                if(emplist.size()>0)
                {
                    for(Employee employee: emplist)
                    {
                        this.setEmployeeid(employee.getId());

                        synchronized (GlobalController.session) {
                              GlobalController.session.setAttribute("userid", employee.getId());
                            }
                    }

                }else
                {
                    return getModelMapError("The username or password you entered is incorrect.");
                }



            }else{
                System.out.println("already session created");
                System.out.println("SESSION ID ::"+GlobalController.session.getId());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        logingview = this.loginView(this.getUsername(),this.getPassword());
        return getMapUser(emplist,logingview);
    }

私のGlobalControllerクラスコードを以下に示します

public class GlobalController implements HttpSessionListener{


    private static int totalActiveSessions = 0;
    public static HttpSession session = null;

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // TODO Auto-generated method stub
        synchronized (this) {
            totalActiveSessions++;
        }
        System.out.println("Session Created: " + event.getSession().getId());
        System.out.println("Total Sessions: " + totalActiveSessions);

    }
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // TODO Auto-generated method stub
        synchronized (this) {
            totalActiveSessions--;
        }
        System.out.println("Session Destroyed: " + event.getSession().getId());
        System.out.println("Total Sessions: " + totalActiveSessions);
    }


}

ユーザーログインとして、「/ login / GetLoginCheck.action」が実行され、これを使用して、属性empoyeeId:2をセッションに設定します。

しかし、LAN内の別のPCで同じURLを開き、empoyeeId:1という名前の別のユーザーでログインします。

私が抱えている問題は、ログを表示するか、employeeId:1のグリッドパネルを開くと、employeeId:2に属するデータが表示されることです。

また、sessionIdは、新しくログに記録されたユーザーセッションでオーバーライドされます。

適切な方法でセッションを実装する方法を提案してください。そうすれば、対象の従業員のみに属するデータとセッションを取得できます。

4

3 に答える 3

1
  • クラスに関連する静的変数であり、インスタンスごとではなく、クラスごとに1つの値があります。それがあなたが持っている理由です

また、sessionIdは、新しくログに記録されたユーザーセッションでオーバーライドされます。

  • すべてのサーブレットはシングルトンであるため、2人のユーザーが同時にログインしようとすると問題が発生する可能性があります。
于 2012-10-08T12:23:45.953 に答える
0

spring3.0を使用している場合は、同じ目的でスプリングセキュリティを利用してみませんか?

また、春のセキュリティが複雑すぎる場合は、いつでもApacheshiroを使用できます。

于 2012-10-08T11:25:42.020 に答える
0

返信ありがとうございます。セッションをクラス変数にすることで問題を解決することができます。以下は、loginCheckメソッドでアプリケーションでセッションを機能させようとしたコードです。

HttpSession session;
session = request.getSession();
session.setAttribute("employeeid", this.getEmployeeid());

以下のコードで行われたセッション属性を取得します

session = request.getSession();
System.out.println("EMPLOYEE ID ::"+session.getAttribute("employeeid"));
于 2012-10-10T04:52:52.030 に答える