首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即时聊天应用:我如何检查用户没有绕过连接页面?

即时聊天应用:我如何检查用户没有绕过连接页面?
EN

Stack Overflow用户
提问于 2022-11-20 14:39:08
回答 2查看 32关注 0票数 1

我正处于使用Socket.io & React路由器开发一个基本的React即时聊天消息的最后阶段,以教会自己一些核心概念。

我一直在GitHub上使用这个项目作为参考:https://github.com/simpletut/react-real-time-chat-app

这里有一个实时版本:https://react-chatapp-frontend.herokuapp.com/

我正在使用Reacti-路由器将用户从连接页面(在其中,他们可以选择用户名和空间,然后将用户名和空间作为变量添加到URL )重定向到聊天页面。

即。使用用户名“john”加入“room1”的用户将被重定向到:http://localhost:3000/chat/room1/john

代码语言:javascript
复制
function App() {
  return (
    <div className="App">

      <Router>
        <Routes>
          <Route path="/chat/:room/:name" element={<Chat />} />
          <Route path="/" element={<Join />} />
        </Routes>
      </Router>

    </div>
  );
}

但是,目前没有什么可以阻止用户进入聊天室而不被从联接页面重定向。这也意味着用户只需输入一个URL就可以“创建”房间。我希望用户被重定向到连接页面或根目录,或者只是在没有被重定向的情况下无法访问聊天室。

在我的聊天页面中,我使用useParams()获取路由参数,然后加入房间。

代码语言:javascript
复制
  let { name, room } = useParams();

  const [currentUser, updateUser] = useState(name);
  const [currentRoom, updateCurrentroom] = useState(room);
  const [users, updateUsers] = useState([]);
  const [currentMessage, updateCurrentMessage] = useState('');

  const formRef = useRef(null);

  useEffect(() => {
    socket.on("receive_message", (data) => {
      addMessage(prevMessages => {
        return [...prevMessages, {
          username: data.username,
          time: new Date(),
          message: data.message
        }]
      })
    });

    
    socket.emit("join_room", {username: currentUser, room: room}, (err) => {
      if (err){
        console.log(err);
      }
    });

我已经看过参考代码好几次了,只是不知道他们做了什么不同的工作,这给了他们这个验证。有人知道如何最好地实现这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-20 16:18:11

我认为当您重定向到聊天室页面时,可以尝试在历史中添加一些状态:

代码语言:javascript
复制
navigate('/chat/room1/john', {state: {from: JOIN_PAGE}})

然后,您可以在聊天室组件中检查from值:

代码语言:javascript
复制
const location = useLocation();
if (location.state.from !== JOIN_PAGE) {
  navigate(JOIN_PAGE)
}
票数 1
EN

Stack Overflow用户

发布于 2022-11-21 17:58:42

您还可以将用户所在的房间存储在某个地方(例如,使用redux的)。

如果你有这个信息,你可以有一个共享的路线,

代码语言:javascript
复制
<Route path="/chat" element={<Chat />} />

然后处理状态,比如加载房间或其他东西,然后获取用户在组件" chat“中的聊天信息。

代码语言:javascript
复制
const roomOfCurrentUser = useSelector(getCurrentRoomSelector());

直接传递状态下的房间标识符

代码语言:javascript
复制
navigate('/chat', {state: {roomId: 123}})

如果您仍然希望使用带有房间和用户名称的路由,则仍然可以存储已存在的当前聊天,如果聊天不存在,还可以向用户显示一些错误或重定向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74509030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档