有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么我的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("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '"':
                    result.append("&quot;");
                    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) 个答案