首页 > 解决方案 > 如何启用以 cookie 为条件的按钮?

问题描述

我正在构建一个可以接受来宾和注册用户的 Web 应用程序。对于注册用户,在他们登录后,我只想为他们显示一个“注销”按钮。如果有一个 cookie 表明用户已登录,我想让它出现。有一个带有登录表单的 JSP,它重定向到 GET POST 方法(servlet)并创建一个发送到浏览器的 cookie。

我的问题:如何将按钮的存在与证明用户状态的 cookie 关联起来?它是在 JSP 端还是在 servlet 端?

使用 cookie 是正确的方法还是使用会话更好?

标签: javahtmljspservletscookies

解决方案


我实际上搜索并找到了一个可能的答案。

我能做的是使用浏览器中的jsp文件中的java代码获取令牌,然后我可以获取已登录人的电子邮件。通过检查电子邮件是否为空,我可以查看是否有用户登录。

我可以在 jsp 文件中使用这个例子:

<% 
  String email = LoginDao.getToken(request.getCookies());
    if (email != null) {
 %>

LoginDao.getToken 是一个调用来分离 cookie 中的电子邮件的方法。

public static String getToken(Cookie[] cookies) throws SQLException {
    String cookieData = null;
    String email = null;
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("token")) {
                cookieData = cookie.getValue();
            }

        }
        if (cookieData != null) {
            email = getEmailCookie(cookieData);
        }
    }
    return email;
}

在 getEmalCookie 的帮助下:

public static String getEmailCookie(String cookieData) throws SQLException {

    String[] splitCookie = cookieData.split("&&&&&");
    String passAndCookieSalt = splitCookie[0];
    String email = splitCookie[1];
    String cookieSalt = splitCookie[2];

    String databaseData = Queries.getPassword(email);

    if(databaseData != null) {
        String[] splitDatabase = databaseData.split("&&&&&");
            if (splitDatabase.length >= 2) {
                String passwordSalt = splitDatabase[1];

                if (Password.hashString(passwordSalt + "&&&&&" + cookieSalt).equals(passAndCookieSalt)) {
                    return email;
                } else {
                    return null;
                }
            } else {
                return null;
            }
    } else {
        return null;
    }

调用 Queries.getPassword(email) 从数据库中获取电子邮件并使用 (Password.hashString(passwordSalt + "&&&&&" + cookieSalt) 对其进行哈希处理,从而将其与浏览器中的 pass 和 cookie salt 进行比较。


推荐阅读