портлет: renderUrl — как сделать URL относительным?

#https #portlet #relative-path #taglib

#https #портлет #относительный путь #taglib

Вопрос:

У меня проблема со ссылкой http и https в портлетах. Я работаю с jboss liferay 6.0, но в данном случае это не имеет значения.

Портлеты могут использоваться в режиме http или https. Тег портлета создает абсолютный URL. Мне нужен этот относительный для корректной работы с http и https.

Я знаю атрибут secure, но я не хочу, чтобы он всегда был безопасным.

 <portlet:renderURL var="detailLink">
    <portlet:param name="id" value="${recordId}" />
    <portlet:param name="backURL" value="${backLink}" />
</portlet:renderURL>
  

Пожалуйста, нет javascript для этого.

Спасибо

Комментарии:

1. Не могли бы вы просто манипулировать detailLink вручную?

2. Я использую этот тег во многих портлетах. Должен ли я создать свой собственный тег для чего-то, что должно быть уже решено, или я действительно только один с этой проблемой? Спасибо.

3. На одном сайте один и тот же портлет должен содержать несколько URL http -адресов, а некоторые https — это то, что вы хотите?

4. Нет, когда я захожу на веб-страницу http://whatever.com , я хочу видеть ссылки на этой странице http://whatever.com/nextPage . Но когда я захожу на веб-страницу https://whatever.com , я хочу видеть ссылки на этой странице https://whatever.com/nextPage

Ответ №1:

На сервере вы будете знать, находитесь ли вы в режиме http или http. Итак, вы могли бы создать его на стороне сервера, используя что-то вроде этого

 PortletUrl detailLink renderResponse.createRenderUrl();
detailLink.setSecure(renderRequest.isSecure());

//set all the params on detailLink here

model.setAttribute("detailLink",detailLink);
  

Ответ №2:

Здесь можно использовать концепцию относительного URL

Если вы не хотите продолжать работу с javascript, вы можете создать метод Java на своей странице jsp, предпочтительно на обычной странице jsp, такой как init.jsp, и поместить следующий метод:

 <%!

private String _getRelativePath(String cURL) {
        if (Validator.isNull(cURL)) {
            return cURL;
        }

        if (cURL.startsWith(Http.HTTP)) {
            int pos = cURL.indexOf(
                StringPool.SLASH, Http.HTTPS_WITH_SLASH.length());

            cURL = cURL.substring(pos);
        }

        return cURL;
}

%> 
  

Вы можете вызвать этот метод для своего URL, и он вернет строку, содержащую путь и параметры.

Например; если вы передаете cURL как

 http://localhost:8080/web/guest/home?p_p_id=58amp;p_p_lifecycle=1amp;p_p_state=pop_upamp;p_p_mode=viewamp;_58_struts_action=/login/login
  

затем он вернет

 /web/guest/home?p_p_id=58amp;p_p_lifecycle=1amp;p_p_state=pop_upamp;p_p_mode=viewamp;_58_struts_action=/login/login
  

Также вы можете использовать метод ThemeDisplay.getURLPortal() для разделения абсолютного URL, чтобы получить из него требуемый относительный URL.

 <%!

private String _getRelativePath(String cURL, ThemeDisplay themeDisplay) {

        if (Validator.isNull(cURL)) {
            return cURL;
        }

        String [] urlArr = cURL.split(themeDisplay.getURLPortal());

        return urlArr[1];
}

%>
  

Этот механизм удовлетворит вашим требованиям.