2011-05-20 39 views
3

我們的產品是在Spring 3.0 MVC中開發的。request.getSession不返回同一會話

我們已經在控制器中使用瞭如下的會話。

@Controller 
    public class LoginController{ 
    HttpSession session; 

    @RequestMapping(value="/index.htm",method = RequestMethod.POST) 
    public ModelAndView viewIndex(HttpServletRequest request){ 
    session=request.getSession(false); 
    System.out.println(request.getSession(false)); 
    System.out.println(session); 
    } 
    } 

在這裏,在Firefox中,我可以看到兩者request.getSession(false)session和都印有相同的值。

雖然在IE中,我可以看到request.getSession(false)打印一個值,session打印爲null

可能是什麼原因?

注:我沒有使用任何過濾器會話

+4

將會話分配給控制器的某個字段是一個非常糟糕的主意,你只是要求奇怪的併發問題。擺脫這一點,並確保只使用局部變量時仍然會出現問題。 – skaffman 2011-05-20 16:57:16

回答

10

你應該從未分配請求或會話特定變量的一類,其中只有一個在整個應用程序的生命週期實例的字段。所有的網頁訪問者將共享相同的變量。訪客X然後會與訪客Y共享會話。這是一個巨大的數據完整性泄漏。

至於抓住會議,如果你需要會話,只需使用request.getSession()直接沒有布爾值。做而不是將它分配給某個字段以供「稍後重複使用」。

@RequestMapping(value="/index.htm",method = RequestMethod.POST) 
public ModelAndView viewIndex(HttpServletRequest request){ 
    HttpSession session = request.getSession(); 
    // ... Get/set attributes? 
} 

有關的servlet在幕後是如何工作的更多背景信息(Spring MVC的是建立在基本的servlet API之上的框架),你會發現這篇文章有用:How do servlets work? Instantiation, sessions, shared variables and multithreading

相關問題