我制作了一个JSR-356 @ServerEndpoint,其中我希望限制单个IP地址的活动连接,以防止简单的DDOS攻击。
@ServerEndpoint
请注意,我正在搜索Java解决方案(JSR-356,Tomcat或Servlet 3.0规范)。
我尝试了自定义端点配置器,但是即使在HandshakeRequest对象中也无法访问IP地址。
HandshakeRequest
在没有iptables之类的外部软件的情况下,如何限制单个IP地址的JSR-356连接数?
根据Tomcat开发人员的介绍,@ mark-thomas客户端IP 不会 通过JSR-356公开,因此无法使用纯JSR-356 API- s实现此类功能。
您必须使用一个相当丑陋的技巧来解决该标准的局限性。
需要做的事情归结为:
至少有两个hacky选项可以实现这一目标。
ServletRequestListener
request.getSession()
ServerEndpointConfig.Configurator
HandshakeRequest#getHttpSession
EndpointConfig
modifyHandshake
您也可以使用@WebFilter代替ServletRequestListener
@WebFilter
请注意,除非您的应用程序已经使用会话(例如出于身份验证目的),否则此选项可能会占用大量资源。
/mychat
ServletRequest#getRequestDispatcher
/mychat/TOKEN
@ServerEndpoint("/mychat/{token}")
@PathParam
为了简化安装,您可能希望在应用程序启动时生成加密密钥。
请注意,即使您正在执行客户端不可见的内部调度,也需要对IP进行加密。没有什么可以阻止攻击者/mychat/2.3.4.5直接连接,从而欺骗了未经加密的客户端IP。
/mychat/2.3.4.5