【问题标题】:How to make sure there is not any parameter in the url?如何确保url中没有任何参数?
【发布时间】:2015-11-06 00:37:26
【问题描述】:

我知道如何确定网址中是否存在特定参数。 我想确保 url 中没有任何参数,而不仅仅是指定的参数。我怎样才能做到这一点?我有一长串参数,为所有参数列出一个条件列表似乎效率低下。

示例网址为:www.domain.com/Product/UniqueId

由于每个产品都有许多独特的参数,用户可能会通过产品的唯一代码、唯一供应商、唯一 sig、唯一 pod 等进入产品页面。

例如:

www.domain.com/Product/UniqueId?code=uniqueCode
www.domain.com/Product/UniqueId?sig=uniqueSig
www.domain.com/Product/UniqueId?pod=uniquepod
www.domain.com/Product/UniqueId?circle=circleNumber&location=Location&color=Color

我认为相关但对我没有用的问题是1,2,3,4

我需要在 JSP 而不是 Java 中进行此类测试。

【问题讨论】:

  • @markspace URL 类是什么意思?你能给我举个例子吗?

标签: java jsp


【解决方案1】:

使用 URI 类会更容易一些:

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;

public class UrlTest2
{

   public static void main( String[] args )
           throws MalformedURLException, URISyntaxException
   {
      URI url = new URI( "www.domain.com/Product/UniqueId" );
      System.out.println( url.getQuery() );  // prints "null"
      URI url2 = new URI( "www.domain.com/Product/UniqueId?pod=uniquepod" );
      System.out.println( url2.getQuery() );  // prints "pod=uniquepod"
   }
}

所以如果getQuery() 返回null,则没有参数。否则,有。

关于您的编辑:好吧,我真的不建议将代码放在 JSP 中。现在被认为是不好的做法。

但如果必须的话,看起来你可以要求所有参数,如果结果为 0,则没有任何参数。

<%
   Map params = request.getParameterMap();
   boolean noParams = (params.getSize() == 0);
%>

JSP 代码未经测试,但应该会给您这个想法。然后,您可以稍后在 JSP 代码中使用布尔值 noParams

【讨论】:

  • 谢谢,但我需要在 jsp 而不是 Java 中进行此类测试。
  • @Jack 您真的不应该在视图 (JSP) 中测试代码。视图最多应该很薄。将代码移动到可以对其进行测试的 servlet。
【解决方案2】:

跟进

鉴于必须在 JSP 中完成的新要求,即使下面原始答案中列出的 Spring 处理程序代码可以添加带有相关信息的 Model 属性,这里是如何做到这一点的。

类似的两种方式如下:

<!-- Use the parameter Map -->
<c:if test="${empty param}">
  <!-- no query parameters given -->
</c:if>
<!-- Use the request object -->
<c:if test="${pageContext.request.queryString == null}">
  <!-- no query parameters given -->
</c:if>

原答案

你标记了spring-mvc,所以这意味着你有这样的东西(如果你发布它会很好)

@Controller
public class ProductController {

    @RequestMapping("/Product/UniqueId")
    public String uniqueId(Model model,
                           @RequestParam(path="code"    , required=false) String code,
                           @RequestParam(path="sig"     , required=false) String sig,
                           @RequestParam(path="pod"     , required=false) String pod,
                           @RequestParam(path="circle"  , required=false) String circle,
                           @RequestParam(path="location", required=false) String location,
                           @RequestParam(path="color"   , required=false) String color) {
        // code here
    }
}

这里有两种检查“无查询参数”的方法:

// Get all parameters in a Map
public String uniqueId(Model model,
                       ...,
                       @RequestParam Map<String, String> allParams) {
    if (allParams.isEmpty()) {
        // no query parameters given
    }
    // code here
}
// Use the request object
public String uniqueId(Model model,
                       ...,
                       HttpServletRequest request) {
    if (request.getQueryString() == null) {
        // no query parameters given
    }
    // code here
}

您可能想查看此链接以了解 Spring 可以为您提供的所有各种类型的参数:
http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-arguments

【讨论】:

  • 谢谢,但我需要在 jsp 而不是 Java 中进行此类测试。
  • @Jack 如果你不想使用它,你到底为什么要标记它spring-mvc。 Spring 处理程序可以执行逻辑并向模型添加Boolean,指示参数是否存在。
  • @Andreas 我不知道为什么我收到了一半的赏金而不是你。如果你喜欢你可以询问它,因为我真的不明白,最好
  • @MasterSlave S'ok 我。 :-)
【解决方案3】:

试试这个http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#contains(java.lang.CharSequence)

我给你的代码只是为了找到url中传递的任何参数。它不会给出这样的参数数量..

String stringObj ="www.domain.com/Product/UniqueId";
(stringObj.contains("?"))?true: false;

【讨论】:

  • 谢谢,但我需要在 jsp 而不是 Java 中进行此类测试。
【解决方案4】:

不确定您所说的“确保没有任何参数”是什么意思。您只是不能,客户端可以使用他们想要访问您的服务器的任何 URL。您只能选择根据您的服务器代码收到的 URL 字符串进行处理。

否则,这里有两个指针:

  1. 您是否尝试检查或解析 URL?如果是这样,您可以这样做: url.indexOf('?')

  2. 另见Java URL api获取查询字符串等

【讨论】:

  • 谢谢,但我需要在 jsp 而不是 Java 中进行此类测试。
【解决方案5】:

JSP 持有一个隐式对象paramValue,它将请求参数映射到一个数组。你可以使用这个对象和JSTLlength函数直接在jsp中学习参数个数,类似

<c:if test="${fn:length(paramValues) gt 0}">...</c:if>

确保在 jsp 页面的开头包含以下标记库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

【讨论】:

    【解决方案6】:

    我们可以使用 Regex 轻松检查参数。假设您有以下网址:

    www.domain.com/Product/UniqueId?foo=bar
    www.domain.com/Product/UniqueId
    

    现在,实际的 URL 可以是任何东西。我们可以将它标记为 .*,这意味着任何东西。 (点 = 任何字符,* = 零次或多次。有更复杂的正则表达式来检查 URL,但你说你得到了 URL,因此它们不相关)。

    匹配您的 URL 后,您需要检查参数。 参数的语法为:

    ?key=value&key=value&key=value...
    

    所以我们要检查一个问号,然后是键和值的组合。正则表达式是:

    \?((.*=.*)(&?))+
    

    与问号匹配,后跟:键 (.)、等号、值 (.) 和可能的 & (&?)、1 次或多次 (+)

    所以你可以把它放在这样的方法中:

    public boolean hasParameters(String url){
        return url.matches(".*\\?((.*=.*)(&?))+");
    }
    

    www.domain.com/Product/UniqueId?foo=bar 会匹配正则表达式,而 www.domain.com/Product/UniqueId 不会,因为它后面没有参数。

    PS:问号前的双斜杠是为了java,而不是为了正则表达式。

    链接:Regex checker with the following regex & example

    如果你想在 JSP 中使用它,只需将此方法放在一个脚本中(以 结束),或者实际上在代码中的任何其他位置。

    【讨论】:

      【解决方案7】:

      使用java.net.URI 的方法来获取有关URL 的所有信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2019-11-10
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多