2013-01-17 26 views
1

我是新來的Spring Portlet MVC屬性(由攔截器設置),但我已經在過去的幾天裏就可以了苦讀。 我的問題的背景是以下訪問PortletSession中從控制器(的Spring Portlet MVC)

  1. 我有一個Spring MVC的Portlet門戶與單一控制器。
  2. 該portlet是配置爲調用一個的HandlerInterceptor(方法「preHandleRender」)隨時一個用戶想要訪問一個資源。如果
  3. 攔截檢查的用戶進行身份驗證,如果沒有,它檢索用戶的Liferay的憑據上一些其他的WebServices(不感興趣現在)管理認證。
  4. 在此之後,攔截存儲PortletSession中內的用戶數據。

現在,我該如何從控制器內部檢索攔截器中存儲在PortletSession中的用戶數據?

sessionInterceptor.preHandleRender

@Override 
public boolean preHandleRender(RenderRequest request, RenderResponse response, Object handler) throws Exception { 

    PortletSession session = request.getPortletSession(true); 
       . 
       . 
       . 
    session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE); 
       . 
       . 
       . 
    return true; 
} 

的ViewController類

@Controller("viewController") 
@RequestMapping(value = "view") 
public class ViewController { 

    //@Autowired 
    private WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 

    @RenderMapping 
    public String setModelAndView(RenderRequest request, ModelMap tgtModel) { 
     logger.debug("<< | >> Starting."); 

     PortletConfiguration conf = PortletConfiguration.getInstance(); 
       . 
       . 
    } 
} 

我已經準備好,如果要求提供有關我的代碼的詳細信息。

回答

1

我是能夠解決的問題,並找出我的錯誤。

在攔截器中,正如我在我的問題中所展示的那樣,我在PortletSession.APPLICATION_SCOPE中設置了會話屬性「userProfile」

session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE); 

至於控制器,我明白你有多種選擇:

  • 傳請求(RenderRequest中,在我的情況)作爲參數,將獲得我的情況,會話(PortletSession中, ),然後從會話中檢索屬性。
  • 直接將會話作爲參數傳遞,然後從中檢索屬性。

然而,無論你拿第一或者第二條路,如果在控制器使用下面的指令

session.getAttribute("userProfile"); 

你不會得到任何東西,因爲屬性在PortletSession.APPLICATION_SCOPE設置。

正確的指令是:

session.getAttribute("userProfile",PortletSession.APPLICATION_SCOPE); 
相關問題