JavaWeb學習筆記(三)
1.HttpServletResponse
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
-
從請求中拿到Cookie資訊
-
伺服器響應給客戶端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>