Springboot+Vue实现在线聊天室项目目录
该聊天室为大二上学期计算机网络大作业,并且是本人第一次使用vue实现前后端分离的项目,前端架构尚未熟悉可能会出现一些不妥之处,还请大佬们指出。(本文章写于项目整体完成上线之后,所以一些细节并未写出)
后端架构
JavaBean
Event:session监听器所用(已废弃)
Infor:用户好友请求消息,包含用户信息和阅读信息(是否已阅读,已拒绝/已同意)
Message:用户聊天消息,包含用户信息和聊天信息(时间、内容)
MyFriend和MyRoom:由于User类实现了UserDetails的接口(在springSecurity中使用),设置这两个类将其与Security的类区分开来。
Result:接口返回的统一标准,包含信息码、返回消息、返回的对象
WebScoketMessage:为webSocket服务,包含用户聊天消息的全部内容以及一些额外的内容(时间戳等,用于前端校验)
config
AddResponseHeaderFilter:用于跨域访问的拦截器实现(在返回头中配置跨域信息),后用nginx代理服务器配置后已经废弃
MySocketServer:基于javax的WebSocket,已废弃
SecurityConfig:配置SpringSecurity内容
WebSocketConfig:配置spring-web-socket内容
dao及service
总结反思
1.最重要的就是开发环境下的跨域问题,当初学会用nginx部署解决跨域问题后,就直接忽视了这个问题,一直拖着没有解决开发环境的跨域问题。导致每次测试都需要打包vue和java到后端运行后才能开始测试,浪费了非常非常多的时间,至今也没有想到一个比较好的办法。思考:或许可以在本地配置一个nginx服务器解决这个问题? 但是没有实现过,下一个项目应该会尝试。
2.Java的继承和多态问题。在使用spring 中的connectEvent方法的时候也是懵逼了好久,这个方法监听session连接的建立,参数中含有SessionConnectEvent类,调用该参数的getUser方法后进行输出,控制台显示是UsernamePasswordAuthenticationToken类(这个类继承自AbstractAuthenticationToken实现了Authentication接口,这个接口继承了Principal接口)但是编译器中显示getUser方法返回的是一个Principal接口(这个接口居然还是在security包下的接口),在编译器中执行不了返回的这个Principal的getPrincipal方法,但是通过反射的方法获取实体类却能够执行这个方法?也就是说,getUser方法在编译器中返回了一个Principal接口类,但实际运行的时候是返回了一个实现Principal接口的类。感觉迷迷糊糊的,还是对这个特性不够熟悉和了解。
3.nginx的配置问题:nginx每次对config进行修改后,都要在控制台进行nginx -s reload操作,进行这个操作后不需要重启nginx,刚开始以为可以自动保存读取配置,后来以为每次reload后需要重启,也是因此浪费了不少时间。
4.线程安全问题:在Service和Dao层的容器基本上都是用的ArrayList,百度后发现ArrayList是不安全的,一直在纠结到底该不该使用这个类。在监听webSocket接入和退出时的用户容器就是
public static ArrayList<Integer> users = new ArrayList<>();
实在是对多线程和并发不够了解,一直是非常困惑应该怎么去做,希望以后会多深入理解一下吧。