NutzCN Logo
问答 浏览器链接 websocket 服务端 为什么只有在登录情况下才连接成功 退出登录 就报错 302
发布于 2863天前 作者 qq_d553d34d 4109 次浏览 复制 上一个帖子 下一个帖子
标签:
package com.yixin.xv.admin.controller;

import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.nutz.ioc.loader.annotation.IocBean;

@IocBean
@ServerEndpoint(value = "/websocket", configurator=NutIocWebSocketConfigurator.class)

public class MyWebsocket extends Endpoint {

	static Map<String, Session> sessionMap = new Hashtable<String, Session>();
	private HttpSession httpSession;
	
	@Override
	public void onOpen(Session session, EndpointConfig config) {
		
		final RemoteEndpoint.Basic basic = session.getBasicRemote();
		//	HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
			this.httpSession = (HttpSession) config.getUserProperties()
		               .get(HttpSession.class.getName());
		   //    sessionMap.put(session.getId(), session);
			try {
				basic.sendText("open success on server");
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	
	/**
	 * 收到客户端消息时触发
	 * 
	 * @param relationId
	 * @param userCode
	 * @param message
	 * @return
	 */
	@OnMessage
	public String onMessage(Session session, String message) {
			System.out.println("message=="+message);
			sessionMap.put(message, session);
			return "Got you msg !" + message;
	}

	/**
	 * 异常时触发
	 * 
	 * @param relationId
	 * @param userCode
	 * @param session
	 */
	@OnError
	public void onError(Throwable throwable, Session session) {
		sessionMap.remove(session);
		System.out.println("pathParams:" + session.getPathParameters());
		System.out.println("requestParams" + session.getRequestParameterMap());
		System.out.print("onError" + throwable.toString());
	}

	/**
	 * 关闭连接时触发
	 * 
	 * @param relationId
	 * @param userCode
	 * @param session
	 */
	@OnClose
	public void onClose(Session session) {
		sessionMap.remove(httpSession.getId());
		System.out.println("pathParams:" + session.getPathParameters());
		System.out.println("requestParams" + session.getRequestParameterMap());
		System.out.print("onClose ");
	}
}

怀疑是不是过滤器的问题啊 可是 在shiro.ini 添加了 不走过滤器 貌似没起作用

13 回复

把shiro.ini里面的urls全部注释掉试试

好的 我试试 谢谢

不行呢 退出登陆后 链接的时候 报错如下
WebSocket connection to 'ws://localhost:8080/admin/websocket' failed: Error during WebSocket handshake: Unexpected response code: 302

@wendal 帮忙看看呗 整了好多天了

后台日志贴一下, 总会有点日志吧

@wendal 没有日志呢 我也郁闷了
ws://localhost:8080/admin/websocke 这样的路径 走过滤器嘛 或者 怎么走啊

贴shiro.ini

要是经过NutFilter,虽然它不会匹配任何入口方法, 但依然会打印一句action not found, 这句日志应该有吧?

如果没有, 那应该是web.xml中的其他Filter拦截掉了

@wendal 嗯嗯 有 action not found

[urls]
/logout       = logout
/druid/**     = authc,roles[admin]
/burro/**     = anon
/static/**    = anon
/weixin/**    = anon
/asset/**     = anon
#/getServer    = anon
/websocket    = anon
/supplier/account/** = anon
/403.html     = anon
/favicon.ico  = anon
/captcha/**   = anon
/**           = authc

... 你没全部注释掉

有一种可能性, 有个 名字叫 websocket的文件夹, 然后tomcat看到是文件夹, 重定向到/websocket/了

@wendal 刚才全部注释掉了 不行 ; 登陆后,然后连接 报错如下
Search mapping for path=/websocket : NOT Action match
但是确实是 连接上了

没有 websocket 的文件夹啊

这个 NOT Action match 不是报错,只是提示. 可以无视的, 对websocket来说.

@wendal 哦哦 那还有木有办法呢 快崩溃了

@qq_d553d34d 你不是说已经连上了吗? 那个提示无视就好了

你正在看的这样页面,也是走websocket呢, 一样有那个提示, 无视就好了...

添加回复
请先登陆
回到顶部