前端代码:
<!DOCTYPE html>
<html>
<head>
<title>测试</title>
</head>
<body>
Welcome<br/><input id="text" type="text"/>
<button onclick="send()">发送消息</button>
<hr/>
<button onclick="closeWebSocket()">关闭WebSocket连接</button>
<hr/>
<div id="message"></div>
</body>
<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
websocket = new WebSocket("ws://localhost:82/websocket/t.ws");
}
else {
alert('当前浏览器 Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function () {
setMessageInnerHTML("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocket.onopen = function () {
setMessageInnerHTML("WebSocket连接成功");
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function () {
setMessageInnerHTML("WebSocket连接关闭");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</html>后端配置:
package com.common.config;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jfinal.handler.Handler;
import com.jfinal.kit.StrKit;
public class WebSocketHandler extends Handler {
private Pattern filterUrlRegxPattern;
public WebSocketHandler(String filterUrlRegx) {
if (StrKit.isBlank(filterUrlRegx))
throw new IllegalArgumentException("The para filterUrlRegx can not be blank.");
filterUrlRegxPattern = Pattern.compile(filterUrlRegx);
}
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
if (filterUrlRegxPattern.matcher(target).find())
return ;
else
next.handle(target, request, response, isHandled);
}
}main-configHandler配置:
public void configHandler(Handlers me) {
me.add(new WebSocketHandler("^/websocket"));
}主要的接口:
@ServerEndpoint("/websocket/t.ws")
public class WebsocketTest {
}刷新页面控制台的debug日志:
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-41 Selector0]-[org.eclipse.jetty.io.nio.SelectorManager$SelectSet.createEndPoint()]: created SCEP@ade7c1f{l(/192.168.1.120:56220)<->r(/192.168.1.120:82),d=false,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@5652178b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43]-[org.eclipse.jetty.http.HttpParser.parseNext()]: filled 500/500
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.Server.handle()]: REQUEST /websocket/t.ws on AsyncHttpConnection@5652178b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=42,c=0},r=1
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.handler.ContextHandler.doScope()]: scope null||/websocket/t.ws @ o.e.j.w.WebAppContext{/,file:/E:/dyry/medicaltriagesystem_olddy/src/main/webapp/}
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.handler.ContextHandler.doScope()]: context=||/websocket/t.ws @ o.e.j.w.WebAppContext{/,file:/E:/dyry/medicaltriagesystem_olddy/src/main/webapp/}
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.session.SessionHandler.doScope()]: sessionManager=org.eclipse.jetty.server.session.HashSessionManager@27f981c6
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.session.SessionHandler.doScope()]: session=null
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.ServletHandler.doScope()]: servlet |/websocket/t.ws|null -> default
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.ServletHandler.doHandle()]: chain=shiro->jfinal->default
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter()]: call filter shiro
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession()]: Unable to resolve session ID from SessionKey [org.apache.shiro.web.session.mgt.WebSessionKey@366bc7c0]. Returning null to indicate a session could not be found.
2019-07-18 11:42:28
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter()]: call filter jfinal
2019-07-18 11:42:30
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter()]: call servlet default
2019-07-18 11:42:30
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.DefaultServlet.getResource()]: Resource /websocket/t.ws.gz=null
2019-07-18 11:42:30
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.DefaultServlet.getResource()]: Resource /websocket/t.ws=null
2019-07-18 11:42:30
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.servlet.DefaultServlet.doGet()]: uri=/websocket/t.ws resource=null
2019-07-18 11:42:30
[DEBUG]-[Thread: qtp1526298704-43 - /websocket/t.ws]-[org.eclipse.jetty.server.Server.handle()]: RESPONSE /websocket/t.ws 404 handled=true请问到底是哪里问题呢?困扰了两天了,jetty升到2019.3启动报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/SessionManager at com.jfinal.core.JFinal.start(JFinal.java:170) at com.common.config.MainConfig.main(MainConfig.java:152) 引入的maven包:

求大佬帮忙看看呢
项目:JFinal
https://www.jfinal.com/doc/1-4