m0_62667564 2023-03-26 18:45 采纳率: 84.8%
浏览 43
已结题

Servle使用cookie实现自动登录

Servle使用cookie实现自动登录,
想做到在用户第一次登录后创建cookie,若用户选择了“下一次自动登录",则在关闭浏览器再打开login.html界面后自动登录至主页面(home.html)
但只能做到两个分开的servlet,一个是创建cookie,如图

@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String name = req.getParameter("userName");
        String pwd = req.getParameter("pwd");
        String page;
        if ("caterpillar".equals(name) && "123456".equals(pwd)) {
            Cookie cookie = new Cookie("userName", "caterpillar");
            if ("on".equals(req.getParameter("autoLogin"))) {
                cookie.setMaxAge(60*60);
            }
            resp.addCookie(cookie);
            page = "home.html";
        } else {
            page = "login.html";
        }
        resp.sendRedirect(page);
    }
}

另一个是验证是否存在cookie且名字与值正确,再进行页面跳转,如图

@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        Optional<Cookie> userCookie = Optional.ofNullable(req.getCookies())
                .flatMap(this::userCookie);
        if(userCookie.isPresent()){
            Cookie cookie = userCookie.get();
            req.setAttribute(cookie.getName(), cookie.getValue());
            System.out.println(cookie.getName()+cookie.getValue());
            req.getRequestDispatcher("home.html").forward(req,resp);
        }else{
            resp.sendRedirect("login.html");
        }
    }

    private Optional userCookie(Cookie[] cookies) {
        return Stream.of(cookies).filter(cookie -> check(cookie)).findFirst();
    }
    private boolean check(Cookie cookie){
        return "userName".equals(cookie.getName())&&"caterpillar".equals(cookie.getValue());
    }

若将二者合并则会浏览器报错,提交响应后无法调用sendRedirect()。如图

@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //取得cookie,且名称和值对应
        Optional<Cookie> userCookie = Optional.ofNullable(req.getCookies())
                .flatMap(this::userCookie);

        if (userCookie.isPresent()) {
            Cookie cookie = userCookie.get();
            req.setAttribute(cookie.getName(), cookie.getValue());
            System.out.println(cookie.getName() + cookie.getValue());
            req.getRequestDispatcher("home.html").forward(req, resp);
        } else {
            resp.sendRedirect("login.html");
        }
            String name = req.getParameter("userName");
            String pwd = req.getParameter("pwd");
            String page;
            if ("caterpillar".equals(name) && "123456".equals(pwd)) {
                Cookie cookie = new Cookie("userName", "caterpillar");
                if ("on".equals(req.getParameter("autoLogin"))) {
                    cookie.setMaxAge(60*60);
                }
                resp.addCookie(cookie);
                page = "home.html";
            } else {
                page = "login.html";
            }
            resp.sendRedirect(page);
        }
    private Optional userCookie(Cookie[] cookies) {
        return Stream.of(cookies).filter(cookie -> check(cookie)).findFirst();
    }
    private boolean check(Cookie cookie){
        return "userName".equals(cookie.getName())&&"caterpillar".equals(cookie.getValue());
    }
}

所以应该如何处理?而且,想问@webServlet的注释应该怎么写?如果写成doLogin.do(login.html界面表单的action值)那么每一次都需要先进入HTML界面,点击登录,然后进入servlet,就不是自动登陆了;如果直接访问doLogin.do又没有访问到HTML界面即实现了自动登录,所以是怎么做到实现自动登录的?
请帮忙修改一下我的代码,谢谢

  • 写回答

2条回答 默认 最新

  • 关注

    首先要判断userCookie是否为空,如果为null返回登录页面,否则执行自动登录。

    protected void service(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
                //取得cookie,且名称和值对应
                String user="";
                  String pass="";
                  //读取cookie
                  Cookie[] cookies = request.getCookies();
                  if(cookies!=null){
                      for(int i=0;i<cookies.length;i++){
                          //读取username
                          if(cookies[i].getName().equals("userName")){
                              //解码操作:URLDecoder.decode()方法
                              user = URLDecoder.decode(cookies[i].getValue());    
                          }
                          //读取密码
                          if(cookies[i].getName().equals("pwd")){
                              pass = URLDecoder.decode(cookies[i].getValue());
                          }
                      }
                      req.setAttribute("userName", user);
                      req.getRequestDispatcher("home.html").forward(req, resp);
                  }else{
                      resp.sendRedirect("login.html");
                  }
                String name = req.getParameter("userName");
                String pwd = req.getParameter("pwd");
                String page;
                if ("caterpillar".equals(name) && "123456".equals(pwd)) {
                    Cookie cookie = new Cookie("userName", "caterpillar");
                    if ("on".equals(req.getParameter("autoLogin"))) {
                        cookie.setMaxAge(60*60);
                    }
                    resp.addCookie(cookie);
                    page = "home.html";
                } else {
                    page = "login.html";
                }
                resp.sendRedirect(page);
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 创建了问题 3月26日