Java Web之Cookie、Session

 

 

  講Cookie和Seesion以前,先講一下HTTP鏈接實際上是無序的,服務器不知道是誰在訪問它。如今咱們來實現一個簡單的郵箱功能。html

要求:html5

1.登陸頁面登陸以後看到收件箱和歡迎我java

2.點擊收件箱看到幾封郵件和歡迎我面試

3.點擊一封郵件顯示郵件內容和歡迎我瀏覽器

 

咱們先來用Servlet實現一下試試服務器

首先,寫一個HTML 叫login,代碼以下cookie

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>註冊頁面</h3>
<form action="/param/login" method="post">
    帳號:<input type="text" name="userName" value="默認值" required><br/>   <!--required是Html5的新特性,在之前必填字段咱們須要經過js來判斷,如今html5實現!-->
    密碼:<input type="password" name="passWord"><br/>
    <input type="submit" value="登陸"/>
</form>
</body>
</html>

而後咱們的Servlet有三個,分別是session

1.登陸的LoginServletdom

2.收件箱列表的ListServletide

3.郵件內容的GetServlet

代碼分別以下:

package main.com.vae.Param;

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;
import java.io.PrintWriter;

@WebServlet("/param/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String name=req.getParameter("userName");
        out.println("歡迎你:"+name+"</br>");
        out.println("<a href='/param/list?userName="+name+"'>收件箱</a>");


    }
}
package main.com.vae.Param;

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;
import java.io.PrintWriter;

@WebServlet("/param/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String name=req.getParameter("userName");
        out.println("歡迎你:"+name+"</br>");
        for (int i = 0; i < 6; i++) {
            out.println("<a href='/param/get?userName="+name+"'>一封郵件</a><br>");
        }



    }
}
package main.com.vae.Param;

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;
import java.io.PrintWriter;

@WebServlet("/param/get")
public class GetServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String name=req.getParameter("userName");
        out.println("歡迎你:"+name+"</br>");
        out.println("本封郵件的內容是:蜀雲泉,你真帥啊");

    }
}

看看效果,仍是不錯的

 

 可是有一個問題啊,由於我寫的是  <a href='/param/get?userName="+name+"'>  只有這樣才能傳個人名字過去,寫在了請求頭裏面這樣就顯示在瀏覽器的url裏面了啊

這樣是不行的,個人名字暴露了,之後還有其餘字段密碼,手機號,住址什麼的。。。這樣確定不行。因此,咱們本篇文章的主人公,cookie和seesion該出場了。

 

 

Cookie

 什麼是Cookie呢?

咱們用Cookie來實現一下上面的例子,把登陸頁面裏面的action改一下

 

 而後改一下咱們的三個Servlet,直接貼代碼吧

package main.com.vae.Cookie;

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

@WebServlet("/cookie/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String name=req.getParameter("userName");

        //使用Cookie技術
        Cookie cookie=new Cookie("userName",name); //建立Cookie
        resp.addCookie(cookie);   //把Cookie響應給瀏覽器

        out.println("歡迎你:"+name+"</br>");
        out.println("<a href='/cookie/list'>收件箱</a>");


    }
}
package main.com.vae.Cookie;

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

@WebServlet("/cookie/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String userName="";
        //獲取多個Cookie
        Cookie[] cookies=req.getCookies();
        for (Cookie cookie : cookies) {
            String name=cookie.getName();
            String value=cookie.getValue();

            if ("userName".equals(name)){
                userName=value;
            }

        }

        out.println("歡迎你:"+userName+"</br>");
        for (int i = 0; i < 6; i++) {
            out.println("<a href='/cookie/get'>一封郵件</a><br>");
        }



    }
}
package main.com.vae.Cookie;

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

@WebServlet("/cookie/get")
public class GetServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String userName="";

        Cookie[] cookies=req.getCookies();
        for (Cookie cookie : cookies) {
            String name=cookie.getName();
            String value=cookie.getValue();

            if ("userName".equals(name)){
                userName=value;
            }

        }

        out.println("歡迎你:"+userName+"</br>");
        out.println("本封郵件的內容是:蜀雲泉,你真帥啊");

    }
}

