书城项目二和Cookie和Session

书城项目二和Cookie和Session

<div id="main">
   <form action="manager/bookServlet" method="post">
      <!--这里需要name=action来传达,执行的方法-->
      <input type="hidden" name="action" value="${empty param.id ? "add":"update"}">
      <input type="hidden" name="id" value="${requestScope.book.id}">
      <table>

2.这里${empty param.id ? "add":"update"} 是用来区分,用户选择的是增加图书,还是修改图书,从而实现不同的功能,但是要注意,还要再下面再加一个隐藏域,因为,我们跟新图书是根据id来跟新的,如果不加下面的隐藏域,那么系统的id值为null

3.分页的计算公式:(pageNo-1)x pageSize;

Cookie

  1. Cookie的创建,服务器创建,浏览器保存

            //创建cookie对象
    Cookie cookie = new Cookie("key1", "value1");
      //通知客户端,保存cookie 这一步不可以省略,不然客户端不会收到cookie
     resp.addCookie(cookie);
          resp.getWriter().write("Cookie创建成功");
  2. Cookie的接受,浏览器发送,服务器接受

              //接受浏览器端发送来的cookie
    Cookie[] cookies = req.getCookies();  //得到的是一个cookies数组
    for (Cookie cookie : cookies) {  //遍历数组
        System.out.println("Cookie:"+cookie.getName()+"="+cookie.getValue());
  3. 想找查找某一个name值的cookie,可以定义一个Cookie工具类,在里面创建一个findCookie方法

    public class CookieUtils {
          //定义一个工具类,用来查找你要想的哪个name值的Cookie
         public static Cookie findCookie(String name, Cookie[] cookies){
                    if (name==null||cookies==null||cookies.length==0){
                         return null;
                    }
              for (Cookie cookie : cookies) {
                   if (name.equals(cookie.getName())){
                       return cookie;
                   }
    ​
              }
              return null;
         }
    }
    ​
               //接受浏览器端发送来的cookie
     Cookie[] cookies = req.getCookies();  //得到的是一个cookies数组
    /* for (Cookie cookie : cookies) {  //遍历数组
         System.out.println("Cookie:"+cookie.getName()+"="+cookie.getValue());
    ​
     }*/
     //查找 name值为key2的cookie
         Cookie iWantCookie = CookieUtils.findCookie("key2",cookies);
             if (iWantCookie!=null){
              resp.getWriter().write("找到了目标Cookie"+iWantCookie.getName());
             }

  4. 修改一个Cookie 的值(//其实就相当于覆盖,创建了一个同名的Cookie,浏览器保存时,会将前面哪个Cookie覆盖)

    方案一:

    public void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //修改Cookie的值,
        //其实就相当于覆盖,创建了一个同名的Cookie,浏览器保存时,会将前面哪个Cookie覆盖
            //第一步先创建一个你想要修改的Cookie的同名的、cookie对象
        Cookie cookie = new Cookie("key1", "value9");
             resp.addCookie(cookie);  //通知浏览器,保存Cookie
              resp.getWriter().write("cookie修改成功");
    }

    方案二:

          //方案二
     //先找到你要修改的Cookie
    Cookie key1 = CookieUtils.findCookie("key1", req.getCookies());
    if (key1!=null){
        key1.setValue("newValue10");
        resp.addCookie(key1);  //必不可少
        resp.getWriter().write("改变成功");
    }
  5. Cookie生命控制

    • 正数:标识在指定的秒数后国企

      public void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               //设置Cookie存活时间为-1: 浏览器一关,马上删除
              //先创建一个Cookie
          Cookie cookie = new Cookie("defaultLife", "defaultLife");
          //设置时间
          cookie.setMaxAge(-1); //注意 就算你不设置,系统也默认是认为 你的为-1
            //通知浏览器保存
           resp.addCookie(cookie);
      }
    • 负数:标识浏览器一关,Cookie就会被删除(默认-1)

      public void deleteCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 //设置Cookie存活时间为0:马上删除
             //先找到你要删除的对象
          Cookie key1 = CookieUtils.findCookie("key2", req.getCookies());
          //设置存货时间
          if (key1!=null){
              key1.setMaxAge(0);
              //通知浏览器保存
              resp.addCookie(key1);
          }else{
              resp.getWriter().write("没有合适的Cookie");
          }
      ​
      }
    • 零,标识马上删除Cookie

      public void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //设置Cookie存活时间为一个小时后删除
          //先创建一个Cookie
          Cookie cookie = new Cookie("key5", "value5");
          //设置时间
          cookie.setMaxAge(60*60);
          //通知浏览器保存
          resp.addCookie(cookie);
      }

