【问题标题】:How make my ContainerRequestFilter called on @ServerEndpoint onOpen?如何在 @ServerEndpoint onOpen 上调用我的 ContainerRequestFilter?
【发布时间】:2017-06-12 15:27:45
【问题描述】:

我有一个网络套接字@ServerEndpoint,它有一个我的过滤器监听的注释。但是我的过滤器从未被调用(我的过滤器 is 在普通 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
    {
        ...
    }
}

【问题讨论】:

    标签: java jakarta-ee websocket jax-rs


    【解决方案1】:

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


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

    但是过滤器不会拦截 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() {
    
        }
    }
    

    【讨论】:

    • 这适用于初始连接,但不适用于onMessage。知道我如何也可以调用该方法吗?
    • 我这样做了,因此它转到了我的 @OnOpen 方法,但从未在 @OnMessage 方法上调用过滤器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2013-01-22
    • 2014-07-03
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多