項(xiàng)目場(chǎng)景:
在若依項(xiàng)目中需要做一個(gè)在線溝通的聊天功能,所以在若依的腳手架中集成了websocket。
問(wèn)題描述
在若依中集成websocket后進(jìn)行通信,但是在開(kāi)啟websocket的時(shí)候會(huì)報(bào)錯(cuò)“WebSocket connection to 'ws://localhost' failed:”。找了很多解決方法都無(wú)法解決,包括:修改vue.config.js中的配置,修改跨域的配置問(wèn)題。
let socketUrl = "ws://localhost:8080/imserver/" + username;
if (socket != null) {
socket.close();
socket = null;
}
// 開(kāi)啟一個(gè)websocket服務(wù)
socket = new WebSocket(socketUrl);
原因分析:
使用若依的基本都會(huì)對(duì)他的源碼有所了解,若依對(duì)訪問(wèn)后端接口的限制是很多的,除了一些特殊訪問(wèn),所有請(qǐng)求都需要鑒權(quán)訪問(wèn),如下代碼摘自若依前后端分離“ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java”
/**
* anyRequest | 匹配所有請(qǐng)求路徑
* access | SpringEl表達(dá)式結(jié)果為true時(shí)可以訪問(wèn)
* anonymous | 匿名可以訪問(wèn)
* denyAll | 用戶不能訪問(wèn)
* fullyAuthenticated | 用戶完全認(rèn)證可以訪問(wèn)(非remember-me下自動(dòng)登錄)
* hasAnyAuthority | 如果有參數(shù),參數(shù)表示權(quán)限,則其中任何一個(gè)權(quán)限可以訪問(wèn)
* hasAnyRole | 如果有參數(shù),參數(shù)表示角色,則其中任何一個(gè)角色可以訪問(wèn)
* hasAuthority | 如果有參數(shù),參數(shù)表示權(quán)限,則其權(quán)限可以訪問(wèn)
* hasIpAddress | 如果有參數(shù),參數(shù)表示IP地址,如果用戶IP和參數(shù)匹配,則可以訪問(wèn)
* hasRole | 如果有參數(shù),參數(shù)表示角色,則其角色可以訪問(wèn)
* permitAll | 用戶可以任意訪問(wèn)
* rememberMe | 允許通過(guò)remember-me登錄的用戶訪問(wèn)
* authenticated | 用戶登錄后可訪問(wèn)
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
// 注解標(biāo)記允許匿名訪問(wèn)的url
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());
httpSecurity
// CSRF禁用,因?yàn)椴皇褂胹ession
.csrf().disable()
// 禁用HTTP響應(yīng)標(biāo)頭
.headers().cacheControl().disable().and()
// 認(rèn)證失敗處理類
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 基于token,所以不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 過(guò)濾請(qǐng)求
.authorizeRequests()
// 對(duì)于登錄login 注冊(cè)register 驗(yàn)證碼captchaImage 允許匿名訪問(wèn)
.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 靜態(tài)資源,可匿名訪問(wèn)
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 除上面外的所有請(qǐng)求全部需要鑒權(quán)認(rèn)證
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
// 添加Logout filter
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}
解決方案:
可以根據(jù)自己的需要進(jìn)行配置,比如項(xiàng)目是自己練習(xí)使用,可以將“文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-509297.html
.anyRequest().authenticated()
”直接注釋掉,就可以將所有鑒權(quán)認(rèn)證步驟忽略,而上面的問(wèn)題就迎刃而解了,或者將靜態(tài)資源寫(xiě)入antMatchers內(nèi),也可以解決該問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-509297.html
到了這里,關(guān)于關(guān)于ruoyi集成websocket后報(bào)錯(cuò)“WebSocket connection to ‘ws://localhost‘ failed:”的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!