【问题标题】:How to determine if a parameter has been "posted" or "geted" from Java?如何确定参数是从 Java 中“发布”还是“获取”?
【发布时间】:2009-06-17 22:33:01
【问题描述】:

在 ASP 中,有 request.formrequest.queryString 属性,但在 Java 中。好像我们只有一个集合,可以通过request.getParamaterMapgetParametersNamesgetParameterValues等访问。

有什么方法可以知道哪些值已发布,哪些值已在 URL 中指定?


PS:

我想要实现的是做一个可以处理以下情况的页面

  • 读取来自查询字符串(get)的变量
  • 阅读具有特定名称(例如“xml”)的单个帖子。
  • 如果缺少该帖子,请阅读整个正文(带有 request.getReader())。

我正在使用 tomcat 6。

根据我目前看到的情况,如果我发出request.getReader(),发布的值将不再出现在getParamater 集合中,但查询字符串参数仍然存在。

另一方面,如果我发出任何getParameters 方法,getReader 将返回空字符串。

看来我不能同时吃蛋糕。

所以,我想解决方案如下:

  • 使用getReader阅读正文。
  • 查看xml帖子是否存在(缺点,我必须手动解析正文。
  • 如果是,获取http消息体,去掉“xml=”部分。
  • 如果不是,那就拿尸体吧。
  • 通过request.getParameter读取查询字符串参数

有更好的主意吗?

  • PS:有人知道如何使用相同的方法解析正文吗 被HttpServlet使用?
  • PS:Here是一个解码ASP函数。我要改写吗 Java?
  • PS:还有found(暂时没有机器可以测试)

只是为了澄清一些事情。问题似乎是使用getParameter,您会获得发布的值以及通过 URL 传递的值,请考虑以下示例:

<%@page import="java.util.*"%>
<%
  Integer i;
  String name;
  String [] values;

  for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {

    name = (String) e.nextElement();
    values = request.getParameterValues( name );

    for ( i=0; i < values.length; i ++ ) {
      out.println( name + ":" + values[i] + "<br/>" );
    }
  }
%>

<html>
<head><title>param test</title>
</head>
<body>
  <form method="post" action="http://localhost:8080/jsp_debug/param_test.jsp?data=from_get">
    <input type="text" name="data" value="from_post">
    <input type="submit" value="ok">
  </form>
</body>
</html>

这段代码的输出是

data:from_get
data:from_post

...

似乎为了找到哪个参数来自哪里,我必须检查request.getQueryString

【问题讨论】:

  • 您使用的是什么服务器?太阳HttpServer?
  • 您应该获取整个 URL 并反序列化参数。如果你想要的参数在那里,它就是一个 GET。如果它不存在但存在,那么它是一个 POST 参数。

标签: java http post get


【解决方案1】:

HttpServletRequest.getMethod():

返回发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。与 CGI 变量 REQUEST_METHOD 的值相同。

您需要做的就是:

boolean isPost = "POST".equals(request.getMethod());

我也很困惑为什么你不简单地使用request.getParameter("somename") 来检索作为请求参数发送的值。这个方法returns the parameter regardless of whether the request was sent via a GET or a POST

请求参数是随请求发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发布的表单数据中。

这比尝试自己解析 getQueryString() 简单得多。

【讨论】:

  • 如果帖子是使用 http 的正文而不是参数,我无法使用 request.getParameter("somename") 获取它,我必须使用 request.getReader().. . 之后我不能再使用 request.getParameter
  • 另外,别忘了我可以发布一个带有查询字符串信息的帖子,(你只需要在表单标签的 action 参数中添加类似 'xx.jsp?field1=value1,field2=value2' 的内容),在这种情况下,request.getMethod 将返回“POST”,但我会将“posted”和“geted”参数都混合在 getParameter 集合中......这就是问题所在......
  • 那么我认为您使用不同或不正确的术语来描述您的问题。读取 postdata 或 multipart 数据与仅读取“参数”不同
  • 事实上我对java很陌生,我可能会有点混淆......但我认为这与多部分的东西无关(我的意思是,表单没有enctype属性完全)...我已经更新了问题以澄清事情...
  • 或者更好:HttpMethod.GET.matches(request.getMethod())。相应地发布。
【解决方案2】:

没有直接的方法。 非直接 - 检查 .getQueryString()

【讨论】:

    【解决方案3】:

    如果您正在编写一个 servlet,您可以通过调用 doGet 还是 doPost 方法来区分。

    public void doGet(HttpServletRequest request,
                        HttpServletResponse response)
          throws ServletException{
    
     //Set a variable or invoke the GET specific logic
       handleRequest(request, response);
    
    }
    
    public void doPost(HttpServletRequest request,
                        HttpServletResponse response)
          throws ServletException{
    
     //Set a variable or invoke the POST specific logic
     handleRequest(request, response);
    
    }
    
    
    public void handleRequest(HttpServletRequest request,
                        HttpServletResponse response)
          throws ServletException{
    
     //Do stuff with the request
    
    }
    

    【讨论】:

    • 你可以有一个获取信息的帖子,请参阅我对 matt b 的评论
    【解决方案4】:

    你为什么不从检查查询字符串参数开始,如果你没有看到,假设一个帖子然后挖出表单变量?

    【讨论】:

    • querystrings 参数没问题,我想我总会有它们......问题是一旦我发出 getReader,getParamters 不再返回发布的值......我希望避免解析我自己的帖子...
    【解决方案5】:

    我在我的过滤器中做了这个,所以也许有一天有人可以使用它。

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest sreq = (HttpServletRequest)servletRequest;
        System.out.println(sreq.getMethod());
    }
    

    【讨论】:

      【解决方案6】:

      我知道它不能解决您的问题,但如果我没记错的话,在使用 Struts 时,如果您的变量是在查询字符串或帖子正文中发送的,则会填充 ActionForm。

      我找到了 RequestUtils 类的源代码,也许“populate”方法就是你需要的:

      http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java

      【讨论】:

        【解决方案7】:

        您可以使用 request.getMethod() 来获取任何方法。我正在为此使用 HandlerInterceptor。

        检查此代码:

        public class LoggingMethodInterceptor implements HandlerInterceptor {
        
        Logger log = LoggerFactory.getLogger(LoggingMethodInterceptor.class);
        
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            log.info("[START]  [" + request.getMethod() + "] [" + request.getRequestURL() + "] StartTime: {} milliseconds",
                    System.currentTimeMillis());
            return true;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-24
          • 1970-01-01
          • 1970-01-01
          • 2013-06-08
          • 2014-03-07
          • 1970-01-01
          • 2019-11-08
          相关资源
          最近更新 更多