jax-rs (jersey) не может видеть заголовок REMOTE_USER в javax.servlet - PullRequest
0 голосов
/ 15 марта 2012

Я использую jax-rs (jersey) для создания веб-сайта / веб-службы, к которым могут обращаться другие пользователи, и я пришел к тому, что добавление аутентификации / авторизации является необходимостью;так что я могу использовать аннотации безопасности, я реализовал javax.servlet.Filter с URL-шаблоном */.

Apache работает перед моим экземпляром tomcat, проверяет учетные данные и передает заголовок REMOTE_USER в мой веб-сервис, чтобы я мог определить, к каким ресурсам пользователь имеет доступ.Моя проблема в том, что независимо от того, на какой объект запроса я смотрю, я не вижу заголовка REMOTE_USER;Я также пытался внедрить запрос с параметром @Context, но безрезультатно.

Пожалуйста, помогите мне.

web.xml:

<web-app ...>
<display-name>ws</display-name>
<filter>
    <filter-name>REST Service</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>base.resources</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>WEB-INF/views</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <param-value>/(js|css|(WEB-INF/views))/.*</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>auth-filter</filter-name>
    <filter-class>base.auth.AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>auth-filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>REST Service</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

filter.java:

    public void doFilter(ServletRequest req, ServletResponse response, FilterChain next) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;      
    HttpSession session = request.getSession();
    AuthUser userPrincipal = null;
    Object sessionUser = session.getAttribute("user");
    if(sessionUser != null) userPrincipal = (AuthUser) sessionUser;
    else userPrincipal = new AuthUser();

    // load in the user principal
    Enumeration eheaders = req.getAttributeNames();
    while(eheaders.hasMoreElements()){
        System.out.println(eheaders.nextElement().toString());
    }

    String user = (String) req.getAttribute("REMOTE_USER");
...

1 Ответ

1 голос
/ 16 марта 2012

HttpServletRequest.getAttribute() и getAttributeNames() не имеют ничего общего с HTTP-заголовками. Попробуйте getHeaderNames() и getHeaders()

Кроме того, вместо добавления фильтра сервлетов, вы можете рассмотреть возможность добавления фильтра Джерси - см. http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html

...