使用cookie session实现自动登录 ajax右上角显示已登录账号及退出账号 使用filter实现未登录拦截

1.使用cookie session 实现自动登陆

1)登陆成功时,创建cookie 设置cookie保存时长 用于返回到前端
2)登陆成功时,向request中添加session 用于filter
LoginServlet.java:

@WebServlet("/login")
/* ... doGet 
   ... 设置编码*/
   String number = request.getParameter("number");
   String password = request.getParameter("password");
   String inputCode = request.getParameter("inputCode");
   String randomCode = (String)request.getSession().getAttribute("changeCode");
   
   // 调用service层 返回查询结果
        UserService service = new UserServiceImpl();
        List<User> user = service.loginByNumber(number,password);

// 如果查询结果不为空 与 验证码输入正确
if (user.toString() != "" && inputCode.equals(randomCode)) {       
    // 创建cookie                 
    Cookie cookie = new Cookie("number",number);
    // 设置cookie保存1天
    cookie.setMaxAge(60*60*24);
    response.addCookie(cookie);
    // 创建Session
    request.getSession().setAttribute("Num",number);
    // 登陆成功 转发到主页
    request.getRequestDispatcher("index.html").forward(request,response);
}

2.ajax右上角显示已登录账号及退出账号

3)访问主页index.html时,利用ajax调用 findCookieServlet.java 从request中取出cookies 遍历cookies
查找是否有名为number 的cookie 。如果有 将cookie传回前端页面 。
4)点击退出登录 调用ClearCookieServlet.java 清除cookie session 刷新页面
登陆前
index.html

<!-- 置顶导航栏右侧 -->
<ul class="nav navbar-nav navbar-right">
    <li><a id="loginCheck" href="login.html">点此登录</a></li>
    <li><a href="personalHomePage.html">个人主页</a></li>
</ul>
...
<script>
    $(function () {
        $.get("findCookieServlet",{},function (data_cookie) {
            var lc = $("#loginCheck");
            if (data_cookie) {
                lc.html(data_cookie + "欢迎您!");
                // 移除“点击登陆”的 href 禁止点击
                lc.removeAttr("href");
                // 添加退出登录
                lc.append("<a href='/ClassWeb/clearCookieServlet'>退出登录</a>");
            }
        });
    });
</script>

FindCookieServlet.java

// 省略了 doGet 编码 
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        // 查看是否有名为number的cookie
        if ("number".equals(cookie.getName())) {
            ObjectMapper mapper = new ObjectMapper();
            // 将cookie的值 已登录的学号传到前台
            mapper.writeValue(response.getWriter(),cookie.getValue());
        }
    }
}

成功登陆后:
登陆后
ClearCookieServlet.java

@WebServlet("/clearCookieServlet")
// doGet中
// 退出登录
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("number".equals(cookie.getName())) {
            // 设置时间为0  等同于删除cookie
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }
}
request.getSession().removeAttribute("Num");
response.sendRedirect(request.getContextPath() + "/index.html");

导航栏又回到了 “点此登录”。。

3.使用filter实现未登录拦截

5)进入留言板messageBoard.html页面时 调用 LoginFilter.java
读取session 已有session 放行 ;未有session 既是未登录 跳转到登录页登录
LoginFilter.java

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        // 强转为HttpServletRequest 否则无法获取资源请求路径
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Object user = request.getSession().getAttribute("Num");
        if (user == null) {
            // 未登录 跳转到登录界面
            response.getWriter().write("您还未登录,三秒钟后跳转至登录界面...");
            response.setHeader("refresh", "3;url=login.html");
        } else {
            //已登录 放行
            chain.doFilter(req, resp);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_43581949/article/details/89300761