1. 程式人生 > 其它 >JavaWeb學習筆記(三)

JavaWeb學習筆記(三)

JavaWeb學習第三天

1.HttpServletResponse

1.1實現重定向

B一個web資源收到客戶端A請求後,B他會通知A客戶端去訪問另外一個web資源C,這個過程叫做重定向

  • 常用場景

    • 使用者登入

void sendRedirect(String var1) throws IOException;

測試:

public class RedirectServlet extends HttpServlet  {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 實現原理
            resp.setHeader("location","/ig");
             resp.setStatus(302);
         */
        resp.sendRedirect("/ig");//重定向
    }
}

面試題:請你聊聊重定向和轉發的區別

相同點:

  • 頁面都會出現跳轉

不同點:

  • 請求轉發的時候,url不會發生變換,307

  • 重定向URL會發生變換。302

public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("進入login請求");
    req.getParameter("userName");
    req.getParameter("password");
    resp.sendRedirect("/66.jsp");
}
}
  • 當登入後,重定向跳轉到66.jsp頁面

2.HttpServletRequest

HttpServletRequest代表客戶端的請求,使用者通過http協議訪問伺服器,http請求中的所有資訊會被封裝到HttpServletRequest,通過這個方法,獲得客戶端所有資訊。

1.獲取前端引數

public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    String userName = req.getParameter("userName");
    String password = req.getParameter("password");
    String[] hobbys = req.getParameterValues("hobbys");
​
    System.out.println(userName);
    System.out.println(password);
    System.out.println(Arrays.toString(hobbys));
//        resp.sendRedirect("/666.jsp");
    //通過請求轉發
  req.getRequestDispatcher(req.getContextPath()+"/666.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req,resp);
}
}
​
  • 以上通過getParameter方法獲取前端傳遞來的資料。

  • 然後請求轉發到登入成功頁面。

3.Cookie、session

3.1、會話

會話:使用者開啟瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話。

一個網站怎麼證明你來過?

  • 服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以;cookie

  • 伺服器登記你來過,下次你來的時候我匹配你;session

3.2、儲存會話的兩種技術

cookie

  • 客戶端技術(響應,請求)

session

  • 伺服器技術,利用這個技術可以儲存使用者的會話資訊,我們可以把資訊或者資料放在session中

常見例項:網站登入之後,你下次不用登入,可以直接登入。

3.3、Cookie


  1. 從請求中拿到Cookie資訊

  2. 伺服器響應給客戶端cookie

public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setCharacterEncoding("utf-8");
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    //Cookie
    Cookie[] cookies = req.getCookies();
    if (cookies!=null){
        out.write("你上次訪問時間是:");
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            //獲取名字
            if (cookie.getName().equals("Time")){
                //獲取Cookie中的值
                long Time = Long.parseLong(cookie.getValue());
                Date date= new Date(Time);
                out.write(date.toLocaleString());
            }
        }
    }else {
        out.write("這是你第一次訪問");
    }
    //伺服器給客戶端響應一個Cookie
    Cookie cookie = new Cookie("Time",System.currentTimeMillis()+"");
    cookie.setMaxAge(24*60*60);
    resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}
}
Cookie[] cookies = req.getCookies();//建立一個Cookie
cookie.getName()//獲取cookie中的key
cookie.getValue()//獲取cookie中的value
cookie.setMaxAge(24*60*60);//設定cookie的有效期
resp.addCookie(cookie);//響應給客戶端一個cookie

一個網站的cookie是否有上限

  • 一個cookie只能儲存一個資訊

  • 一個web站點可以給瀏覽器傳送多個cookie,最多存放20個。

  • cookie大小由限制4KB

  • 瀏覽器上限300個cookie

刪除Cookie

  • 不設定有效期,關閉瀏覽器會自動消失

  • 將有效日期為0。

3.4、Session(重點)

什麼是Session:

  • 伺服器會給每一個使用者(瀏覽器)建立一個Session物件;

  • 一個Session獨佔一個瀏覽器,只要瀏覽器沒關閉,這個Session就存在。

  • 使用者登入之後,整個網站都可以訪問

Cookie和Session的區別:

  • Cookies是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存。

  • Session把使用者的資料寫到使用者獨佔的Session中,伺服器儲存,(儲存重要的資訊,減少資源浪費)

  • Session由伺服器建立

使用場景:

  • 儲存一個登入使用者的資訊

  • 購物車資訊;

  • 在整個網站中經常會使用的資料,我們會儲存在Session中

session的使用

import pojo.student;
​
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
public class SeesionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //解決亂碼問題
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //得到Session
    HttpSession session = req.getSession();
    //給Session中存放東西
    session.setAttribute("name",new student("qwe",16));
    //獲取ID
    String id = session.getId();
    //判斷session是不是新建立的
    if (session.isNew()){
        resp.getWriter().write("sesstion建立成功,id:"+id);
    }else{
        resp.getWriter().write("session已經存在,id:"+id);
    }
}
}
​
​
//得到Session
HttpSession session = req.getSession();
    student name = (student) session.getAttribute("name");
    resp.getWriter().print(name.toString());

登出Session

HttpSession session = req.getSession();
session.removeAttribute("name");//消除name
session.invalidate();//登出session

自動過期:在web.xml中配置

<session-config>
    <session-timeout>2</session-timeout>
</session-config>