2017-08-24 50 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编辑你的文章并添加你遇到的问题的代码,我会看看我是否可以帮助你,我不完全理解你的问题。 –

相关问题