- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个功能可以在我的应用程序中显示即时通知,如果有人发送消息,我会向其他用户发送通知,就像您收到新消息一样。为此,我使用 Spring MVC + Stomp + WebSocket。
在我的本地/测试环境中,Web 套接字帧通过 http 接收并正常工作。 Prod 环境在 https 上,框架不像 http 那样接收。因此,通知不会更新。
我在 websocket 响应中观察到一件事:在本地服务器上显示电子邮件用户名。在 Prod 服务器中,一些随机的 long 值正在显示。
Spring 版本:4.3.5.RELEASE
Spring Security:4.2.1.RELEASE
网络套接字配置:
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp/notify").withSockJS();
}
}
网络安全配置:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AuthenticationService authenticationService;
@Value("${ssl.enabled:false}")
private boolean sslEnabled;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
ShaPasswordEncoder encoder = new ShaPasswordEncoder();
auth.userDetailsService(authenticationService).passwordEncoder(encoder);
}
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
if (sslEnabled) {
http.requiresChannel().antMatchers("/").requiresSecure();
}
/* authorize requests */
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/university-signup").permitAll()
.antMatchers("/fb1clicksignup").permitAll()
.antMatchers("/about").permitAll()
.antMatchers("/media").permitAll()
.antMatchers("/invite").permitAll()
.antMatchers("/public").permitAll()
.antMatchers("/reset-password").permitAll()
.antMatchers("/email-unsubscribe").permitAll()
.antMatchers("/email-subscribe").permitAll()
.antMatchers("/member")
.access("hasAnyAuthority('USER')")
.antMatchers("/member/*")
.access("hasAnyAuthority('USER')")
.and().exceptionHandling().accessDeniedPage("/");
/* login form */
http.formLogin().loginPage("/")
.loginProcessingUrl("/login")
.successHandler(customSuccessHandler())
.usernameParameter("email").passwordParameter("password")
.and().csrf();
/* logout */
http.logout().deleteCookies("remember_me_chk")
.invalidateHttpSession(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/");
/* remember me*/
http.rememberMe().
key("ec2Mm2458nestOU812lingpiaza2910").
rememberMeParameter("remember-me-param").
rememberMeCookieName("remember_me_chk").
tokenValiditySeconds(31536000);
http.sessionManagement().maximumSessions(2); //a user can only have 2 active sessions
http.sessionManagement().sessionAuthenticationErrorUrl("/"); //kick the user to the homepage if session is not valid
http.sessionManagement().sessionFixation().migrateSession();
http.sessionManagement().invalidSessionUrl("/");
}
@Bean
public CustomSuccessHandler customSuccessHandler() {
return new CustomSuccessHandler();
}
}
消息发送逻辑:
@Autowired
private SimpMessagingTemplate messageSender;
public void sendNotification() {
messageSender.convertAndSend("/topic/messages", "Got New Message!");
}
本地/测试服务器请求 url:
ws://mydomain.com/stomp/notify/879/z5qcek18/websocket
本地/测试服务器响应帧:
a["CONNECTED\nversion:1.1\nheart-beat:0,0\nuser-name:usertest@mydomain.com\n\n\u0000"]
Prod 服务器请求 url:
wss://mydomain.com/stomp/notify/879/z5qcek18/websocket
Prod 服务器响应帧:
a["CONNECTED\nversion:1.1\nheart-beat:0,0\nuser-name:110721669125112652938\n\n\u0000"]
最佳答案
这是我的错,我的应用程序中有社交网络登录。如果我直接登录电子邮件可用。如果我使用社交网络登录电子邮件,我将无法使用。所以我将 spring security 主体用户名设置为 oauth token 。这就是它显示响应帧不同的原因。现在我将 emailId 设置为 spring security principal 用户名,它按预期工作。
关于java - Spring MVC + Stomp + WebSocket + https 不作为 http,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834719/
我正在通过 Sock.JS 客户端发送 stomp 消息。当我断开服务器连接时,我希望在客户端上显示一条警告消息。为此,我实现了服务器端心跳 stompClient = Stomp.over(sock
我们有一个 Spring over WebSockets 连接,我们正在传递一个 CONNECT框架: CONNECT\naccept-version:1.2\nheart-beat:10000,10
当用户使用 @SubscribeMapping 注释订阅 stomp 用户目的地时,我试图得到通知。我的想法是在它加入时发送一些初始化数据。 虽然我无法让这个工作: Javascript: stomp
我正在开发一个利用 websockets 工具的 Spring 应用程序。为了使其更健壮,我使用了 STOMP/SimpleBrokerMessageHandler,如文档中所述。一切顺利,我已经能够
从 Spring 4 开始,我们支持 STOMP (子)协议(protocol)超过 WebSocket .我确实了解 WebSocket 的好处与 HTTP 相比,使用 STOMP 的用途和好处超过
STOMP 规范规定订阅必须有id header。 https://stomp.github.io/stomp-specification-1.2.html#SUBSCRIBE_id_Header S
有没有办法获取STOMP客户端IP地址?我正在拦截入站 channel ,但我看不到任何检查 IP 地址的方法。 任何帮助表示赞赏。 最佳答案 您可以在与 HandshakeInterceptor 握
我是 Flutter 新手。我正在尝试连接到使用 stomp 的 spring websocket,但连接失败。我正在使用 stomp_dart_client 0.3.3。 Spring服务器工作正常
我正在尝试在 puppetmaster(开源 puppet )上设置 mcollective/activemq。我遇到了 ActiveMQ 无法识别 Stomp 协议(protocol)的问题。这是我
我尝试使用 sockjs 和 stomp.js ( http://jmesnil.net/stomp-websocket/doc/ ) 为 vert.x stomp 服务器编写一个简单的 javasc
我发现 Spring WebSocket Support 的当前文档令人惊讶。指导用户使用 stomp.js用于他们的客户端 JavaScript 实现。 这个项目,在它的 GitHub 页面上的自述
以下测试客户端代码(使用 https://github.com/jmesnil/stomp-websocket )在 JBoss 7.0.1 中产生异常: var client = Stomp.cli
我在 Websockets 上使用带有 STOMP 协议(protocol)的 Springwebsockets,并且我正在使用内存中的 borker。我想向特定用户发送消息。 在客户端,我订阅了一个
我正在使用以下代码创建/订阅主题并处理消息。有时连接丢失并且错误显示: Whoops! The connection was lost... 我想知道有没有办法重新连接它。是否可以在错误回调中或在方法
我正在使用 Spring WebSockets。它运行良好,但现在我需要在将消息发送到 Web 客户端之前对其进行修改。 因此我创建了以下拦截器: @Component public class St
我有一个要求是一些 STOMP websocket 连接需要同步处理。 意思是我有一个客户(spring)订阅了一个主题(“/topic”)。 我有一个服务器 (spring),它定义了代理 ("/t
我目前的stomp客户端流程设计如下: 打开stomp连接(发送CONNECT帧) 订阅提要(发送 SUBSCRIBE 帧) 做一个循环以持续接收提要: while (true) {
我想知道是否有一种方法可以在发送消息之前检查消费者是否正在运行?我正在使用最新的 php STOMP,并且正在努力查看是否有一种方法可以在发送消息之前检测它是否正在运行,并在队列中建立消息。 谢谢,史
我正在寻找 Stomp.js 或类似的库。我没有发现使用 angular2.rc6/final 示例或 lib。我怎样才能重新放置 Stomp.js 其他东西?在我之前使用 Angular 1.X 的
我使用的是 Artemis 2.6.2,只有 STOMP 和以下星座: 经纪人: 没有在 broker.xml 中配置队列,一切都是自动创建的。 服务器: 订阅目标 TaskResponse 没有选择
我是一名优秀的程序员,十分优秀!