如何让我的ContainerRequestFilter在onOpen上调用@ServerEndpoint?

时间:2017-06-12 15:27:46

标签: java java-ee websocket jax-rs

我有一个Web套接字@ServerEndpoint,它有一个我的过滤器监听的注释。但我的过滤器永远不会被调用(我的过滤器 在普通的JAX-RS资源上被调用)

如何让我的过滤器调用Web套接字端点?

@ServerEndpoint("/push/register")
public class WebSocketListener
{
    @OnOpen
    @MyFilter
    public void open(Session session)
    {
        ...
    }
}

过滤器:

@MyFilter
@Provider
@Priority( Priorities.AUTHENTICATION )
public class AuthenticationFilter implements ContainerRequestFilter
{
    @Context
    private HttpServletRequest request;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        ...
    }
}

1 个答案:

答案 0 :(得分:1)

JAX-RS过滤器与websocket端点无关,名称绑定也不起作用。

您可以使用Filter注释中定义的相同URI从Servlet API实现@ServerEndpoint,然后您就可以拦截握手请求。

但是过滤器不会拦截WebSocket帧。

@WebFilter("/push/register")
public class AuthenticationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {

        ...

        chain.doFilter(request, response);    
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}