zoukankan      html  css  js  c++  java
  • 在webSocket中获取shiro报错

    问题

     前面为了做一个shiro 过期检测。然后用来获取鼠标焦点,调用websocket去后台检测是否过期。(之所以这么做,还是前端技术不行)。
    但是在handleMessage方法中,通过Subject subject = SecurityUtils.getSubject();的方式来直接获取subject时,会因为当前访问的连接并不在shiro的管理范围内,而报错
    org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.
    at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
    at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
    at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
    at cn.xxxx.handleMessage(WebSocketHander.java:50)
    at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
    at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:114)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:43)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:85)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:82)
    at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:394)
    at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119)
    at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
    at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
    at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
    at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1506)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
    

    就是这个错误了。

    解决办法

    解决办法的话,主要是通过websocket的拦截器,在握手以前将需要的对象,注入到map中。然后就可以在handleMessage中,从session里取出来了。
    

    拦截器实现:
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
    Subject subject = SecurityUtils.getSubject();
    Session shiroSession = subject.getSession();
    attributes.put("shiroSession", shiroSession);
    return super.beforeHandshake(request, response, wsHandler, attributes);
    }
    从websocketsession中取出。
    Map<String, Object> attributes = webSocketSession.getAttributes();
    Session shiroSession = (Session) attributes.get("shiroSession");
    end;

  • 相关阅读:
    程序员的自我修养 符号修饰 函数签名 以及一个引申的问题: extern "c"
    Spring.NET学习笔记(1)基本依赖注入
    Spring.NET学习笔记(3)注册事件注入
    Spring.NET学习笔记(2)依赖注入细节
    jQuery LigerUI 使用教程入门篇
    Spring.NET学习笔记(5)对象生命周期和创建者对象
    【C#.NET】C#皮肤与主题应用实例
    【VB/C#】Kill进程
    【C#.NET】C#用户控件的使用
    【C#.NET】C#创建多语言网站
  • 原文地址:https://www.cnblogs.com/xielinjiang/p/12023686.html
Copyright © 2011-2022 走看看