使用href传递参数值,仅使用JSP会话存储和检索它们

时间:2014-05-22 13:31:06

标签: java jsp url-rewriting httpsession

与我的问题所暗示的相反,我完全理解在JSP中使用任何形式的代码是不对的。但我有一项重要的任务要完成,这就是场景:     一旦链接被点击,传递的参数,无论它是什么,都被截断(由于安全原因),我需要在用户登录后以某种方式获取这些参数。我试图使用会话这样做

我有四个JSP页面说:

  1. routing.jsp
  2. intermediateTarget.jsp
  3. 的login.jsp
  4. target.jsp
  5. 和带有链接的页面以及传递给它的一些参数:

    < a href="router.jsp?p1=s&p2=s123">Click here</a>
    

    一旦我点击它,它就会带我到router.jsp我创建一个会话并获取传递的参数并将它们设置到会话中:

    <% String param1 = request.getParameter("p1");
       String param2 = request.getParameter("p2");
    
       HttpSession session1 = request.getSession(true);
       session1.setAttribute("p1", param1);
       session1.setAttribute("p2", param2);
       response.sendRedirect("intermediateTarget.jsp");
     %>
    

    router.jsp已执行onload因此基本上已重定向intermediateTarget.jsp

    在这里,我使用getAttribute获取参数:

        HttpSession session1 = request.getSession();
        String param1 = (String) request.getAttribute("p1");
        String param2 = (String) request.getAttribute("p2");
    
        String param = request.getParameter("param");
        String lgn = request.getParameter("lgn");
    
        if (null != param) {
            response.sendRedirect("empLogin.jsp");
        } else if (null != lgn) {
            response.sendRedirect("target.jsp");
        }
    

    我有两个隐藏参数从登录页面和路由页面分别传递lgnparam。在检查了从哪个页面获取请求后,我需要将其重定向到target.jsplogin.jsp

    基本上,登录后我需要能够从会话中获取相同的参数并将其显示在目标页面上(就像确认我实际上能够获取我在链接中传递的参数一样)。 )

    同样,我不需要servlet,因为这是我们需要仅使用JSP来包含的内容。

    此外,我已经阅读过尝试在?之后提取网址的部分,甚至进入了提取深层链接的概念,但我没有到达任何地方。

    很抱歉,如果帖子似乎太长了。只是想清楚地了解我的情况,并且对此有任何其他想法将不胜感激。

    提前多多感谢!

1 个答案:

答案 0 :(得分:0)

首先,我不明白为什么你不想要servlet,因为它更清晰,更漂亮的代码。它们也适用于这种情况。

这与问题无关,而是让你的生活更轻松。

如果您使用的Scriptlet主要是令人不安的阅读,我建议您放置 scriptlet标签代替了代码的可读性,例如

<jsp:scriptlet>
    String param1 = request.getParameter("p1");
    String param2 = request.getParameter("p2");

    HttpSession session1 = request.getSession(true);
    session1.setAttribute("p1", param1);
    session1.setAttribute("p2", param2);
    response.sendRedirect("intermediateTarget.jsp");
</jsp:scriptlet>

现在我相信你的问题,因为你不清楚你想要什么。

您实际上是将变量存储在会话中(您想要这样做),但是您是从请求中访问它们的?

对于会话范围的变量,您应该调用:

String param2 = (String)request.getSession(false).getParameter("p2");
// or session1.getParameter("p2"); 
// if you add false where you create the variable.

您想在getSession中使用false参数,因为如果用户已登录并且您想使用过滤器重定向它们而不是创建我认为的新会话,则用户必须拥有会话。

我更喜欢这样写它

<c:choose>
    <c:when test="${not empty param}">
        <c:redirect url="empLogin.jsp"/>
    </c:when>
    <c:otherwise>
       <c:redirect url="target.jsp"/>
    </c:otherwise>
</c:choose>

希望它能回答你的问题,如果我误解你的问题,请随时发表评论:)