【问题标题】:How to get HTTP post parameter in JSP如何在 JSP 中获取 HTTP post 参数
【发布时间】:2013-03-22 12:48:07
【问题描述】:

我是 JSP 的新手。我有一个jsp页面,其中一个参数通过http post传递给这个jsp页面。如图所示,我可以在 firebug 中看到参数。

但在我的页面中,当我尝试打印令牌变量时,该变量始终为空。我按如下方式打印变量:

     <%
        String token = request.getParameter("token");
     %>

我做错了什么?如何获取令牌参数?

【问题讨论】:

  • 你是如何打印值的?
  • 它不会打印任何东西——它完全按照它所说的去做,得到价值。
  • 我正在通过 打印值
  • 我尝试了两种方式 和 都为空

标签: jsp http-post


【解决方案1】:

token 属性在我看来类似于 nonce,并且某些安全过滤器可能会从请求对象中删除该值。

您为打印该值所做的操作是绝对正确的。我不会寻求最佳实践,但它应该可以工作。

检查您的代码是否有安全过滤器,看看您是否可以找出值被删除/覆盖的位置。

看到你的 web.xml 之后。

使用 POST 将值传递给域。请求在内部被重定向到欢迎页面并且值丢失。如果您使用 GET 传递值,则该值将被保留。

你有两个选择:

  1. 创建一个直接 url 并使用帖子将值传递给它,就像您正在做的那样。例如:url - yourdomain.com/welcome.jsp。
  2. 请求其他项目在url中传递参数(GET请求)。

我都测试过了,效果很好。

【讨论】:

  • 嗨,这是我没有检查的一件事。首先感谢您的回答。我刚刚检查了我的 web.xml 文件,但在我的 web.xml 文件中看不到任何过滤器。有什么我可以检查任何其他过滤器的吗?任何其他帮助也会很棒。
  • 您需要提供有关您正在使用的框架的更多信息。您的 web.xml 应该提供一些提示。如果没问题,那么你可以发布它。
  • 你能给我你的电子邮件地址吗?由于某些安全问题,我更喜欢将其发布在您的电子邮件上而不是公开。
  • 当前请求重定向到welcome.jsp 后,我仍然可以在firebug 中看到发布的令牌变量。您仍然认为我的问题是由于重定向引起的吗?如果是,第一个选项对我来说更可行。但是我怎样才能重定向帖子?谢谢
【解决方案2】:

这里有一些检查。

1) JSP 页面中带有 method="post" 的表单。

<form name="form1" action="nextpage" method="post">

2) JSP 上的控件名称是token。 喜欢。

 <input type="text" name="token" value="chintan"/>

3) 你得到的是提交按钮而不是按钮的意思。

<input type="submit" name="submit" value="submit"/>

在检查了所有这些点之后。它会给你确切的错误。而且您将能够轻松修复它。

【讨论】:

  • 还要检查你的加密类型不是多部分/数据。
【解决方案3】:

根据屏幕截图,POST 请求产生HTTP 302 response,这意味着它已被重定向。重定向基本上指示客户端在给定的 URL 上触发全新的 HTTP 请求。这不会以某种方式神奇地接管先前请求中的所有请求参数。

您需要自己传递希望在重定向请求中保留的请求参数以及重定向 URL:

String token = request.getParameter("token");
response.sendRedirect("/CR?token=" + URLEncoder.encode(token, "UTF-8"));

另一种方法是根本不执行重定向,而只是转发。这是否是正确的方法取决于问题中没有详细说明的具体功能要求。要了解差异,请仔细阅读RequestDispatcher.forward() vs HttpServletResponse.sendRedirect(),当然还有our servlets wiki page,以了解如何正确使用 servlet 来满足此类需求。 JSP 页面根本不适合这项工作。

【讨论】:

    【解决方案4】:

    正如您在图片中看到的,http 响应代码是 302

    这就是为什么你无法获取token参数的原因,因为当浏览器进入你的jsp页面时,它是来自重定向,而不是请求转发。

    也就是说,你的浏览请求你的jsp页面没有任何参数...

    您可以检查您发布的操作是否为 servlet,然后重定向到 jsp 页面????

    检查您的操作代码并更改代码

    response.sendRedirect....
    

    到

    request.getRequestDispacher("your jsp page path").forword(request, response)
    

    或者直接修改表单提交到jsp页面

    <form action="your jsp page link">
    ...
    </form>
    

    【讨论】:

      【解决方案5】:

      对此的首选习惯用法是使用表单中的 servlet,而不是 JSP。然后,servlet 可以稍后将 JSP 用作视图。原因之一是避免做你看起来正在做的事情:将 java 代码放在页面上,并可能将演示与逻辑混为一谈。

      但是,如果您别无选择,我建议您使用 JSTL:

      <c:forEach var="par" items="${paramValues}">
          <c:if test="${fn:startsWith(par.key, 'token')}"> 
              ${par.key} = ${par.value[0]};
          </c:if>
      </c:forEach>
      

      或者在 Java 中:

      <%@ page import = "java.util.Map" %>
      <%
      Map<String, String[]> parameters = request.getParameterMap();
      for(String parameter : parameters.keySet()) {
          if(parameter.toLowerCase().startsWith("token")) {
              String[] values = parameters.get(parameter);
          }
      }
      %>
      

      【讨论】:

      • parameters.get() 与 request.getParameter 不同吗?
      • parameters.get() 是从 Map 参数中提取值,request.getParameter 直接从请求对象中提取。 Map 的优势在于,如果您没有完全正确地获取名称,您可以遍历 Map 并查看传递给 JSP 的内容,而不是您认为应该传递的内容。
      • 我可以通过 parameters.get("token") 获取参数吗?将只有一个参数传递给我的页面。谢谢。
      • 是的,你可以。但这与说request.getParameter("token") 完全相同,你说它失败了。所以......要么有其他问题,要么参数名称不完全是“令牌”。
      • 我确实回答了最初提出的问题。屏幕截图和其他信息稍后出现(并彻底改变了问题)。
      【解决方案6】:

      jsp页面可以使用${param.token}打印请求参数

      【讨论】:

      • 仔细看截图,POST的结果是302响应。
      【解决方案7】:

      你可以像这样打印

      ${param.token}
      

      这将打印值

      【讨论】:

      • 谢谢。我已经类似地打印了令牌变量,但它始终为空。
      • 其实就是请求参数,在servlet中请求需要重新设置
      • 您在请求中设置该参数的位置
      • 你这是什么意思。我不能道歉。
      • 你从 jsp 发送了那个请求。所以它在 jsp 中是可用的。
      猜你喜欢
      • 2016-10-09
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2017-01-28
      相关资源
      最近更新 更多