当前位置:   article > 正文

failed: Error during WebSocket handshake: Unexpected response code: 200

failed: error during websocket handshake: unexpected response code: 200

websocket 注解方式实现(详细见上篇)

web平台  struts2 + spring4  jdk8  tomcat8

配置完成之后发现无法访问,前端访问代码:

  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <title>Viewer</title>
  5. <script type="text/javascript" charset="utf-8" src="js/jquery-1.11.3.min.js"></script>
  6. <link type="text/css" rel="stylesheet" href="css/style.css" />
  7. <script type="text/javascript">
  8. function getUrlParameter(name) {
  9. return decodeURIComponent((RegExp(name + '=' + '([^&]*)(&|$)').exec(
  10. location.search) || [ , null ])[1]);
  11. }
  12. function escapeHtml(unsafe) {
  13. return unsafe
  14. .replace(/&/g, "&")
  15. .replace(/</g, "<")
  16. .replace(/>/g, ">")
  17. .replace(/"/g, """)
  18. .replace(/'/g, "'");
  19. }
  20. $(function() {
  21. var text = $('#messages');
  22. var keepScrolling = true;
  23. var ws = new WebSocket("ws://192.168.1.251/test/log/view");
  24. ws.onopen = function(event) {
  25. };
  26. ws.onmessage = function(event) {
  27. setTimeout(function() {
  28. text.append(escapeHtml(event.data + "\n"));
  29. if (keepScrolling)
  30. window.scrollBy(0, 100000000000000000);
  31. },0);
  32. }
  33. ws.onclose = function(event) {
  34. }
  35. $(document).bind("keydown", function(event){
  36. if (event.keyCode == 32)
  37. setTimeout(function() {
  38. keepScrolling = !keepScrolling;
  39. },0);
  40. });
  41. });
  42. </script>
  43. </head>
  44. <body>
  45. <pre id="messages"></pre>
  46. </body>
  47. </html>

浏览器运行console报错

failed: Error during WebSocket handshake: Unexpected response code: 200

网上搜索说是 struts过滤器原因,但是未详细解释如何处理,

  1. <filter-mapping>
  2. <filter-name>struts2</filter-name>
  3. <url-pattern>/*</url-pattern>
  4. <dispatcher>REQUEST</dispatcher>
  5. <dispatcher>FORWARD</dispatcher>
  6. </filter-mapping>
以上是struts  web.xml里面默认过滤以工程目录开头的所有请求 ,  而websocket 请求也能被struts匹配。 test为工程名, /log/view  为websocket注解 url
ws://192.168.1.251/test/log/view

struts   和 websocket  是2条处理请求的路,被struts 匹配上了 ,自然就到不了 websocket的处理逻辑。

解决办法:

让struts的过滤器不过滤websocket的请求

在struts.xml 中加上例如:

<constant name="struts.action.excludePattern" value="/log/tail,/log/view"></constant>

 这个struts常量的作用就是针对正则表达式所匹配到的路径,

1.struts解析xml时,不会把这些路径放到ActionMapping中;

2.请求时也不用去struts的ActionMapping中进行匹配,执行。

3.而是直接跳过此过滤器进入下一个过滤器。

特别要注意的是:struts.action.excludePattern的值是用逗号(,)隔开的正则表达式,写2行,前面一行不生效,后面才生效,貌似被最后一行覆盖。

比如:/res/.* 表示以/res/为开头的路径。

.* 表示零个或多个任意字符



  





声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号