我使用auth0
进行用户身份验证,只允许登录用户访问Spring(引导)RestController
。此时,我正在创建一个实时消息功能,用户可以使用stompjs
和sockjs
从Angular2
客户机(localhost:4200
)向Spring服务器(localhost:8081)发送消息。
当试图创建Stomp-client并启动连接时,我收到以下控制台错误:
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:4200' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
在研究了这个问题之后,似乎不可能同时设置origins=*和credentials=true选项。当我已经将WebSocketConfig中允许的源设置为客户端域时,如何解决这个问题?
connect() {
var socket = new SockJS('http://localhost:8081/chat');
this.stompClient = Stomp.over(socket);
this.stompClient.connect({}, function(result) {
console.log('Connected: ' + result);
this.stompClient.subscribe('/topic/messages', function(message) {
console.log(message);
});
});
}
@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("/chat").setAllowedOrigins("http://localhost:4200").withSockJS();
}
}
{"entropy":-1720701276,"origins":["*:*"],"cookie_needed":true,"websocket":true}
public class MessageController {
@MessageMapping("/chat")
@SendTo("/topic/messages")
public Message send(Message message) throws Exception {
return new Message(message.getFrom(), message.getText());
}
}
public class SecurityConfig extends Auth0SecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll();
}
}
@Bean
CORSFilter corsFilter() {
CORSFilter filter = new CORSFilter();
return filter;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(corsFilter(), SessionManagementFilter.class).authorizeRequests().anyRequest().permitAll();
http.csrf().disable();
}
问题:
您没有正确配置'Access-Control-Allow-Origin'
,服务器会忽略您当前的配置。
情况:
错误堆栈跟踪显示:
public class CORSFilter implements Filter {
// This is to be replaced with a list of domains allowed to access the server
//You can include more than one origin here
private final List<String> allowedOrigins = Arrays.asList("http://localhost:4200");
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// Lets make sure that we are working with HTTP (that is, against HttpServletRequest and HttpServletResponse objects)
if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// Access-Control-Allow-Origin
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", allowedOrigins.contains(origin) ? origin : "");
response.setHeader("Vary", "Origin");
// Access-Control-Max-Age
response.setHeader("Access-Control-Max-Age", "3600");
// Access-Control-Allow-Credentials
response.setHeader("Access-Control-Allow-Credentials", "true");
// Access-Control-Allow-Methods
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// Access-Control-Allow-Headers
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, " + "X-CSRF-TOKEN");
}
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {
}
}
private final List<String> allowedOrigins = Arrays.asList("http://localhost:4200");
若要设置允许访问服务器的域列表,请执行以下操作。
参考资料:
您可能需要看一下Spring框架中的CORS支持,以及支持RESTful Web服务的跨源请求,以便进一步了解它。
我正试图将我电子应用程序转换为全网。当我从我的本地主机运行应用程序时,我得到以下错误: 加载https://agrt.herokuapp.com/login失败:对飞行前请求的响应没有通过访问控制检查:当请求的凭据模式为“include”时,响应中的“access-control-allog-origin”标头的值不能是通配符“*”。因此,不允许访问源'http://localhost:4200'
该应用程序正在编译和从服务器获取数据。但是只有socket.io不工作,我得到以下错误: localhost/:1未能加载http://localhost:3000/socket.io/?eio=3&transport=polling&t=mephatn:当请求的凭据模式为“include”时,响应中“access-control-allog-origin”标头的值不能是通配符“*”。因此,不允许
在制作MMORPG项目的过程中,我正在学习服务器-客户端通信。 *更新:服务器端代码已编辑。 这是服务器端代码。 这是客户端代码 当调用login()函数时,finch()函数将此消息抛出到浏览器控制台。(http://localhost:4000/login)是服务器端,(http://localhost:8000)是客户端。 我尝试了许多不同的方法来修复它,但没有得到好的结果。
问题内容: 我有一个涉及的设置 前端服务器(Node.js,域:localhost:3000)<—>后端(Django,Ajax,域:localhost:8000) 浏览器<-webapp <-Node.js(为应用提供服务) 浏览器(webapp)-> Ajax-> Django(服务ajax POST请求) 现在,我的问题是CORS设置,Web应用程序使用它来对后端服务器进行Ajax调用。在C
一、 am在angular 6和asp.net内核上使用信号器功能。但对飞行前请求继续获取此错误响应未通过访问控制检查:响应中“访问控制允许凭据”标头的值为“”,当请求的凭据模式为“包括”时,该值必须为“真”。 做了一些研究,发现这是服务器端的CORS问题。所以修改了服务器代码。 startup.cs 角度应用程序 参考资料 访问控制允许原点-角度5 响应中的访问-控制-允许-凭据标题为"这必须是