DAO设计模式和Web会话技术:Cookie、Session

1、DAO设计模式

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。

软件的分层架构:
   ●显示层(Web层)(JSP/Servlet)
   ●业务层:就是用来实现具体某个功能的需求
   ●数据层:DAO模式来实现数据的持久化操作
   ●资源层
在这里插入图片描述
DAO组成:
   ●DbHelper:专门负责数据库打开与关闭操作

   ●VO:主要由属性,set、get方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的一条记录

   ●DAO:主要定义数据操作的接口,例如增删改查等

   ●Impl:DAO接口的真正实现类,主要完成具体的数据库操作,但是不负责数据库的打开和关闭

   ●Proxy:代理实现类,主要完成数据库的打开和关闭,并且负责调用真实实现类完成对象的操作。

   ●Factory:工厂类,通过工厂类创建并获取一个DAO的实例对象
      XXXDao dao=new XXXDaoImpl();//OracleDaoImpl

对于包的命名:
   ●使用DAO时对于包有严格的命名方式
   ●数据库连接:xxx.dbc.DbHelper
   ●DAO接口:xxx.dao.IxxxDAO
   ●DAO接口的真实实现类:xxx.dao.impl.XxxDAOImpl
   ●Dao接口的代理实现类:xxx.dao.proxy.XxxDaoProxy
   ●VO类:xxx.vo.Xxx,或者:xxx.domain.Xxx
   ●工厂类:xxx.factory.DaoFactory

2、Web会话技术

WEB会话可以理解为:用户打开一个浏览器,访问某个web应用程序,在这个web应用程序中点击多个超链接,访问服务器上的多个WEB资源,然后关闭浏览器,整个过程称为一个会话。

例如:
 1、打开浏览器
 2、访问京东,此时就和京东网站,产生了会话
 3、访问京东网站上的某个具体商品,或其他页面,也可以把商品加入到购物车,结算等一系列的操作
 4、关闭浏览器,此时,与京东网站的会话也就结束了。

【HTTP协议是一种无状态的协议,所以导致服务器端不会记录客户端的任何信息,也就不认识客户端】

Java Web开发中使用的会话技术

在客户端和服务器端交互的过程中,通常会产生一些数据,为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

通过有状态的会话技术,可以解决的场景:
   ●购物车
   ●用户登录的状态

通过购物车案例,来了解会话技术Cookie和Session对象

   ●Cookie对象:客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。

   ●Session对象:服务器端的会话技术,它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session(会话域)域中,实现该用户在本次会话中,可以随时获取Session域中的数据,满足多次请求响应之间进行数据传递、访问使用。

会话实现的过程:

当客户端和服务器端,建立会话,会产生一个会话对象Session,并且会为这个会话产生一个唯一的标识,而且服务器端会自动的把这个会话的标识响应的客户端浏览器上,并且缓存到浏览器中,当下一次在请求时,浏览器会自动的带上这个会话的标识,并发送到服务器端,当服务器端接收到请求,会根据传递过来的会话标识,在服务器上查找所对应的Session对象,如果找到就之间把数据存储到对应的会话域中,如果没有找到,服务器端的会话对象有可能失效或者被删除,此时会自动的再创建一个新的会话。

3、Cookie技术

3.1、什么是Cookie

Cookie对象:客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。

总结:
   ●在客户端保存的数据,数据产生是在服务器
   ●在浏览器中Cookie是以文本的方式存储数据

3.2、Cookie的应用场景

1、判断用户是否登录过网站,以便下次登录时能够实现自动登录或者记住密码。如果删除Cookie,则每次登录必须重新填写登录的信息
2、保存上次登录的时间等相关信息
3、保存上次查看的页面
4、浏览计数,统计

3.3、Cookie的基础使用

3.3.1、服务器向浏览器发送Cookie

把服务器端想要保存的客户端数据,通过Cooke来完成,Cookie中保存的数据都是较小的文本数据。

实现步骤:
 a) 创建Cookie对象,直接new Cookie(String key,String value);
 b)将Cookie数据保存到客户端,使用response对象的addCookie()方法

API:

●Cookie类,对象创建

Cookie(Stringkey,Stringvalue),用于创建Cooke对象,并指定Cookie中的键值对信息

●Response对象

addCookie(Cookiec),用于将指定的Cookie对象,响应到客户端的浏览器中

代码演示:

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Cookie对象
        Cookiecookie = newCookie("bdit", "java");
        //使用response对象,添加cookie到响应,并发送到客户端浏览器上
        resp.addCookie(cookie);
    }
}

访问演示:
在这里插入图片描述

3.3.2、获取浏览器携带的Cookie

浏览器在访问服务器的时候,会携带保存的Cookie数据,服务器端可使用request对象获取Cookie数据,Cookie数据放在请求头里。

实现步骤:
   ●使用request对象getCookies()方法,获取浏览器携带的所有Cookie数据
   ●遍历拿到一个Cookie对象,获取Cookie的键值对信息

API:
●request对象方法

Cookie[] getCookes(),获取所有的Cookie对象

●Cookie对象方法

StringgetName()获取Cookie的key
StringgetValue()获取Cookie的值

代码演示:

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/cookieDemo2"})
public class CookieServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中携带的所有
        Cookie[] cookies = req.getCookies();
        //遍历
        for (Cookie cookie:cookies) {
            String key = cookie.getName();
            String value = cookie.getValue();
            System.out.println(key + "=" + value);
        }
    }
}

【注意:浏览器可以决定是否存储Cookie,如果浏览器禁用Cookie,那么浏览器也就无法存储Cookie的任何信息,会话失效】

3.4、Cookie中使用中文问题

