如何确保网址中没有任何参数?

时间:2015-11-06 00:37:27

标签: java jsp

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

示例网址为: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

我发现相关但在我的案例中无用的问题是1234

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

7 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:4)

<强>跟进

由于新的要求必须在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
    }
}

以下是两种检查&#34;无查询参数的方法&#34;:

// 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

答案 2 :(得分:2)

试试这个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;

答案 3 :(得分:2)

不确定您的意思&#34;以确保没有任何参数&#34; ..您不能,客户可以使用他们想要访问您服务器的任何网址。您只能选择根据服务器代码接收的URL字符串进行处理。

否则,这里有两个指针:

  1. 您是否尝试检查或解析网址?如果是这样,你可以做到: url.indexOf(&#39;?&#39;)&lt; 0,假设url varialble有整个url string ...

  2. 另请参阅Java URL api以获取查询字符串等

答案 4 :(得分:2)

JSP持有一个隐式对象paramValue,它将请求参数映射到数组。您可以使用此对象和JSTL length函数直接在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" %>

答案 5 :(得分:2)

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

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

现在,实际的URL可以是任何内容。我们可以将其标记为。* ,这意味着什么。 (Dot =任何字符,* =零次或更多次。有更复杂的正则表达式来检查URL,但是你说你有URL,因此它们并不相关)。

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

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

因此,我们要检查问号,然后检查键和值的组合。正则表达式将是:

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

匹配一个问号,后跟:一个键(。),一个等号,一个值(。)和一个可能的&amp; (&amp;?),1次或多次(+)

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

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

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

P.S:问号之前的双斜线是为了java而不是正则表达式。

链接:Regex checker with the following regex & example

如果要在JSP中使用它,只需将此方法放入scriplet(以&lt;%开头并以%&gt;结尾)或实际代码中的任何其他位置。

答案 6 :(得分:2)

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