【问题标题】:Passing parameter values using a href, storing and retrieving them using session only with JSP's使用 href 传递参数值,仅使用 JSP 的 session 存储和检索它们
【发布时间】:2014-05-23 03:32:35
【问题描述】:

与我的问题所暗示的相反,我完全理解在 JSP 中包含任何形式的代码都是不正确的。但我有一个重要的任务要完成,这就是场景: 单击链接后,无论传递的参数是什么,都将被截断(出于安全原因),我需要在用户登录后以某种方式获取这些参数。我正在尝试使用会话来执行此操作.

我有四个 JSP 页面说:

  1. routing.jsp
  2. intermediateTarget.jsp
  3. login.jsp
  4. target.jsp

以及带有链接和一些参数的页面:

< 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 包含的东西。

另外,我已经阅读了尝试提取? 之后的 URL 部分的内容,甚至还谈到了提取深层链接的概念,但我没有得到任何结果。

抱歉,如果帖子看起来太长。只是想清楚地了解我的情况,以及对此的任何其他想法将不胜感激。

提前非常感谢!

【问题讨论】:

    标签: java jsp url-rewriting httpsession


    【解决方案1】:

    首先,我不明白为什么您不想要 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>
    

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

    【讨论】:

    • 我已将 scriptlet 替换为 scriptlet 标签。另外,我对使用 JSTL 标签不是很熟悉,这就是为什么我尝试用 if-else 条件编写它们。
    • 我可以从intermediateTarget.jsp 中的会话中获取参数,但我不知道如何从那里开始。
    • 当您说test="${not empty param}" 时,我是否在此处传递隐藏字段名称然后检查条件?另外,我在两个不同的jsp中有两个隐藏字段,一个在router.jsp上,另一个在empLogin.jsp上,我试图在intermediateTarget.jsp中获取以检查从哪个页面获取请求,response.sendRedirect该请求到相应的jsp,然后在该jsp页面上获取这些参数并将其再次附加到url。
    • 很抱歉我的解释不好,但我很累,也没有任何环境可以测试它。 '${not empty param}' 是一个 el 表达式,用于检查请求或会话变量参数是否存在,您可以直接将其值与页面内的 'code ${param}' 一起使用来打印它出去。对我来说,脚本属于其他地方,我总是选择 servlet 来进行此类验证,所以我认为在 scriptlets 中使用纯 java 更容易,jstl 基本上是一个“代码 if(param!= null)”是相同的作为 el-expression 中的 'code test="${not empty param}"'
    • 很难说,因为我不知道你想用它们做什么,或者你打算如何使用它们。所以解释很笼统如果你在会话中有它们,你不必访问它们只是为了将它们传递到下一页,它们已经在那里了。因为看起来它们只是消耗额外资源的未使用变量。
    猜你喜欢
    • 2014-06-27
    • 2015-03-04
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多