2012-10-08 119 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