3

我试图在我的托管 bean 的动作侦听器中获取绝对 URL。我用过:

HttpServletRequest#getRequestURL() // returning http://localhost:7101/POSM/pages/catalog-edit
HttpServetRequest#getQueryString() // returning _adf.ctrl-state=gfjk46nd7_9

但实际网址是:http://localhost:7101/POSM/pages/catalog-edit?_adf.ctrl-state=gfjk46nd7_9&articleReference=HEN00067&_afrLoop=343543687406787. 我不知道为什么参数artcileReference被省略。

有什么方法可以一次给我整个网址吗?如何获取包含所有查询字符串的整个 URL?

4

2 回答 2

5

您可以使用实例手动重建您的 URL,ServletRequest#getParameterNames()并且ServletRequest#getParameter()两者都可用。HttpServletRequest

这是我过去为此目的使用的示例代码:

private String getURL()
{
    Enumeration<String> lParameters;
    String sParameter;
    StringBuilder sbURL = new StringBuilder();
    Object oRequest = FacesContext.getCurrentInstance().getExternalContext().getRequest();

    try
    {
        if(oRequest instanceof HttpServletRequest)
        {
            sbURL.append(((HttpServletRequest)oRequest).getRequestURL().toString());

            lParameters = ((HttpServletRequest)oRequest).getParameterNames();

            if(lParameters.hasMoreElements())
            {
                if(!sbURL.toString().contains("?"))
                {
                    sbURL.append("?");
                }
                else
                {
                    sbURL.append("&");
                }
            }

            while(lParameters.hasMoreElements())
            {
                sParameter = lParameters.nextElement();

                sbURL.append(sParameter);
                sbURL.append("=");
                sbURL.append(URLEncoder.encode(((HttpServletRequest)oRequest).getParameter(sParameter),"UTF-8"));

                if(lParameters.hasMoreElements())
                {
                    sbURL.append("&");
                }
            }
        }
    }
    catch(Exception e)
    {
        // Do nothing
    }

    return sbURL.toString();
}
于 2013-05-31T05:50:10.150 回答
1

在这里,我想出了我的解决方案,考虑到亚历山大给出的答案,考虑到这种HttpServletRequest#getParameterValues()方法:

protected String getCurrentURL() throws UnsupportedEncodingException {
    Enumeration parameters = getServletRequest().getParameterNames();
    StringBuffer urlBuffer = new StringBuffer();
    urlBuffer.append(getServletRequest().getRequestURL().toString());

    if(parameters.hasMoreElements()) {
        if(!urlBuffer.toString().contains("?")) {
            urlBuffer.append("?");
        } else {
            urlBuffer.append("&");
        }
    }

    while(parameters.hasMoreElements()) {
        String parameter = (String)parameters.nextElement();
        String[] parameterValues = getServletRequest().getParameterValues(parameter);

        if(!CollectionUtils.sizeIsEmpty(parameterValues)) {
            for(int i = 0; i < parameterValues.length; i++) {
                String value = parameterValues[i];

                if(StringUtils.isNotBlank(value)) {
                    urlBuffer.append(parameter);
                    urlBuffer.append("=");                            
                    urlBuffer.append(URLEncoder.encode(value, "UTF-8"));

                    if((i + 1) != parameterValues.length) {
                        urlBuffer.append("&");
                    }
                }                                                                        
            }
        }                                    

        if(parameters.hasMoreElements()) {
            urlBuffer.append("&");
        }
    }

    return urlBuffer.toString();
}
于 2013-05-31T07:20:24.853 回答