免用户名登录

Cookie的有效路径

  1. Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发送,path属性是通过请求的地址来进行有效的过滤

  2. CookieA path =/工程路径

    CookieB path= /工程路径

    请求地址如下:http://ip:port/工程路径/a.html

    那么 CookieA发送 CookieB不发送

    请求地址如下:http://ip:port/工程路径/abc/a.html

    那么 CookieA发送,CookieB发送

  3. LoginServlet文件代码

    public class LoginServlet extends BaseServlet{
    ​
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                         //获取用户输入的值
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            //对比,来确实是否登录成功
              if ("zhangsan".equals(username)&&"123456".equals(password)){
                  System.out.println("登录成功");
              }else{
                  System.out.println("登录失败");
              }
                     //创建Cookie对象, 传入uername
            Cookie cookie = new Cookie("username", username);
               cookie.setMaxAge(60*60*24*7);  //保留 Cookie一个星期
              resp.addCookie(cookie);
        }
    }
  4. login.jsp文件代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
         <base href="http://localhost:8080/demo_cookie_session/">
    </head>
    <body>
    <form action="loginServlet" method="get">
          用户名<input type="text" name="username" value="${cookie.username.value}"><br>
            密码<input type="password" name="password" ><br>
          <input type="submit" value="登录">
    ​
    </form>
    ​
    </body>
    </html>  

Session

  1. Session就是一个接口(HttpSession)

  2. Session就是会话,他是用来维护一个客户端和服务器之间关联的一种技术,每一个客户端都有自己的一个Session

  3. Session会话中,我们经常用来保存用户登录之后的信息

  4. Session只会创建一次,以后的每一次都是调用第一次创建的,而且他们有一个唯一不变的id

  5. 创建Session

            //首先调用request.getSession方法创建Session
    HttpSession session = req.getSession();
       //判度是否是第一次创建
    boolean isNew = session.isNew();
     //获取session的id
    String id = session.getId();
     resp.getWriter().write("Session的id为"+id+"<br>");
    ​
     resp.getWriter().write("Session是否是第一次创建"+isNew+"<br>");
  6. 为Session赋值

    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //创建Session
        HttpSession session = req.getSession();
           //为session赋值
          session.setAttribute("key1","value1");
          resp.getWriter().write("已经成功为session赋值");
    ​
    }
  7. 取Session中的值

    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //创建Session
        HttpSession session = req.getSession();
           //为session赋值
          session.setAttribute("key1","value1");
          resp.getWriter().write("已经成功为session赋值");
    ​
    }

Session的生命周期

  1. public void setManlnactivelnterval(int interval) 设置Sessin的超时时间,以秒为单位(设置单独的超时时长)

    protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //自己设置一个超时时长
        HttpSession session = req.getSession();
        session.setMaxInactiveInterval(60);
        int maxInactiveInterval = session.getMaxInactiveInterval();
        resp.getWriter().write("设置的超时时长"+maxInactiveInterval);
    ​
    }
  2. public int getManlnactivelnterval(),获取Session的超时时间

  3. Session的默认超时时间为30分钟

  4. 如果想要更改Session的默认时间,可以在你的web.xml输入,将默认时间改为20分钟(这种是修改所有的默认时长)

    <session-config>
         <session-timeout>20</session-timeout>
    </session-config>
  5. Session超时的概念的介绍:Session的超时指的是,客户端两次请求的最长时间间隔,比如 我设置了超时时长为5秒,早五秒内,我一直点一个情趣,那么session的超时时长,本来已经走了1秒或者两秒,因为我请求了一下,马上又回到了5秒,又重新走

  6. 值为正数时,:设定超时时长,

  7. 值为负数时,:永不超时

  8. 立刻超时 session.invalidate();

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 //马上销毁
        HttpSession session = req.getSession();
        session.invalidate();
        resp.getWriter().write("立即销毁设置成功");
    }
  9. Session对象只会创建一次,以后的 每一次的requset.getSession();都是对第一次创建的Session的引用

  10. 服务器每次创建一个Session对象,都会产生一个Cookie对象,这个Cookie对象的key值永远都是JSESESSION,value值是Session的id值,然后将这个Cookie对象,保存到浏览器当作,以后的每一次,引用的都是第一次创建的Session的id值,得到了id值之后去服务器内存里面寻找与之对应的id值的Session,就可以找到第一次创建的Session

  11. 但是思考,如果我们先创建了一个Seesion之后,我们去把传到浏览器的Cookie删掉了,之后requset.getSession(),会找不到id值,那么是创建一个新的Session还是返回一个null呢?

    答案是创建一个新的Session对象 并且也会创建一个Cookie对象跟第一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值