【问题标题】:How to delete web application cookies in react js如何在 React js 中删除 Web 应用程序 cookie
【发布时间】:2020-09-26 11:42:59
【问题描述】:

我是 reactJs 的新手,我想在注销按钮上删除 cookie 和登录会话以断开用户会话。 但我无法访问代码中的 cookie。

请帮忙。

【问题讨论】:

    标签: javascript reactjs cookies


    【解决方案1】:

    您可以通过document.cookie 访问cookies。为了删除 cookie,您可以将过期日期设置为过去的日期:

    document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
    

    解决方案在此处描述:https://www.w3schools.com/js/js_cookies.asp

    还有一些帮助程序库可以处理 cookie(例如 https://www.npmjs.com/package/react-cookie),但它们会稍微增加你的包大小。

    【讨论】:

    • 在我的情况下 cookie 不是手动在代码中。但是它是在登录时添加的,并且在浏览器 cookie 中添加了相应的 sessionid 并且我想要删除。(我访问想要删除生成的 cookie登录时)
    • 因此,如果您想访问由服务器设置的 JavaScript 中的 cookie,请确保将 cookie 标志 httpOnly 设置为 false。但是,由于这会降低 Web 应用程序的安全性,我建议您删除服务器端的 cookie。快递示例:expressjs.com/en/4x/api.html#res.clearCookie
    • 当您删除 cookie 时,请确保服务器上的会话也无效。
    【解决方案2】:

    如果您在 JWT 快速后端的登录路由中的响应中设置 cookie 并使用“httpOnly”选项,则即使使用第三方库,您也无法从客户端/react 访问令牌'universal-cookie' 或 'document.cookie'。

    您需要清除后端响应中的 cookie,例如当用户注销时。

    前端:

    // React redux logout action
    export const logout = () => async (dispatch) => {
        try {
            await axios.get('/api/auth/logout')
            localStorage.removeItem('userInfo')
            dispatch({ type: type.USER_LOGOUT })
        } catch (error) {
            console.log(error)
        }
    }
    

    后端:

    const User = require('../../models/userModel')
    const generateToken = require('../../utils/generateToken')
    
    // @desc    Auth user & get token
    // @route   POST /api/auth/login
    // @access  Public
    const login = async (req, res) => {
        const { email, password } = req.body
        try {
            const user = await User.findOne({ email })
            if (user && (await user.verifyPassword(password))) {
                let token = generateToken(user._id)
                res.cookie('token', token, {
                    maxAge: 7200000, // 2 hours
                    secure: false, // set to true if you're using https
                    httpOnly: true,
                })
                res.json({
                    _id: user._id,
                    name: user.name,
                    email: user.email,
                    isAdmin: user.isAdmin,
                    token: token,
                })
            } else {
                res
                    .status(401)
                    .json({ success: false, message: 'Invalid email or password' })
            }
        } catch (error) {
            res.status(500).json({ success: false, message: error.toString() })
        }
    }
    
    // @desc    Logout controller to clear cookie and token
    // @route   GET /api/auth/logout
    // @access  Private
    const logout = async (req, res) => {
        // Set token to none and expire after 5 seconds
        res.cookie('token', 'none', {
            expires: new Date(Date.now() + 5 * 1000),
            httpOnly: true,
        })
        res
            .status(200)
            .json({ success: true, message: 'User logged out successfully' })
    }
    
    module.exports = {
        login,
        logout,
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 2021-10-08
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2012-02-28
      • 2018-09-15
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多