Jetty 在javax.websocket升级之前,如何使用过滤器
我想编写自己的“ServletContainerInitializer”,将本地筛选器添加到ServletContext。我还想管理ServletContainerInitializer调用的顺序,以便我的本地筛选器在websocket升级筛选器之前获得注册并被请求命中Jetty 在javax.websocket升级之前,如何使用过滤器,jetty,Jetty,我想编写自己的“ServletContainerInitializer”,将本地筛选器添加到ServletContext。我还想管理ServletContainerInitializer调用的顺序,以便我的本地筛选器在websocket升级筛选器之前获得注册并被请求命中 我想知道如何初始化本地ServletContainerInitializer 首先,ServletContextInitializer未排序,该功能不是Servlet规范的一部分。您无法完成问题的这一部分。(可能在Servlet
我想知道如何初始化本地ServletContainerInitializer 首先,
ServletContextInitializer
未排序,该功能不是Servlet规范的一部分。您无法完成问题的这一部分。(可能在Servlet规范的未来版本中)
其次,不鼓励对WebSocket升级请求进行过滤,这也是WebSocket中出现大量问题的原因。您必须非常小心,不要执行以下任何操作
- 访问响应对象上的任何内容
- 不要包装请求或响应对象
- 不要访问请求输入流或读卡器
- 不要访问响应输出流或写入程序
- 不要添加标题
- 不要更改标题
- 不访问请求HttpSession
- 不访问请求用户主体
- 不访问请求身份验证/授权方法
- 不访问请求部分(多部分/表单数据)
- 不访问请求参数
- 不访问ServletContext
- 不访问request.getScheme或isSecure
- 不要从请求中删除内容(属性、标题、参数等)
- request.getAttribute(字符串名称)
- request.getContextPath()
- request.getCookies()
- request.getHeader(字符串名称)
- request.getIntHeader(字符串名称)
- request.getLocalName()
- request.getLocalPort()
- request.getPathInfo()
- request.getPathTranslated()
- request.getQueryString()
- request.getRemoteAddr()
- request.getRemotePort()
- request.getRequestURI()
- request.getRequestURL()
- request.getServerName()
- request.getServerPort()
ServletContextInitializer
和添加的
实际上,您应该在Servlet处理(包括过滤器)之前进行升级,因为规范就是这样编写的。有,但这些问题目前尚未得到解答,并且计划在javax.websocket规范的未来版本中发布
Jetty的未来版本可能会从使用过滤器变为使用在路径映射级别进行协作的内部工具,将Servlet规范和WebSocket规范中的逻辑合并为一组新的规则
由于这个问题经常出现,我已经勾选了社区维基标志
问这个问题的第一个原因是,在项目的过滤器中内置了一些身份验证或授权逻辑
如果是这种情况,您有两种选择
过滤器
和一个新的过滤器,该过滤器使用现在通用的逻辑来完成您需要的最终结果。请注意,在可能的WebSocket升级下,您无权访问整个HttpServletRequest
对象,只能访问对象内容。(您现在可以看到限制)