10.2 Easymall项目的 使用cookie记住用户名 用session保持登录状态 验证码的实现

1.Cookie记住用户名

1.1 修改_head.jsp页面的登录按钮使其指向登录页面

1.2 修改登录页面中的表单提交路径

1.3创建LoginServlet.java:其主要功能是负责创建cookie并设置时间和路径,并通过响应头传回给浏览器保存cookie

            package com.easymall.servlet;
            
            import java.io.IOException;
            
            import javax.servlet.ServletException;
            import javax.servlet.http.Cookie;
            import javax.servlet.http.HttpServlet;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            //登录Servlet
            public class LoginServlet extends HttpServlet {
            
                    public void doGet(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                            //0.乱码处理
                            request.setCharacterEncoding("utf-8");
                            response.setContentType("text/html;charset=utf-8");
                            //1.获取参数
                            String username = request.getParameter("username");
                            String password = request.getParameter("password");
                            //获取是否记住用户名选项
                            String remname = request.getParameter("remname");//"true"   null  checkBox是否被勾选
                            //2.记住用户名--cookie
                            //remname为"true"则需要记住用户名,反之为null不需要记住用户名。
                            if("true".equals(remname)){  //如果勾选了记住用户名选项
                                    Cookie cookie = new Cookie("remname",URLEncoder.encode(username, "utf-8"));
                                    cookie.setMaxAge(60*60*24*30);//30天记住用户名
                                    cookie.setPath(request.getContextPath()+"/");
                                    response.addCookie(cookie);
                            }else{                     //如果没有勾选记住用户名选项,则创建一个新的cookie,name和path 一致,时长设置为0,替换掉原来的存储在浏览器的cooie,这个过程就是删除cooie
                                    Cookie cookie = new Cookie("remname", "");
                                    cookie.setMaxAge(0);
                                    cookie.setPath(request.getContextPath()+"/");
                                    response.addCookie(cookie);
                            }
                            //3.保存用户登录状态---session
                            //4.跳转回首页
            //        response.sendRedirect("http://www.easymall.com");
                    response.sendRedirect(request.getContextPath()+"/");
                    }
            
                    public void doPost(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                            doGet(request, response);
            
                    }
            
            }

修改login.jsp页面:获取存储的cooie内容,并选出需要的cooie,恢复用户名文本框上的用户名

<table>
    <%
        //获取cookie中的remname 读取其中的用户名
        Cookie[] cs = request.getCookies();
        Cookie remnameC = null;
        //初次获取cookie数组为null
        if(cs !=null){
            for(Cookie c:cs){//遍历cookie数组,寻找remname这个cookie
                if("remname".equals(c.getName())){
                    remnameC = c;
                }
            }
        }
        String username="";
        if(remnameC !=null){
            username = URLDecoder.decode(remnameC.getValue(), "utf-8");  //通过utf-8解码
        }
    
 %>

<input type="checkbox" name="remname"  value="true"
    <%="".equals(username)?"":"checked='checked'" %>    
    
/>记住用户名

2.用session保持登录状态

              通过登录功能,保存用户的登录状态。

                     request域~范围太小

                     ServletContext域~范围太大

                     session域--合适

              a. 修改LoginServlet.java,添加如下代码:

            //3.保存用户登录状态---session
                    //判断用户名域密码是否匹配
                    Connection conn = null;
                    PreparedStatement ps = null;
                    ResultSet rs = null;
                    try {
                            conn = JDBCUtils.getConnection();
                            ps = conn.prepareStatement("select * from user where username =? and password=?");
                            ps.setString(1, username);
                            ps.setString(2, password);
                            rs = ps.executeQuery();
                            if(rs.next()){//用户名和密码正确,完成登录
                                    HttpSession session = request.getSession();
                                    session.setAttribute("username", username);
                            }else{//返回登录页面作出提示
                                    request.setAttribute("msg", "用户名或密码不正确");
                                    request.getRequestDispatcher("/login.jsp").forward(request, response);
                                    return;
                            }
                    } catch (SQLException e) {
                            e.printStackTrace();
                    }finally{
                            JDBCUtils.close(conn, ps, rs);
                    }
                    
                    //4.跳转回首页
            //        response.sendRedirect("http://www.easymall.com");
                    response.sendRedirect(request.getContextPath()+"/");  //    /代表的是转到缺省应用,因为缺省应用的request.getContextPath()就是空

_head.jsp页面中添加如下内容:这个是可以分开的<%%>,只要保证是匹配的示行,中间可以穿插html代码 因为一个浏览器对同一个服务器只有一个session对象,而session就相当于是一个cooie,有其作用域,当你访问一定

url ,请求头才会自带相关cooie。

<%
    //判断是否存在登录状态  
    if(request.getSession(false) != null 
    && request.getSession().getAttribute("username")!=null){
    //第一个判断是确认session对象是否存在,如果存在仍然不能确定是否包含username域属性(登录状态) 
    //第二个判断是确认当前session对象中是否包含username属性,如果包含才从中取出用户名,在页面中显示 
    %>
    <a href="#">欢迎<%=request.getSession().getAttribute("username") %>,回来</a>&nbsp;&nbsp;|&nbsp;&nbsp;
    <a href="#">注销</a>
    <% 
    }else{
        %>
    <a href="<%=request.getContextPath() %>/login.jsp">登录</a>&nbsp;&nbsp;|&nbsp;&nbsp;
    <a href="<%=request.getContextPath() %>/regist.jsp">注册</a>
        <%
    }
 %>

用户名不存在

 

c.注销功能

修改_head.jsp页面

创建LogOutServlet.java

        package com.easymall.servlet;
        
        import java.io.IOException;
        
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        //注销servlet
        public class LogOutServlet extends HttpServlet {
        
                public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                        //注销用户就是销毁session
                        if(request.getSession(false) !=null){
                                
                                request.getSession().invalidate();
                        }
                        //跳转回首页
                        response.sendRedirect(request.getContextPath()+"/");
                        
                }
        
                public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                        doGet(request, response);
        
                }
        
        }

   7. 验证码实现

 a. 在ValidateServlet中添加如下内容:

        response.setDateHeader("Expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        VerifyCode vc = new VerifyCode();
        //当前servlet只有img标签调用,所以将图片放入缓冲区,
        //最终会在其调用的位置输出在浏览器中。
        vc.drawImage(response.getOutputStream());
        String code = vc.getCode();
        //添加验证码到session域
        request.getSession().setAttribute("code", code);
        System.out.println(code);
        System.out.println("执行成功~!");

 

b.在registServlet中添加如下内容:

        //6.验证码校验
                //TODO:session
                //获取域中验证码和用户输入的验证码,作比对
                String code = (String) request.getSession().getAttribute("code");
                if(!code.equalsIgnoreCase(valistr)){
                        request.setAttribute("msg", "验证码错误");
                        request.getRequestDispatcher("/regist.jsp").forward(request, response);
                        return;
                }

 

posted @ 2019-08-16 10:05  三十六烦恼风x  阅读(271)  评论(0编辑  收藏  举报