为什么我的websocket无法建立?(java+websocket+filter+jsp/servlet)
我正在用java web进行WebSocket聊天。但当我在Chrome上运行它时,下面是错误消息:WebSocket connection to 'ws://127.0.0.1:8080/WebSocketChat/websocket/chat' failed: Error during WebSocket handshake: Unexpected response code: 200
以下是我的想法:
登录(jsp):用户登录,仅限用户名
loginFilter:一个过滤器,用户身份验证
LoginServlet:将username属性设置为session
chatEndpoint:websocket类
GetHttpSessionConfiguration:在websocket中获取httpsession
这是我的密码
登录
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>登陆 </title>
</head>
<body>
<%
if(request.getAttribute("tip")!=null)
{
out.println("<font color='red'>"+request.getAttribute("tip")+"</font>");
}
%>
<form method="post" action="login">
用户名:<input type="text" name="name"/><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>
登录过滤器:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
@WebFilter(filterName="authority"
, urlPatterns={"/*"}
, initParams={
@WebInitParam(name="encoding", value="GBK"),
@WebInitParam(name="loginPage", value="/Login.jsp"),
@WebInitParam(name="chatPage", value="chat.html"),
@WebInitParam(name="loginServlet", value="login")})
public class loginFilter implements Filter
{
private FilterConfig config;
public static int n=0;
public void init(FilterConfig config)
{
this.config = config;
}
public void destroy()
{
this.config = null;
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException,ServletException
{
System.out.println("Filter run" + String.valueOf(n++));
// get parameter
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String chatPage = config.getInitParameter("chatPage");
String loginServlet=config.getInitParameter("loginServlet");
// set encoding
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=GBK");
HttpSession session=((HttpServletRequest)request).getSession(true);
String requestPath=((HttpServletRequest)request).getServletPath();
if(session.getAttribute("user")==null && !requestPath.endsWith(loginPage) && !requestPath.endsWith(loginServlet))
{
System.out.println("goto login "+session.getAttribute("user"));
request.setAttribute("tip","loginfirst");
request.getRequestDispatcher(loginPage).forward(request, response);
}
else
{
System.out.println(requestPath+" "+session.getAttribute("user"));
chain.doFilter(request, response);
}
}
}
LoginServlet:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name="login"
, urlPatterns={"/login"})
public class LoginServlet extends HttpServlet
{
//public static final Set<HttpSession> clientSet =new HashSet<>();
public void service (HttpServletRequest request, HttpServletResponse
response)throws ServletException,java.io.IOException //here is the error line which chrome show.
{
// get session
HttpSession session=request.getSession(true);
//System.out.println(request.getParameter("name"));
session.setAttribute("user",request.getParameter("name"));
// forward to chat page and start websocket
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
RequestDispatcher rd;
rd=request.getRequestDispatcher("/chat.html");
rd.forward(request,response);
}
}
聊天端点:
import java.io.IOException;
import java.util.Set;
import java.util.HashSet;
import javax.servlet.http.*;
import javax.websocket.*;
import javax.websocket.server.*;
import javax.websocket.Session;
@ServerEndpoint(value = "/websocket/chat",configurator=GetHttpSessionConfigurator.class)
public class ChatEntpoint
{
private static final Set<Session> usersSet = new HashSet<>();
private HttpSession httpSession;
public ChatEntpoint()
{
System.out.println("construct\n");
}
@OnOpen
public void start(Session session, EndpointConfig config)
{
System.out.println("start\n");
usersSet.add(session);
httpSession= (HttpSession)config.getUserProperties().get(HttpSession.class.getName());
String nickname=(String)httpSession.getAttribute("user");
String message = String.format("【%s %s】", nickname, "joined!");
broadcast(message);
}
@OnClose
public void end()
{
//clientSet.remove(this);
String nickname=(String)httpSession.getAttribute("user");
String message = String.format("【%s %s】"
, nickname, "left!");
broadcast(message);
}
@OnMessage
public void onMessage(String message)
{
System.out.println("receive message\n");
String nickname=(String)httpSession.getAttribute("user");
String filteredMessage = String.format("%s: %s"
, nickname, filter(message));
broadcast(filteredMessage);
}
@OnError
public void onError(Throwable t) throws Throwable
{
System.out.println("WebSocket server error " + t);
}
private void broadcast(String msg)
{
for (Session client : usersSet)
{
try
{
synchronized (client)
{
client.getBasicRemote().sendText(msg);
}
}
catch (IOException e)
{
System.out.println("send msg to "
+ client + " error");
usersSet.remove(client);
try
{
client.close();
}
catch (IOException e1){}
String message = String.format("【%s %s】", (String)httpSession.getAttribute("user"), "left");
broadcast(message);
}
}
}
private static String filter(String message)
{
if (message == null)
return null;
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++)
{
switch (content[i])
{
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
GetHttpSessionConfiguration:
import javax.servlet.*;
import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator
{
@Override
public void modifyHandshake(ServerEndpointConfig config,
HandshakeRequest request,
HandshakeResponse response)
{
HttpSession httpSession = (HttpSession)request.getHttpSession();
config.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
}
我做错什么了吗
共 (0) 个答案