我正在将Nginx用作Spring Boot应用程序的反向代理。我还使用带有sockjs和stomp消息的Websockets。
以下是上下文配置。
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/localization" >
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic" />
</websocket:message-broker>
以下是客户端代码:
var socket = new SockJS(entryPointUrl);
var stompClient = Stomp.over(socket);
var _this = this;
stompClient.connect({}, function () {
stompClient.subscribe('/app/some-url', function (message) {
// do some stuff
});
});
我也使用了Spring Security来保护一些内容。
@Configuration
@Order(4)
public static class FrontendSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/js/**", "/css/**", "/webjars/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll();
}
}
一切都很顺利,除了当我在 Nginx 反向代理后运行此应用程序时。这是反向代理配置:
proxy_pass http://testsysten:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
# Max body size
client_max_body_size 10M;
连接总是以 HTTP 403 状态码失败。
我正在使用版本 1.9.7。
你有任何想法,为什么客户端无法通过身份验证吗?
我知道类似的问题,如这个,但解决方案根本不起作用。
更新
我成功地在 HTTP 上运行了应用程序。我需要在 Nginx 配置中传递CSRF令牌。新配置如下:
proxy_pass http://testsysten:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Pass the csrf token (see https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery)
# Default in Spring Boot
proxy_pass_header X-XSRF-TOKEN;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
唯一缺少的是重定向到 HTTPS。在 Spring 日志中,我看到以下条目:
o.s.w.s.s.t.h.DefaultSockJsService - Processing transport request: GET http://testsystem:80/localization/226/3mbmu212/websocket
看起来Nginx代理需要重写到正确的端口。
proxy_pass
,这也通常适用。没有这些,proxy_pass
可以工作,但是websocket始终使用server_name主机名,这会破坏websocket。 - Shinebayar G