1. 程式人生 > 其它 >2021-2022-1 20211307 《資訊保安專業導論》第二週學習總結

2021-2022-1 20211307 《資訊保安專業導論》第二週學習總結

HttpServletResponse

1、簡介

web伺服器接收到客戶端的http請求請求,會針對這個請求,分別建立一個代表請求的HttpServletRequest物件,代表響應的HttpServletResponse物件

  • 如果要獲取客戶端的請求引數:找HttpServletRequest
  • 如果要給客戶端一些相響應的資訊:找HttpServletResponse

2、成員簡單分類

  1. 負責向瀏覽器傳送資料的方法

    檔案流:

    ServletOutputStream getOutputStream() throws IOException;
    

    中文:

    PrintWriter getWriter() throws IOException;
    
  2. 負責向瀏覽器傳送響應頭的方法

    void setCharacterEncoding(String var1);
    
    void setContentLength(int var1);
    
    void setContentLengthLong(long var1);
    
    void setContentType(String var1);
    
    void setDateHeader(String var1, long var2);
    
    void addDateHeader(String var1, long var2);
    
    void setHeader(String var1, String var2);
    
    void addHeader(String var1, String var2);
    
    void setIntHeader(String var1, int var2);
    
    void addIntHeader(String var1, int var2);
    
  3. 響應的狀態碼

    int SC_OK = 200;//狀態ok
    int SC_NOT_FOUND = 404;//頁面找不到
    int SC_INTERNAL_SERVER_ERROR = 500;//伺服器端錯誤
    int SC_BAD_GATEWAY = 502;//網關出錯
    

3、常見應用

  1. 向瀏覽器輸出一些資訊

  2. 下載檔案

    • 要獲取下載的路徑

    • 下載的檔名是什麼

    • 設定瀏覽器能夠支援下載我們需要的東西

    • 獲取下載檔案的輸入流

    • 建立緩衝區(buffer)

    • 獲取OutPutStream物件

    • 將FileOutPutStream流寫入緩衝區(buffer)

    • 使用OutPutStream將緩衝區的資料輸出到客戶端

      程式碼實現

      public class FileServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //1、要獲取下載的路徑
              String realPath = "D:\\Intellij IDEA_workspace\\webapp\\response\\src\\main\\resources\\image.jpg";
              System.out.println("下載檔案路徑:"+realPath);
              //2、下載的檔名是什麼
              String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
              //3、設定瀏覽器能夠支援(Content-Disposition)下載我們需要的東西
              // URLEncoder.encode(fileName,"utf-8")為了解決中文檔名亂碼問題
              resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
              //4、獲取下載檔案的輸入流
              FileInputStream fileInputStream = new FileInputStream(realPath);
              //5、建立緩衝區(buffer)
              int len = 0;
              byte[] buffer = new byte[1024];
              //6、獲取OutPutStream物件
              ServletOutputStream out = resp.getOutputStream();
              //7、將fileInputStream流寫入緩衝區(buffer),使用OutPutStream將緩衝區的資料輸出到客戶端
              while((len = fileInputStream.read(buffer))!=0){
                  out.write(buffer,0,len);
              }
              fileInputStream.close();
              out.close();
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
  3. 驗證碼功能

    1. 驗證碼怎麼來的

      • 前端實現(JS)

      • 後端實現(需要用到Java的圖片類,產生一個圖片響應到前端)

        java實現程式碼

        public class ImageServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //讓瀏覽器3秒重新整理一次
                resp.setHeader("refresh","3");
                //在記憶體中建立一個圖片
                BufferedImage image = new BufferedImage(100,40,BufferedImage.TYPE_INT_RGB);
                //得到圖片
                Graphics2D g = (Graphics2D)image.getGraphics();
                //設定圖片的背景顏色
                g.setColor(Color.white);
                g.fillRect(0,0,100,40);
                //給圖片寫資料
                g.setColor(Color.RED);
                g.setFont(new Font(null,Font.BOLD,30));
                g.drawString(makeNum(),0,30);
                //告訴瀏覽器這個請求用圖片的方式開啟
                resp.setContentType("image/jpeg");
                //網站存在快取,不讓瀏覽器快取
                resp.setDateHeader("expires",-1);
                //resp.setHeader("Cache-Control","no-cache");不讓瀏覽器快取的拓展方法
                //resp.setHeader("Pragma","no-cache");不讓瀏覽器快取的拓展方法
                //把圖片寫給瀏覽器
                ImageIO.write(image,"jpg",resp.getOutputStream());
            }
            //生成隨機數
            private String makeNum(){
                Random random = new Random();
                String num = random.nextInt(999999)+"";
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < 6-num.length(); i++) {
                    sb.append("0");
                }
                num = sb.toString()+num;
                return num;
            }
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doGet(req, resp);
            }
        }
        
  4. 實現重定向

    1. 定義

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

    2. 常見場景

      • 使用者登入
    3. 測試

      public class RedirectServlet extends HttpServlet {
          /**
           * 重定向
           * */
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              /*
              拆分
              resp.setHeader("Location","/s4/img");路徑
              resp.setStatus(302);狀態碼
              */
              resp.sendRedirect("/s4/img");
          }
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req, resp);
          }
      }
      
    4. 重定向與轉發的區別

      • 相同點

        頁面都會實現跳轉

      • 不同點

        請求轉發時url位址列不會產生變化,重定向時url位址列會發生變化

    5. 登入測試

      index.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <body>
      <%--這裡的路徑需要尋找到專案的路徑--%>
      <%--${pageContext.request.contextPath}代表當前的專案--%>
      <%--${pageContext.request.contextPath}/login把請求傳送到RequestTest進行處理--%>    
      <form action="${pageContext.request.contextPath}/login" method="get">
          使用者:<input type="text" name="username"></br>
          密碼:<input type="password" name="password"></br>
          <input type="submit" name="submit">
      </form>
      </body>
      </html>
      

      java

      public class RequestTest extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //處理請求
              String username = req.getParameter("username");
              String password = req.getParameter("password");
              System.out.println(username+":"+password);
              //重定向一定要注意路徑問題否則就會404
              resp.sendRedirect("/s4/successfully.jsp");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      

      successfully.jsp(重定向頁面)

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>success</title>
      </head>
      <body>
      <h2 style="color: aquamarine">successfully</h2>
      </body>
      </html>
      

      xml

      <servlet>
              <servlet-name>requesttest</servlet-name>
              <servlet-class>com.zhang.servlet.RequestTest</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>requesttest</servlet-name>
              <url-pattern>/login</url-pattern>
          </servlet-mapping>