1. 程式人生 > >HttpServletRequest、通過request獲得請求頭、請求體等、解決中文亂碼等問題

HttpServletRequest、通過request獲得請求頭、請求體等、解決中文亂碼等問題

1、HttpServletRequest概述:

我們在建立Servlet時,會重寫service()方法、doGet()\、doPost()方法,這些方法都有兩個引數request(請求)和response(響應),service中的request是ServletRequset,而

doGet()和doPost()方法中的是:HttpServletRequest,HttpServletRequest是ServletRequest的子介面。

 2、request的執行流程:

 

3、通過request獲得請求行

(1)獲得客戶端的請求方式:

String method=request。getMethod()

(2)獲得請求資源:

String URI=request。getRequestURI();

String  URL=request.getRequestURL();

(3)獲得WEB應用的名稱

String   webname=request.getContextPath();

(4)get提交url地址後的引數字串

String queryString=request.getQueryString(); 

(5)獲得訪問的客戶端IP地址

String ip=request.getRemoteAddr();

4.通過request獲得請求頭

(1)獲取請求頭
String agent=request.getHeader("User-Agent");

(2)

獲取所有請求頭名稱
Enumeration<String> headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
//獲取每個請求頭名稱
String headerName=headerNames.nextElement();
//跟距請求頭獲取請求值
String value=request.getHeader(headerName);
System.out.println(headerName);
System.out.println(value);

referer頭的作用:執行該此訪問的的來源

做防盜鏈跳轉

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ReferServlet extends HttpServlet {
//防盜鏈
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取請求頭中的referer
        String referer=request.getHeader("referer");
        //不是以"http://localhosr:8080"開頭的不能訪問
        if(referer!=null&&referer.startsWith("http://localhosr:8080")){
            //認為可以正常訪問
            //結覺中文亂碼
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("啊啊啊啊啊啊啊啊");
        }else{
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("不不不不不不不不不不不不不不不不不不不不不不不不");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

5.通過request獲得請求體解決中文亂碼等問題

獲取表單元素的值:String username=request.getParameter("username");

獲取表單所有元素的值:Map<String,String[]> map=request.getParameterMap();

package servlet;

import java.io.IOException;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BodyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post方式解決中文亂碼
        request.setCharacterEncoding("utf-8");
        //獲取表單元素的值、
        //get方式結覺中文亂碼問題
        String username=request.getParameter("username");
        //username=new String
                //(username.getBytes("iso8859-1"),"utf-8");
        
        String password=request.getParameter("password");
        System.out.println(username+"..."+password);
        //獲取表單所有元素的值
        Map<String,String[]> map=request.getParameterMap();
        Set<String> set=map.keySet();
        for(String  s:set){
            String key=s;
            String[] value=map.get(s);
            //遍歷陣列
            for(String s1:value){
                System.out.println(s+":"+s1);
            }
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

6、request是一個域物件

request物件也是一個儲存資料的區域物件,所以也具有如下方法:

setAttribute(xxxx, xxxxxxxxxxx)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用範圍:一次請求中

 

7、request完成請求轉發

獲得請求轉發器----path是轉發的地址

RequestDispatcher getRequestDispatcher(String path)

通過轉發器物件轉發

requestDispathcer.forward(ServletRequest request, ServletResponse response)

 轉發:

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向request中內放值
        request.setAttribute("name","小紅帽");
        //請求轉發
        request.getRequestDispatcher("/Servlet02").forward(request, response);
        response.getWriter().write("servlet01");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

 

 

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name=(String) request.getAttribute("name");
        //解決中文亂碼
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("servlet02"+name);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}