【问题标题】:Is there any way to get user data in a servlet request?有没有办法在 servlet 请求中获取用户数据?
【发布时间】:2018-02-02 19:29:05
【问题描述】:


我是新来的,但读了很多次这个页面。我有一个复杂的问题,而且我不是以英语为母语的,所以如果我不能理解,请先原谅我。
我为我们的旧 Oracle Portal 10g 服务器编写了一个 portlet。在 portlet 中,一个 javascript 函数使用 ajax 将一些数据发布到 servlet。 我想在调用 servlet 时识别用户。我可以从 portlet 会话中传递一些东西吗?就像在 portlet 中一样,有一个 PortletRenderRequest,我可以获得该用户的用户名和权限。
简而言之,我的理论 portlet 函数:它是一个表单,如果有人填写它,并使用 javascript ajax 将数据发送到 servlet,我想检查一下,发送者有权将数据插入数据库(以及她/他的姓名)。现在它可以工作了,portlet 获取用户数据并写入输入的隐藏元素值,然后 javascript 读取它,并与帖子一起发送,但这是很容易破解的,而且是糟糕的解决方案。

现在理论上它看起来像这样:
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>

小服务程序:

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?
我发现,jsp 页面上的 session = HttpSession = ProviderSession,与 servlet 中的 HttpSession 不相等。
(如果我将提供商注册页面上的登录频率设置为“始终”,jsp 页面上的 ProviderSession 不会随着页面刷新而改变)
我真的不知道 ProviderSession 和 HttpSession 之间的区别,以及如何从一个访问到另一个。如果我可以从 servlet 到达 ProviderSession,那么从使用角度来看是一样的吗?

【问题讨论】:

    标签: javascript java servlets portlet


    【解决方案1】:

    应用程序会话存在于 Servlet 和 Portlet 容器中。它 是共享数据的一种方式(原始的Inter-Portlet 通信)从渲染阶段到动作阶段(或任何更低的阶段) 阶段)在 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
    
    }
    
    }
    

    【讨论】:

    • 哇,那太棒了,谢谢@jonathan!我试图将数据放入会话: HttpSession Session = request.getSession(); Session.setAttribute("loggedInUser",userNev); System.err.println("ellenőrzés:" + Session.getAttribute("loggedInUser")); //没关系!但在 servlet 中,在该属性中发现 null。我在provider.xml中设置了true,并且还设置了provider注册页面的登录频率为“每个用户会话一次”。
    • 当我发现会话 id (session.getId()) 在 jsp 页面和 servlet 上是不同的,所以不同的会话。但我不知道为什么?
    • @KoRi 编辑您的帖子并添加您遇到问题的代码,我会看看是否可以帮助您,我不完全理解您的问题。
    猜你喜欢
    • 2016-03-17
    • 2022-10-25
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多