赞
踩
websocket 注解方式实现(详细见上篇)
web平台 struts2 + spring4 jdk8 tomcat8
配置完成之后发现无法访问,前端访问代码:
- <html>
- <head>
- <meta charset="UTF-8" />
- <title>Viewer</title>
- <script type="text/javascript" charset="utf-8" src="js/jquery-1.11.3.min.js"></script>
- <link type="text/css" rel="stylesheet" href="css/style.css" />
- <script type="text/javascript">
-
- function getUrlParameter(name) {
- return decodeURIComponent((RegExp(name + '=' + '([^&]*)(&|$)').exec(
- location.search) || [ , null ])[1]);
- }
-
- function escapeHtml(unsafe) {
- return unsafe
- .replace(/&/g, "&")
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/"/g, """)
- .replace(/'/g, "'");
- }
-
- $(function() {
- var text = $('#messages');
- var keepScrolling = true;
- var ws = new WebSocket("ws://192.168.1.251/test/log/view");
- ws.onopen = function(event) {
- };
- ws.onmessage = function(event) {
- setTimeout(function() {
- text.append(escapeHtml(event.data + "\n"));
- if (keepScrolling)
- window.scrollBy(0, 100000000000000000);
- },0);
- }
- ws.onclose = function(event) {
-
- }
- $(document).bind("keydown", function(event){
- if (event.keyCode == 32)
- setTimeout(function() {
- keepScrolling = !keepScrolling;
- },0);
- });
- });
- </script>
- </head>
- <body>
- <pre id="messages"></pre>
- </body>
- </html>
failed: Error during WebSocket handshake: Unexpected response code: 200
网上搜索说是 struts过滤器原因,但是未详细解释如何处理,
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- <dispatcher>REQUEST</dispatcher>
- <dispatcher>FORWARD</dispatcher>
- </filter-mapping>
以上是struts web.xml里面默认过滤以工程目录开头的所有请求 , 而websocket 请求也能被struts匹配。
test为工程名, /log/view 为websocket注解 url
ws://192.168.1.251/test/log/view
解决办法:
让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/为开头的路径。
.* 表示零个或多个任意字符
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。