Cookie数据,值可以使用中文,但是不建议使用中文
   ●如果在Cookie中使用中文,Tomcat8以下不支持,从Tomcat8开始支持中文
   ●如果要使用中文,建议把中文进行UTF-8编码

API:
 ●URLEncoder类
   ○String encode(“需要编码的数据”,“采用的编码”) 采用指定的编码对数据进行编码,返回编码后的字符串

 ●URLDecoder类
   ○String decode(“需要解码的数据”,“采用的编码”)采用指定的编码对数据进行解码,返回解码后的字符串

代码演示:

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String value="Java技术";
        String encode=URLEncoder.encode(value,"utf-8");
        //创建Cookie对象
        Cookie cookie=new Cookie("bdit",encode);
        //使用response对象,添加cookie到响应,并发送到客户端浏览器上
        resp.addCookie(cookie);
    }
}

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/cookieDemo2"})
public class CookieServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中携带的所有
        Cookie[] cookies = req.getCookies();
        //遍历
        for (Cookie cookie:cookies) {
            String key = cookie.getName();
            String value = cookie.getValue();
            String decode=URLDecoder.decode(value,"utf-8");
            System.out.println(key + "=" + decode);
        }
    }
}

访问演示:
在这里插入图片描述

3.5、Cookie的有效路径

Cookie对象
   ●setPath(“cookie的有效路径”),用于设置cookie的有效路径,如果参数写成request.getContextPath()代表web应用下任意资源都携带本cookie

   ●Cookie的最大存活时间,默认是当前会话,浏览器关闭,该会话结束,可以通过cookie的方法设置最大存活时间

      ■setMaxAge(int 秒) 更改Cookie的生存时间,单位是秒

代码演示:

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/cookieDemo1"})
public class CookieServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String value = "Java技术";
        String encode = URLEncoder.encode(value, "utf-8");
        //创建Cookie对象
        Cookie cookie = new Cookie("bdit", encode);
        //设置cookie的有效路径
        cookie.setPath(req.getContextPath() + "/cookie/demo");
        //设置cookie的存活时间
        cookie.setMaxAge(60);
        //使用response对象,添加cookie到响应,并发送到客户端浏览器上
        resp.addCookie(cookie);
    }
}

访问演示:
在这里插入图片描述

3.6、删除已存在的Cookie

要删除已存在的Cookie,可以设置Cookie的有效时间为0

如果要覆盖一个已经存在的Cookie,必须名称与有效路径和原cookie保持一致

覆盖原有的Cookie需要满足的条件:
   ●保证键的名字相同
   ●保证有效路径相同

4、Session技术

4.1、 什么是Session

Session对象:服务器端的会话技术,它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中,实现该用户在本次会中,可以随时获取Session域中对象,满足多次请求响应之间进行数据传递和访问。

●Session与Cookie是紧密相关的,Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。

●Session信息对客户端来说,不同的用户,使用不同的Session信息来记录,当用户启用Session时,Tomcat容器自动生成一个SessionID,在新会话开始时,服务器将SessionID当作Cookie存储在用户的浏览器中。
在这里插入图片描述

4.2、Session和Cookie的区别

cookiesession
会话数据保存的位置浏览器服务器
数据的安全性不安全安全
存储的数据是否有限制

4.3、Session的使用场景

常见应用场景
   ●保存用户登录的信息
   ●将某些数据放入session中,供统一用户在不同的页面使用
   ●登录验证信息

4.4、HttpSession的常用方法

HttpServletRequest中有两个方法可用于创建会话:

   ●public HttpSession getSession(),调用此方法时,容器会先检查客户端先前送出的请求是否有建立过HTTP会话: 如果没有:容器会新建一个会话,并赋予一个唯一的会话ID。如果有:容器会根据客户请求中的会话ID找到相匹配的会话。

   ●public HttpSession getSession(boolean flag) 此方法的flag是用来指定是否有必要创建一个会话:例如:调用getSession(false)时,若客户先前没有建立过会话,则方法将返回null。

在这里插入图片描述

package com.bdit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/demo1"})
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建或获取会话对象
        HttpSession session = req.getSession();
        //响应
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        if (session.isNew()) {
            out.print("<p>新创建了一个会话,会话id是:" + session.getId() + "</p>");
        } else {
            out.print("<p>会话已存在,会话id是:" + session.getId() + "</p>");
        }
        //设置会话的有效时间,默认是30分钟
        session.setMaxInactiveInterval(3600);
        out.print("<p>会话创建的时间是:" + session.getCreationTime() + "</p>");
        out.print("<p>最后一次访问的时间是:" + session.getLastAccessedTime() + "</p>");
        out.print("<p>session默认最大的有效时间:" + session.getMaxInactiveInterval() + "</p>");
        //让session失效
        //session.invalidate();
        //往会话域中存储数据
        session.setAttribute("a", "session会话域");
        session.setAttribute("b", "2020.10.21");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

4.5、URL重写

Cookie被证明存在一些安全隐患。所以现在好多谨慎的用户都会在浏览器中设置禁用Cookie。此时就要用到另一种技术“URL重写”来维持会话。

如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,Web服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径进行URL重写。

URL重写的原理:
  ●将会话ID添加到URL结尾,以标识该会话,这样服务器就可以从请求URL中取出会话ID,并用它查找匹配的会话了。http://ip:port/appName/url;jsessionid=xxxxx?param=value

URL重写的方法:
  ●HttpServletResponse接口中提供了两个用于完成URL重写的方法:
    String encodeURL(String url) 对超链接或form表单的action属性中设置的URL进行重写。
    String encodeRedirectURL(String url) 对要传递给sendRedirect()方法的URL进行重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值