2012-10-08 68 views
0

嗨.. stackoverflow团队成员。在Java中使用会话登录模块时遇到困难

我想在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); 
    } 

我的登录校验码,并给出以下

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); 
    } 


} 

我GlobalController类代码作为用户登录我的“/login/GetLoginCheck.action”执行以及与此我设置会话的属性empoyeeId:2。

但我在局域网另一台PC打开相同的URL,并与名为有empoyeeId其他用户登录:1.

我遇到的问题是,当我看到日志或打开具有的GridPanel employeeId:1它显示属于employeeId:2的数据。

此外,sessionId会使用新登录的用户会话进行覆盖。

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

回答

0

非常感谢您的回复。我能够解决我的问题,使会话作为类变量。 下面是的代码,我试图让我的应用程序在loginCheck方法中工作。

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

和检索会话属性用做下面的代码

session = request.getSession(); 
System.out.println("EMPLOYEE ID ::"+session.getAttribute("employeeid")); 
0

如果您使用的是spring3.0,为什么不使用spring security来达到同样的目的呢?

此外,如果你找到春天的安全太复杂,你可以随时与Apache shiro

+0

感谢您的快速反应,但我已经实现了上面的代码正确也一切正常。但只有sessionId存在问题。我总是变成最后登录的用户sessionId。请建议我一些工作解决方案,我可以尝试它并让我的应用程序工作。 –

1
  • 静态varables相关类去,并且每类一个值,而不是每个实例。这就是为什么你有

此外sessionId得到覆盖与新登录的用户会话。

  • 每一个servlet的是单身,这样你就可以得到问题,当两个用户将simultaneusly尝试登录。
+0

感谢您的回复。我明白我已经将会话声明为静态变量,因此它只有一个实例。你有什么我可以练习到我的应用程序运行的例子吗? –

+0

javadoc http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html和示例http://www.java2s.com/Code/Java/Servlets/Session.htm – user1516873