Как получить текущий абсолютный URL со строкой запроса в JSF?


Я пытаюсь получить абсолютный URL-адрес в прослушивателе действий моего управляемого Боба. Я использовал:

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

Но фактический URL-адрес: http://localhost:7101/POSM/pages/catalog-edit?_adf.ctrl-state=gfjk46nd7_9&articleReference=HEN00067&_afrLoop=343543687406787. Я не знаю, почему параметр artcileReference опускается.

Есть ли какой-либо метод, который может дать мне весь URL сразу? Как я могу получить весь URL-адрес со всей строкой запроса?

2 3

2 ответа:

Вы можете восстановить свой 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();
}

Здесь я пришел к своему решению, взяв идею ответа, данного Александром, считая, что 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();
}