• servlet07


    1.session验证
    可以防止非登录的用户,通过在地址栏中输入地址,访问受保护的页面

    step1.在用户登录成功之后,将用户的信息保存到session中

    step2.在访问受保护的页面时,校验session中是否包含用户的信息
    2.session删除

    session.invalidate();
         request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            //获取请求资源路径
            String uri=request.getRequestURI();
            //截取  /list
            String action=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
            AdminDAO dao=(AdminDAO)DAOFactory.getInstance("AdminDAO");
            if("/list".equals(action)){
                //session校验
                HttpSession session=request.getSession();
                Object obj=session.getAttribute("admin");
                if(obj==null){
                    //登录失败
                    response.sendRedirect("login.jsp");
                    return;
                }
                //获取集合数据
                try {
        //            人为制造异常
        //            String str=null;
        //            str.length();
                    List<Admin> list=dao.finAll();
                    //将数据转交给jsp展示
                    //转发
                    request.setAttribute("list", list);
                    request.getRequestDispatcher("list.jsp").forward(request, response);
                } catch (Exception e) {
                    e.printStackTrace();
                    //将异常信息记录到日志里面
                    //将异常往外抛
                    throw new ServletException(e);
                }
            }else if("/add".equals(action)){
                String username=request.getParameter("username");
                String password=request.getParameter("password");
                String realname=request.getParameter("realname");
                Admin admin=new Admin(username,password,realname);
                try {
                    dao.add(admin);
                    response.sendRedirect("list.do");
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ServletException(e);
                }
            }else if("/del".equals(action)){
                int id=Integer.parseInt(request.getParameter("id"));
                try {
                    dao.del(id);
                    response.sendRedirect("list.do");
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ServletException(e);
                }
            }else if("/load".equals(action)){
                int id=Integer.parseInt(request.getParameter("id"));
                try {
                    Admin admin=dao.findById(id);
                    //转发
                    request.setAttribute("admin", admin);
                    request.getRequestDispatcher("update.jsp").forward(request, response);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ServletException(e);
                }
            }else if("/update".equals(action)){
                int id=Integer.parseInt(request.getParameter("id"));
                String username=request.getParameter("username");
                String password=request.getParameter("password");
                String realname=request.getParameter("realname");
                Admin admin=new Admin(id,username,password,realname);
                try {
                    dao.update(admin);
                    response.sendRedirect("list.do");
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ServletException(e);
                }
                
            }else if("/login".equals(action)){
                //获取用户验证码
                String userCode=request.getParameter("userCode");
                //获取账号及密码
                //获取session
                HttpSession session=request.getSession();
                String username=request.getParameter("username");
                String password=request.getParameter("password");
                //校验
                //验证正确的验证码
                String rightCode=(String)session.getAttribute("rightCode");
                if(!rightCode.equalsIgnoreCase(userCode)){
                    //验证失败
                    request.setAttribute("code_msg", "验证码错误");
                    request.getRequestDispatcher("login.jsp").forward(request, response);
                    return;
                }
                try {
                    Admin admin=dao.findByUserName(username);
                    if(admin!=null&&admin.getPassword().equals(password)){
                        //登录成功                    
                        //将用户的信息保存到session上
                        session.setAttribute("admin", admin);
                        response.sendRedirect("list.do");
                    }else{
                        //登录失败
                        request.setAttribute("login_msg", "账号或密码错误");
                        request.getRequestDispatcher("login.jsp").forward(request, response);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ServletException(e);
                }
                
            }else if("/logout".equals(action)){
                //session删除
                //重定向到登录页面
                HttpSession session=request.getSession();
                session.invalidate();
                response.sendRedirect("login.do");
            }
            
            out.close();
        }

     3.URL重写

    为什么需要URL重写?

    因为sessionId是依赖于cookie的机制保存在浏览器内存中,那么当用户禁止cookie之后,如何继续使用cookie?

    解决方案:URL重写

    如何重写?

    链接,表单:

    response.encodeURL("count");
    
    <form action="<%=response.encodeURL(count)%>">
    
    </form>

    重定向:

    response.encodeRedirectURL("地址");

    转发:不需要(一次交互)

    4.cookie与session区别:

    cookie:将数据保存在客户端

    session:将数据保存在服务器

    session优势:

    a.session保存的数据类型更宽泛

    b.session保存的数据量更大

    c.session更安全

    session缺点

    a.sessionId是保存在浏览器内存中,浏览器一旦关闭,内存空间被释放,sessionId消失。

    b.服务器会为每一个用户分配一个session对象,而session是保存在服务器端,当用户较大时,对服务器的压力响应增加,而cookie是保存在浏览器端,理论上对服务器没有压力。

    应用场景:

    session:登录拦截(session验证)、验证码校验

    cookie:自动登录

    5.过滤器

    过滤器是servlet规范当中的一个特殊的类,可以用来对servlet请求进行拦截并处理。

    如何定义一个过滤器

    step1.定义一个Java类,实现一个Filter接口

    step2.重写接口中的方法

    step3.在web.xml文件中配置过滤器

    练习:写一个过滤器ProcessFilter2,判断评论的长度是否超过指定的范围(比如:长度限制不能超过20)

      分析:当有多个过滤器符合过滤条件时,它们的执行顺序与什么有关?

      与web.xml文件中<filte-mapping>的配置有关。

    优势:

    a.当多个web组件有相同的功能需要实现时,可将这部分逻辑封装到过滤器中,方便后期维护

    b.可"插拔性"比较好,当增加或者减少一个功能时,不会影响已经存在的功能。

    应用场景:登录拦截、IP过滤

  • 相关阅读:
    python的with语句
    flask如何实现https以及自定义证书的制作
    flask及扩展源码解读
    加密的那些事
    SQLALchemy如何查询mysql某个区间内的数据
    集群设备之间的资源共享
    pycryptodom的源码安装
    github创建项目,并提交本地文件
    响应头里的"Last-Modified"值是怎么来的?
    SQL2005 数据库——查看索引
  • 原文地址:https://www.cnblogs.com/yingyigongzi/p/9166132.html
Copyright © 2020-2023  润新知