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 设置为会话。

但是我在局域网中的另一台电脑上打开了相同的 url,并使用另一个名为 empoyeeId: 1 的用户登录。

我遇到的问题是,当我看到日志或打开具有employeeId:1 的网格面板时,它会向我显示属于employeeId:2 的数据。

sessionId 也会被新记录的用户会话覆盖。

请给我一些建议,我可以尝试以适当的方式实施会话,因此我只获得属于预期员工的数据和会话。

4

3 回答 3

1
  • 与类相关的静态变量,每个类有一个值,而不是每个实例。这就是为什么你有

sessionId 也会被新记录的用户会话覆盖。

  • 每个 servlet 都是单例的,因此当两个用户同时尝试登录时会出现问题。
于 2012-10-08T12:23:45.953 回答
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 回答
0

如果您使用的是spring3.0,为什么不出于同样的目的使用spring security ?

此外,如果您发现 spring 安全性太复杂,您可以随时使用Apache shiro

于 2012-10-08T11:25:42.020 回答