2 heymanandgirl heymanandgirl 于 2016.03.23 15:52 提问

java websocket报错302

WebSocket connection to 'ws://127.0.0.1:3333/buguback/websocket' failed: Error during WebSocket handshake: Unexpected response code: 302

8个回答

u013892790
u013892790   2016.04.05 15:32

亲 你解决没有 我也遇到了 死活进不去

OoFriday55
OoFriday55 回复wobushifeiren: 亲,请问下这个问题解决么有,我也没弄晕了
7 个月之前 回复
wobushifeiren
wobushifeiren 大哥,解决了没?我也遇到这个问题了~
一年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.03.23 15:55

你的服务器看上去有问题,它怎么产生跳转了,调试下。

caozhy
caozhy   Ds   Rxr 2016.03.23 15:55

或者你的地址写的不对。

heymanandgirl
heymanandgirl http://127.0.0.13333/buguback项目是可以访问的。然后我也把所有拦截器去掉了,访问了还是不行
一年多之前 回复
heymanandgirl
heymanandgirl   2016.03.23 16:05

后端的代码:
@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);
    }
baidu_36521148
baidu_36521148   2016.11.01 10:37

你解决好了没,我也遇到了,头疼了俩天了对这个问题。。。。。。。。。。遇到了给咱说一声我的QQ2276922659

OoFriday55
OoFriday55   2017.05.09 17:03

亲,请问下这个问题解决么有,我也没弄晕了

hzw2312
hzw2312   2017.07.27 20:02

我也碰到啦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访问就好啦!
当然上面的分析都是个人的猜测,做不得准,希望有人能做详细的解释!

m0_37487032
m0_37487032   2017.09.18 16:19

报302的原因是链接被重定向了,检查一下是否是后台访问机制的问题。比如,必须登录过后才能进行访问。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!