2017-08-24 93 views
0


我在這裏是新來的,但閱讀本頁多次。我有一個複雜的問題,我不是母語英語,所以如果我無法理解,請原諒我。
我寫了一個portlet到我們舊的Oracle Portal 10g服務器。在portlet中,一個javascript函數將一些帶有ajax的數據傳遞給一個servlet。 我想在識別用戶的時候調用servlet。我可以通過Portlet會話嗎?就像在portlet中一樣,有一個PortletRenderRequest,我可以獲取用戶名和用戶權限。
我的理論portlet函數簡而言之:它是一種形式,如果有人填寫它,並用javascript ajax發送數據給servlet,我想檢查一下,發件人是否有權將數據插入到數據庫中(她是什麼/他的名字)。現在它起作用了,portlet獲取用戶數據並寫入一個輸入隱藏元素值,並且javascript讀取它,然後發送該帖子,但這很容易被破解,並且可怕的解決方案。

有什麼辦法可以獲取servlet請求中的用戶數據?

現在,在理論上它看起來像這樣:
portlet.jsp:

<% 
    PortletRenderRequest pReq = (PortletRenderRequest)request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); 
    String userNev = pReq.getUser().getName(); 
    session.setAttribute("username",userNev); 
    System.out.println("session ID in JSP: "+session.getId()); 
%> 
<button class="btn" type="button">Upload data</button> 
<script type="text/javascript"> 
    $(function() { 
     $(".btn").click(function(){ 
      /*.....*/ 
      $.post("/demo/servlet", poststring); 
     }); 
    }); 
</script> 

的servlet:

public class servlet extends HttpServlet { 
    public void doPost(HttpServletRequest request, 
         HttpServletResponse response) throws ServletException, IOException { 
     HttpSession session = (request.getSession()); 
     System.out.println("Session ID in servlet: "+session.getId()); 
     /*....*/ 
    } 
} 


目前,它在JDeveloper 10.1.3.5的運行。
每個頁面刷新都會在控制檯中顯示不同的「JSP中的會話ID」,但「Servlet中的會話ID」不會更改,因此它必須是正確的。
所以現在唯一的任務是把數據放在正確的HttpSession中,我只需要以某種方式訪問​​jsp頁面。 HttpSession Session = request.getSession();在jsp頁面上的會給出錯誤的會話(這會改變每次刷新)。

編輯:
所有的問題都回答@Jonathan。它導致了額外的問題,比如如何在jsp頁面上獲得HttpSession?
我發現,session = HttpSession = ProviderSession在jsp頁面上,並不等於在servlet中有HttpSession。
(如果我將提供者註冊頁面上的登錄頻率設置爲「always」,jsp頁面上的ProviderSession沒有隨頁面刷新而改變)
我並不真正瞭解ProviderSession和HttpSession之間的區別,以及如何訪問從一個到另一個。如果我可以通過servlet訪問ProviderSession,從使用的角度來看它會是一樣的嗎?

回答

0

應用程序會話存在於Servlet和Portlet容器中。它是在Portlet容器中從呈現階段到動作階段(或任何更低階段的 階段)共享數據(原始Inter-Portlet 通信)的方式之一。 what is the difference between a portlet and a servlet?

因此,當用戶登錄到你的應用程序中,設置一個會話變量,在這個例子中「與loggedInUser」。 然後在servlet中,在執行任何數據庫請求之前,檢查會話變量是否爲空。像這樣:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     HttpSession session = (request.getSession()); 
     //check if there is a loggedInUser session variable 
     if(null == session.getAttribute("loggedInUser")){    
      request.setAttribute("pleaselogin", "Not Logged In. Login or register to do this.");    
      RequestDispatcher rd=request.getRequestDispatcher("Error.html"); 
       rd.forward(request,response);   
     }else{ 

    String username = (String) session.getAttribute("loggedInUser"); 


    //do database logic 

} 

} 
+0

哇,這將是太棒了,謝謝@jonathan! 我試圖把數據放到會話中: HttpSession Session = request.getSession(); Session.setAttribute(「loggedInUser」,userNev); System.err.println(「ellenőrzés:」+ Session.getAttribute(「loggedInUser」)); //沒關係! 但在servlet中,在該屬性中找到null。 我在provider.xml中設置了 true,並且還將提供程序註冊頁面上的登錄頻率設置爲「每個用戶會話一次」。 – KoRi

+0

因爲我發現會話id(session.getId())在jsp頁面和servlet中不同,所以會話不同。但我不知道爲什麼? – KoRi

+0

@KoRi編輯你的文章並添加你遇到的問題的代碼,我會看看我是否可以幫助你,我不完全理解你的問題。 –

相關問題