- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
DefaultHandshakeHan-6ren">
我正在使用 spring 4 websocket 进行用户特定的主题订阅,并且我的应用程序不依赖于安全机制,握手失败,因为 principal 为空,我尝试扩展>DefaultHandshakeHandler 并覆盖 defineUser protected 方法,我是否需要填充主体对象以及如何填充?任何帮助将不胜感激。
配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/user");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").setHandshakeHandler(customHandshakeHandler()).withSockJS();
}
@Bean
public CustomHandshakeHandler customHandshakeHandler() {
return new CustomHandshakeHandler();
}
}
自定义HandshakeHandler.java
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,
Map<String, Object> attributes) {
return request.getPrincipal(); // return null here, how to populate principal???
}
}
服务器端:
template.convertAndSendToUser(username, "/greetings", new Greeting("Hello World!"));
客户端:
function connect(username) {
var socket = new SockJS('http://localhost:8081/websocket/hello');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
//stompClient.subscribe('/topic/greetings', function(greeting){
stompClient.subscribe('/user/' + username + '/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
}
错误日志:
ERROR: org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession - Closing due to transport error for SockJS session id=zw90o_sm
ERROR: org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator - Transport error for SockJS session id=zw90o_sm
java.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getContainer(AbstractStandardUpgradeStrategy.java:68)
at org.springframework.web.socket.server.standard.TomcatRequestUpgradeStrategy.getContainer(TomcatRequestUpgradeStrategy.java:85)
at org.springframework.web.socket.server.standard.TomcatRequestUpgradeStrategy.getContainer(TomcatRequestUpgradeStrategy.java:47)
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getSupportedExtensions(AbstractStandardUpgradeStrategy.java:88)
at org.springframework.web.socket.server.support.DefaultHandshakeHandler.doHandshake(DefaultHandshakeHandler.java:206)
at org.springframework.web.socket.sockjs.transport.handler.WebSocketTransportHandler.handleRequest(WebSocketTransportHandler.java:83)
at org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService.handleTransportRequest(TransportHandlingSockJsService.java:254)
at org.springframework.web.socket.sockjs.support.AbstractSockJsService.handleRequest(AbstractSockJsService.java:317)
at org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler.handleRequest(SockJsHttpRequestHandler.java:88)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Jul 24, 2014 11:55:21 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/websocket] threw exception [Request processing failed; nested exception is org.springframework.web.socket.sockjs.SockJsException: Uncaught failure in SockJS request, uri=http://localhost:8081/websocket/hello/474/zw90o_sm/websocket; nested exception is org.springframework.web.socket.sockjs.SockJsTransportFailureException: WebSocket handshake failure; nested exception is java.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?] with root cause
java.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getContainer(AbstractStandardUpgradeStrategy.java:68)
at org.springframework.web.socket.server.standard.TomcatRequestUpgradeStrategy.getContainer(TomcatRequestUpgradeStrategy.java:85)
at org.springframework.web.socket.server.standard.TomcatRequestUpgradeStrategy.getContainer(TomcatRequestUpgradeStrategy.java:47)
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getSupportedExtensions(AbstractStandardUpgradeStrategy.java:88)
at org.springframework.web.socket.server.support.DefaultHandshakeHandler.doHandshake(DefaultHandshakeHandler.java:206)
at org.springframework.web.socket.sockjs.transport.handler.WebSocketTransportHandler.handleRequest(WebSocketTransportHandler.java:83)
at org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService.handleTransportRequest(TransportHandlingSockJsService.java:254)
at org.springframework.web.socket.sockjs.support.AbstractSockJsService.handleRequest(AbstractSockJsService.java:317)
at org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler.handleRequest(SockJsHttpRequestHandler.java:88)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
ERROR: org.springframework.messaging.simp.user.DefaultUserDestinationResolver - Ignoring message, no principal info available
最佳答案
您问的是一件事,但您发布的错误日志显示了另一个问题:
java.lang.IllegalArgumentException: No 'javax.websocket.server.ServerContainer' ServletContext attribute. Are you running in a Servlet container that supports JSR-356?
那么您是否在支持 JSR-356 的 servlet 容器中运行?如果您在 Tomcat 上运行,则至少需要 Tomcat 7.0.47。对于其他 servlet 容器,您必须检查您需要什么版本。来自 Spring docs :
The Spring Framework provides a WebSocket API designed to adapt to various WebSocket engines. For example, it runs on JSR-356 runtimes such as Tomcat (7.0.47+), GlassFish (4.0+) and WildFly (8.0+) but can also adapt to other WebSocket runtimes such as the Jetty (9.1+) native WebSocket support.
关于java - Spring websocket遇到 "Ignoring message, no principal info available"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24925056/
我正在使用 Fluent Azure SDK for .NET 尝试获取租户中所有服务主体的列表。 var authenticatedContext = Azure.Authenticate(
我需要查找哪个主体修改或创建了给定主体。 我们可以使用 Microsoft Graph Api 获得修改后的主体列表: https://graph.microsoft.com/beta/service
我目前在 Azure 中有 10 个 SQL 数据库。在 Azure 门户中,我有我的用户名 (omnipos)。 当我想使用 MSSM 连接到数据库时,出现错误 无法作为数据库主体执行,因为主体“[
我正在尝试追踪 glassfish 中的一条烦人的消息正在污染我们的日志文件的原因。 为了简化我们的设置,我们有 2 个运行 3.1.2.2 的 glassfish 服务器。 服务器 A 上部署了一个
我在应用程序中使用springSecurityCore插件,并且用户在appStartupController中登录后,我喜欢 def index = { if (springSecurityS
你好,你好吗?我是 Azure 中组织订阅的唯一所有者,我需要创建服务主体。 我如何向我的用户授予权限?或者我可以创建一个新角色来分配此权限吗? 有什么想法吗? 提前致谢 最佳答案 注意:订阅的角色和
我很困惑为什么在 WebAPI 中需要设置 Principal,因为每次调用都是完全无状态的。因为每次调用都应该是完全无状态的,所以使用您记录的用户信息设置它有什么好处和原因? 我的印象是,一个登录的
我一直在看这篇文章: http://pythonhosted.org/Flask-Principal/#granular-resource-protection 现在虽然它当前的工作方式没有任何问题,
我是编写 flask 的新手,目前使用 flask-principal 作为我的授权机制。当用户试图在没有所需权限的情况下访问 url 时,flask-principal 会引发 Permission
Spring Security 假设 Authentication 是 Principal 。 public interface Authentication extends Principal, S
在装饰器中调用安全身份验证属性 principal.displayName 是否会导致问题? 我将其设置为 sitemesh 装饰器中的变量:
我正在Grails中编写更新或更改用户数据表单。这是我表单的一部分,用户可以在其中更改其旧登录名: Логин ... 更新之前必须显示旧的用户数据。我用它:${springSe
在我的 ASP 项目中,我使用的是 ASP.NET Identity 2.2.1。在许多地方,我必须获得当前(登录)用户的电子邮件。现在我发现那个用户使用这个: var user = await Us
为什么 Principal.IsMemberOf(GroupPrincipal) ( MSDN ) 在以下测试中为 Domain Computers 组返回假阴性? [TestMethod] publ
我正在尝试确定给定的本地用户帐户是否在本地管理员组中。在系统加入域之前一切正常。当加入域时抛出异常,提示未找到网络路径,但仅在查找本地非管理员帐户时才会抛出异常;如果测试帐户是本地管理员,则该方法返回
我有一个在 Tomcat 中运行的网络应用程序。我想允许任何拥有服务器信任的有效证书的用户访问 Web 应用程序,但我想从证书中读取用户的 DN。我用 clientAuth="true"配置了 SSL
有没有一种标准的方法可以将 CSS 文件命名为主体文件?我有两个 CSS 文件(一个用于 Bootstrap,一个用于我的自定义 CSS),我希望自定义文件中的所有样式对所有元素文件都同样重要。但我也
所有,我正在编写一个依赖于 flask-principal 的 flask 应用程序用于管理用户角色。我想编写一些简单的单元测试来检查哪些用户可以访问哪些 View 。已发布代码示例 on paste
在谈论 .NET 中的身份时,我们想到了 Principal .有接口(interface) IPrincipal并与它一起实现 ClaimsPrincipal .我们甚至可以随时使用 Thread.
本文整理了Java中org.apache.wss4j.common.principal.WSUsernameTokenPrincipalImpl类的一些代码示例,展示了WSUsernameTokenP
我是一名优秀的程序员,十分优秀!