Как вы можете получить исходный REQUEST_URI из действия Struts 2, доступного через перенаправление apache ErrorDocument?

Как получить доступ к REQUEST_URI из действия Struts 2? В perl/php/ruby он легко доступен через ENV["REQUEST_URI"] и тому подобное. В java кажется, что PageContext.getErrorData().getRequestURI() — это то, что я ищу, но, к сожалению, PageContext, похоже, не определен в действии, либо потому, что перенаправление ErrorDocument делает запрос не похожим на ошибка, или потому что она определена позже.

Конкретный пример

Учитывая приложение struts 2 с интерфейсом apache (mod_jk/ajp) на tomcat, доступное через конфигурацию ErrorDocument 404 в apache. Со следующими деталями:

-- Исходный URL-адрес запроса (который вызывает ошибку 404) --

http://server/totally/bogus/path

-- http.conf --

ErrorDocument 404 /struts2app/lookup.action

-- действие стойки --

public String bogusUrlLookup() {
    HttpServletRequest request = ServletActionContext.getRequest();

    // contains /lookup.action as does request.getRequestURI();
    String url = RequestUtils.getServletPath(request);

    // PageContext is null, so I cannot reach ErrorData from it.
    log.info("pageContext="+ServletActionContext.getPageContext());

    // Not in the ENV
    // Map env = System.getenv();

    // Not in the ATTRIBUTES
    // request.getAttributeNames()

    // Not in HEADER
    // request.getHeaderNames()

    return ERROR;
}

Опять же, все, что мне нужно, это строка «/totally/bogus/path», но в приведенном выше действии единственная строка URL, которую я могу найти, это «/struts2app/lookup.action». Я привязан к ErrorDocument, потому что полностью/фиктивный/путь вряд ли будет находиться в пространстве имен моего приложения, потому что apache обслуживает другие ресурсы, отличные от tomcat.


person andynu    schedule 30.07.2009    source источник


Ответы (3)


request.getAttribute("javax.servlet.forward.request_uri")

person Community    schedule 13.08.2009
comment
Неа. Это ноль в данном контексте. - person andynu; 09.09.2009

Использовать:

JkEnvVar REDIRECT_URL ""

в вашем файле httpd.conf. Затем используйте request.getAttribute("REDIRECT_URL");, чтобы получить переменную в ваших jsp/сервлетах.

person Sanjay Sheoran    schedule 08.09.2010

Если вы не хотите пропустить часть строки запроса, это лучше:

final String referrer = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
if(referrer != null) {
    final String query = (String) request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING);
    if(query != null && query.length() > 0) {
        url = referrer+ "?" + query;
    }
    else {
        url = referrer;
    }
// do something

}
person user1079877    schedule 02.10.2014