JavaWeb 自动登录和退出(图解代码执行流程)

自动登录

主要通过cookie和session的使用,实现自动登录

第一次登录执行流程

用户第一次登录的时候,只要勾选自动登录功能,我们就生成一个cookie,并将用户名和密码保存到cookie中存放到用户的浏览器中
这里写图片描述

生成cookie的代码:

// 判断用户是不是想自动登录
            String auto = request.getParameter("auto");
            if ("ok".equalsIgnoreCase(auto)) {
                // 说明用户想自动登录
                Cookie cookie = new Cookie("autoLogin", userFind.getUsername() + "&" + userFind.getPassword());
                // 设置cookie的存活时间和绑定路径
                cookie.setMaxAge(360000);
                cookie.setPath(request.getContextPath());
                // 在响应中添加cookie,并返回给浏览器
                response.addCookie(cookie);
            }

第二次登录执行流程

有了用户的cookie后,我们就可以到cookie中读取用户的账号和密码,进行自动登录,但是登录成功后将用户名和密码放到session中,否则每次用户点击我们的页面中的链接时,我们都需要到数据库查询判断,影响效率
这里写图片描述

AutoLoginFilter代码


import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itheima.domain.User;
import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;

public class AutoLoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    /**
     * 处理过滤信息方法
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        Object object = req.getSession().getAttribute("user");
        // 如果从session中获取user为空,我们才需要获取cookie进行登陆以及存放到session中,否则直接放行
        if (object == null) {
            // 获取请求携带的cookies
            Cookie[] cookies = req.getCookies();
            Cookie cookie = null;
            // 先要判断获取的cookies是否存在,不然遍历的时候会报空指针异常
            if (cookies != null && cookies.length > 0) {
                // 遍历cookies
                for (Cookie c : cookies) {
                    String name = c.getName();
                    if ("autoLogin".equals(name)) {
                        // 说明cookie中存在自动登录信息
                        cookie = c;
                        break;
                    }
                }
            }

            try {
                // 说明存在自动登陆的cookie
                if (cookie != null) {
                    // 我们需要把cookie的值读取出来存放到session中
                    String[] split = cookie.getValue().split("&");
                    User user = new User();
                    user.setUsername(split[0]);
                    user.setPassword(split[1]);
                    // 调用service层登陆
                    UserService service = new UserServiceImpl();
                    User userBack = service.login(user);
                    if (userBack != null) {// 说明登陆成功
                        req.getSession().setAttribute("user", userBack);
                    }
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // 如果不存在直接 放行
        chain.doFilter(req, resp);

        // 过滤响应
    }
    @Override
    public void destroy() {
    }

}

退出

退出的主要思路就是把session中和cookie中用户信息干掉

public void loginOut(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 干掉cookie和session
        HttpSession session = request.getSession();
        session.removeAttribute("user");

        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if ("autoLogin".equals(c.getName())) {
                    //设置cookie存活时间为0
                    c.setMaxAge(0);
                    //将cookie响应到前台
                    response.addCookie(c);
                    break;
                }
            }
        }
        // 重定向到首页
        response.sendRedirect(request.getContextPath() + "/index.html");
    }

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/80764326
今日推荐