jax rs(jersey)在javax.servlet.Filter中看不到远程用户头

jax rs(jersey)在javax.servlet.Filter中看不到远程用户头,java,tomcat,authorization,jersey,jax-rs,Java,Tomcat,Authorization,Jersey,Jax Rs,我正在使用jax-rs(jersey)创建一个其他用户可以访问的网站/web服务,我已经到了必须添加身份验证/授权的地步;为了使用安全注释,我实现了一个javax.servlet.Filter,其url模式为*/ Apache在我的tomcat实例前面运行,验证凭据并将REMOTE\u USER头传递给我的web服务,这样我就可以确定用户可以访问哪些资源。我的问题是,无论我看到什么请求对象,我都看不到REMOTE\u USER头;我还尝试使用@Context参数注入请求,但没有效果 请帮帮我 w

我正在使用jax-rs(jersey)创建一个其他用户可以访问的网站/web服务,我已经到了必须添加身份验证/授权的地步;为了使用安全注释,我实现了一个
javax.servlet.Filter
,其url模式为
*/

Apache在我的tomcat实例前面运行,验证凭据并将
REMOTE\u USER
头传递给我的web服务,这样我就可以确定用户可以访问哪些资源。我的问题是,无论我看到什么请求对象,我都看不到
REMOTE\u 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>
    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");
...

HttpServletRequest.getAttribute()
getAttributeNames()
与HTTP头无关。尝试
getHeaderNames()
getHeaders()


也不是添加servlet过滤器,您可以考虑添加Jersey过滤器-参见

马丁,我会给出您的答案一试;你能给我一些关于为什么球衣过滤器更好的上下文吗?我也不知道如何连接它,以便使用安全注释;我了解factory init param,但是Jersey如何找到我的筛选器/安全上下文对象?Jersey筛选器更好,因为它适用于Jersey servlet/filter中的所有调用,也就是说,您不必手动确保auth筛选器和Jersey筛选器都使用相同的URI映射。此外,在Jersey筛选器中,您可以插入Jersey提供的一些有用的附加信息(例如UriInfo或HttpHeaders),您可以设置自己的SecurityContext等。不确定factory init param是什么意思。Jersey找到您的筛选器,因为您必须将文件管理器类的名称放入Jersey筛选器init参数中,如我链接的页面上所述。