運行一下看看結果。完美的解決了上面的問題。

 

 

 

 Cookie的詳細介紹

 如下7點都得掌握,其中第4點,cookie中文亂碼的問題,Tomcat8.5版本以後,Cookie已經支持了中文了,8.5版本以前的不支持,須要本身手動的編碼解碼一下

第6點是最重要的,Cookie分爲會話Cookie和持久化Cookie,這兩個須要好好了解。

 

 能夠本身去嘗試,設定一個Cookie的存活時間爲15秒,能夠刷新頁面試試,15秒以後就沒有名字了。這個能夠作免登錄的事情。

 

 

Cookie的domain,若是修改了資源名稱,Cookie就不認識了,因此必須設置domain,cookie.setPath("/")

 

 

Cookie的缺陷:

 

 

Session

Session其實就是一個會話Cookie,關了瀏覽器以後啥都沒有了,屬於服務器端技術.

網上大把的以會員卡爲例子介紹Cooklie和Session的,我就不介紹了,Session技術服務器端會給你一個ID的,咱們能夠在瀏覽器裏面看到

 

 Session的一些操做:

 

  //使用Session技術
        HttpSession session=req.getSession(); //建立Session
        session.setAttribute("name",name);   //設置Session的值,Session是默認響應給瀏覽器的
        //獲取Session的值
        HttpSession session=req.getSession();
        userName=(String) session.getAttribute("name");

咱們能夠把上面的圖書館的例子修改一下,結果仍是OK的,能夠顯示我許嵩的名字

 

Session細節

不知道發現了一個事情沒,Cookie咱們是能夠接收多個參數的,Session其實也是能夠的。

Session和Cookie的一個區別就是,Cookie都是String類型的參數,而Session的key是String類型的,value是Object類型的。

這樣咱們在設置value值的時候,實際上是能夠傳入一個類類型的,也就是Model,咱們如今寫一個User類,來看看

package main.com.vae.Session;


public class User {
    private String userName;
    private String passWord;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}
package main.com.vae.Session;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/Session/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String name=req.getParameter("userName");
        String passWord=req.getParameter("passWord");

        User user=new User();
        user.setUserName(name);
        user.setPassWord(passWord);
        //使用Session技術
        HttpSession session=req.getSession(); //建立Session
        session.setAttribute("USER_IN_SESSION",user);   //設置Session的值,Session是默認響應給瀏覽器的

        out.println("歡迎你:"+name+"</br>");
        out.println("<a href='/Session/list'>收件箱</a>");


    }
}
package main.com.vae.Session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/Session/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String userName="";
        //獲取Session的值
        HttpSession session=req.getSession();
        User user =(User) session.getAttribute("USER_IN_SESSION");
//        for (Cookie cookie : cookies) {
//            String name=cookie.getName();
//            String value=cookie.getValue();
//
//            if ("userName".equals(name)){
//                userName=value;
//            }
//
//        }

        out.println("歡迎你:"+user.getUserName()+"</br>");
        for (int i = 0; i < 6; i++) {
            out.println("<a href='/Session/get'>一封郵件</a><br>");
        }



    }
}
package main.com.vae.Session;


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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/Session/get")
public class GetServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        //=============上面三行代碼幾乎是固定的
        String userName="";
        HttpSession session=req.getSession();
        User user =(User) session.getAttribute("USER_IN_SESSION");

        out.println("歡迎你:"+user.getUserName()+"</br>");
        out.println("本封郵件的內容是:蜀雲泉,你真帥啊");

    }
}

就是這樣的,再次重啓Tomcat,結果也是OK的

 

Session的刪除

 

 

Session的超時管理

 session.setMaxInactiveInterval(15);

 

Session的URL重寫

當瀏覽器禁用Cookie以後,Cookie和Session都是不能再使用的。因此想要實現數據的共享,咱們只能在跳轉連接加上Session的ID,就是一串數字。可是這樣很蠢,又在瀏覽器上的URL框裏顯示了。因此有一個Response.EncodeURL,使用這個能夠自動的幫助咱們加上Session的ID。可是通常是沒有人關閉Cookie的,關閉了以後會很麻煩。因此通常的作法是監測用戶的瀏覽器是否關閉了Cookie,若是禁用了Cookie那麼就提醒開啓。

相關文章
相關標籤/搜索