WebSocket connection to 'ws://127.0.0.1:3333/buguback/websocket' failed: Error during WebSocket handshake: Unexpected response code: 302
你的服务器看上去有问题,它怎么产生跳转了,调试下。
或者你的地址写的不对。
后端的代码:
@ServerEndpoint("/websocket")
public class Socket {
private Logger logger = Logger.getLogger(this.getClass().getName());
//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
/**
* 连接建立成功调用的方法
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session){
this.session = session;
System.out.println("有新连接加入!当前在线人数为");
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(){
System.out.println("有一连接关闭!当前在线人数为");
}
/**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
* @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("来自客户端的消息:" + message);
}
/**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
System.out.println("发生错误");
error.printStackTrace();
}
/**
* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException{
this.session.getBasicRemote().sendText(message);
//this.session.getAsyncRemote().sendText(message);
}
亲 你解决没有 我也遇到了 死活进不去
你解决好了没,我也遇到了,头疼了俩天了对这个问题。。。。。。。。。。遇到了给咱说一声我的QQ2276922659
亲,请问下这个问题解决么有,我也没弄晕了
我也碰到啦302的问题。不知道为什么,我在hosts文件中配置啦一个域名本地解析,
如:127.0.0.1 www.tms.com
然后js连接里写到:
websocket = new WebSocket("ws://www.tms.com/sct/websocket/socketServer.do");
这样,在浏览器中输入localhost访问项目,WebSocket连接就会报302!
访问项目时,必须输入www.tms.com访问WebSocket时才会正常。我想可能是因为我使用SpringWebSocket里面有一个拦截器,父类名是
HttpSessionHandshakeInterceptor
这个拦截器,专门拦截请求,将WebSocket请求转换为Http请求:
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
// TODO Auto-generated method stub
System.out.println("Before Handshake");
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpSession session = servletRequest.getServletRequest().getSession(false);
if (session != null) {
//使用userName区分WebSocketHandler,以便定向发送消息
User user = (User)session.getAttribute(Constants.USER_SESSION);
attributes.put(Constants.WEBSOCKET_USERNAME,user.getId());
}
}
return super.beforeHandshake(request, response, wsHandler, attributes);
}
这样当我们访问浏览器的HTTP地址跟WebSocket地址域名不一样时,它会认为请求被转移啦,也就是302!
反正我的是都改成localhost或者都改成www.tms.com访问就好啦!
当然上面的分析都是个人的猜测,做不得准,希望有人能做详细的解释!
这种烂尾的问题有点烦,我也碰到了,原因有很多,
可以查看自己的服务端是否被权限拦截
在链接那边加个项目名...神奇
报302的原因是链接被重定向了,检查一下是否是后台访问机制的问题。比如,必须登录过后才能进行访问。