• 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;
                    }
  • 相关阅读:
    创建对象_原型(Prototype)模式_深拷贝
    创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
    创建对象——单例(Singleton)模式
    模板方法模式
    移除HTML5 input在type="number"时的上下小箭头
    颜色名列表
    什么是盒模型?
    JQuery中$.ajax()方法参数详解
    zsh下docker命令tab补全方法
    ubuntu14.04 搭建gitlab服务
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11362167.html
Copyright © 2020-2023  润新知