如果用session实现网站7天免登录

如果用session实现网站7天免登录

如果用session实现网站7天免登录,是不是设置sessionID的生命周期为7天就可以呢?

为什么给JSESSIONID设置生命周期后,浏览器显示有效期仍然是“会话”呢?而且关闭浏览器再打开也获取不到之前session的数据。https://img1.sycdn.imooc.com//climg/634c1fa3096ee21a28801614.jpghttps://img1.sycdn.imooc.com//climg/634c1fb40930746628801610.jpg

package com.imooc.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Random;

@WebServlet("/session/random")
public class RandomServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Integer random = new Random().nextInt(10000);
        HttpSession session = request.getSession();
        session.setAttribute("random",random);
        Cookie[] cookies = request.getCookies();
        for (Cookie c : cookies){
            System.out.println(c.getName() + " : " + c.getValue());
            if (c.getName().equals("JSESSIONID")){
                c.setMaxAge(60*3);
            }
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println("<h1>随机数"+random+"已生成</h1>");
    }
}



正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2022-10-17 14:43:46

同学你好,代码中的cookie没有响应给浏览器端,例如:response.addCookie(c);,故没有生效。

实现7天免登录思路参考如下:

  1. 第一次访问登录界面并且用户名和密码匹配就获取用户数据保存到Cookie(用户名、密码)里面,或将JSSESSIONID 保存到cookie中,并创建Session对象保存信息到服务端。

    注:实际免登陆一般不会将用户名和密码存在Cookie,而是将Uid(唯一表示用户的数据)存在Cookie中,通过Uid找到对应用户将用户名、密码存在Session对象当中。

  2. 当再一次访问登录页面的时候判断Cookie或者Session的某个属性是否为空,如果为空则进行登录,否则重定向到首页(登录成功后的界面)。

代码实现方式不唯一,以cookie中保存JSESSIONID为例:关键代码实现参考如下:

登录成功添加数据user到Session,JSSESSIONID存储到cookie中:

    https://img1.sycdn.imooc.com//climg/634cf8d40944bdb705190417.jpg

首页判断:

    https://img1.sycdn.imooc.com//climg/634cf90109fd948205470232.jpg

祝学习愉快~  

  • 提问者 王小east #1

    为什么增加response.addCookie()后,登录后关闭浏览器,重新打开还是未登录状态呢?

    package com.imooc.session;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.util.Random;
    
    @WebServlet("/session/random")
    public class RandomServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Integer random = new Random().nextInt(10000);
            HttpSession session = request.getSession();
            session.setAttribute("random",random);
            Cookie[] cookies = request.getCookies();
            Cookie cookie = null;
            for (Cookie c : cookies){
                System.out.println(c.getName() + " : " + c.getValue());
                if (c.getName().equals("JSESSIONID")){
                    cookie = c;
                }
            }
            cookie.setMaxAge(60*3);
            response.addCookie(cookie);
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("<h1>随机数"+random+"已生成</h1>");
        }
    }


    2022-10-17 15:30:05
  • 提问者 王小east #2

    而且JSESSIONID这个cookie本来就已经存在了,为什么还要在重新addCookie()一遍呢?

    2022-10-17 15:31:43
  • 好帮手慕小小 回复 提问者 王小east #3

    同学你好,建议清除选IDEA缓存,再清空浏览器缓存后再测试运行程序。

    注意:每次运行时需要先清空浏览器缓存中的cookie,避免之前存储的cookie对当前程序运行产生影响。

    代码中存在的问题:

    程序运行后会出现空指针异常,如下:

    https://img1.sycdn.imooc.com//climg/634d29fd0916504905930320.jpg

    https://img1.sycdn.imooc.com//climg/634d2a6b09106afc06300157.jpg

    报错原因:第一次访问时还不存在cookie,获取到的cookies数组为null,故导致遍历时会出现空指针异常。

    这也就导致了第一次访问random时无法设置并存储cookie,也就出现了同学描述的情况“登录后关闭浏览器,重新打开还是未登录状态”。

    出现空指针的解决建议:建议对cookies增加是否为空的判断。

    “登录后关闭浏览器,重新打开还是未登录状态”的解决建议:现阶段最快速的解决方案,同学可连续访问两次random,连续访问两次后关闭浏览器再进行后续的测试。

    问题二:关于重新addCookie()。cookie设置后是需要重新响应给浏览器端的,否则会导致不生效。

    祝学习愉快~

    2022-10-17 18:30:21
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师