關於request的細節使用,解決中文亂碼問題
阿新 • • 發佈:2019-02-11
----關於防盜鏈---
Referer
String ref=request.getHeader("Referer");
//判斷請求頭中的referer是否為空或者沒東西或者不來自163網站,那麼就是盜鏈行為,直接重定向到原網頁
if(ref==null||"".equals(ref)||!ref.startsWith("http://www.163.com"));
response.sendRedirect(request.getContextPath()+"index.jsp");
--------獲取客戶機的資訊
getRequestURL方法返回客戶端發出請求完整URL
!!getRequestURI方法返回請求行中的資源名部分
getQueryString 方法返回請求行中的引數部分
!!getRemoteAddr方法返回發出請求的客戶機的IP地址
!!getMethod得到客戶機請求方式
!!getContextPath 獲得當前web應用虛擬目錄名稱
-----遍歷jsp頁面的所以請求引數
Enumeration<String> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements)
{
String name=enumeration.nextElement();
String values=request.getParameter(name);
System.out.println(name+":"+value);
}
[中文亂碼問題]
---------獲取請求引數
//在JSP頁面上模擬響應頭,設定字元編碼為UTF-8
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
亂碼問題:
利用request獲取的請求引數,是根據開啟jsp頁面的瀏覽器用的什麼編碼讀取,那麼
就用什麼編碼傳輸,模擬響應頭的話相當於固定設定瀏覽器的讀取編碼格式
但是在伺服器上,預設解析編碼的是用的ISO8859-1,
這樣就會導致解析中文位元組出現亂碼。
//通過設定伺服器的解析編碼方式為UTF-8,這樣就可以避免亂碼了
(這只是適用在post請求,因為post請求的請求引數在實體內容當中;get請求不在實體內容當中,在URL後面)
request.setCharacterEncoding("UTF-8");
對於get請求方式,出現亂碼的話,只能手動解決
假設前端獲取的 usename是亂碼 ,
username =new String (username.getBytes("iso8859-1"),"utf-8");
先把從伺服器上錯誤解析的亂碼username通過iso8859-1的方式重新解析回去;
在利用utf-8的編碼格式去重新解析它。這樣就可以達到手動解析,解決亂碼了。
response.getWriter().write("中文");
這種情況輸出會有亂碼的話,就需要設定
①response.setContentType("text/html;charset=utf-8");
但是這種情況務必把①放在write內容前面!!!!!
以下這種使用OutputStreamwrite輸出,設定放在前後都可以
response.getOutputStream().write("中文國歌".getBytes("utf-8"));
response.setContentType("text/html;charset=utf-8");
----------request的請求轉發
this.getServletContext().getRequestDispatcher("/RequestTest2").forward(request, response);
request.getRequestDispatcher("/RequestTest2").forward(request, response);
--------request的請求包含
request.getRequestDispatcher("/RequestTest2").include(request, response);
請求轉發的話,當前的servlet的輸出資訊是隻能進入伺服器的緩衝區,但是一旦執行轉發
時,就會清除掉實體內容,請求頭資訊不會清除,但是這樣當前的servlet的資訊就輸出不了
;而使用請求包含的話就可以順帶輸出當前servlet的東西。
Referer
String ref=request.getHeader("Referer");
//判斷請求頭中的referer是否為空或者沒東西或者不來自163網站,那麼就是盜鏈行為,直接重定向到原網頁
if(ref==null||"".equals(ref)||!ref.startsWith("http://www.163.com"));
response.sendRedirect(request.getContextPath()+"index.jsp");
--------獲取客戶機的資訊
getRequestURL方法返回客戶端發出請求完整URL
!!getRequestURI方法返回請求行中的資源名部分
getQueryString 方法返回請求行中的引數部分
!!getRemoteAddr方法返回發出請求的客戶機的IP地址
!!getMethod得到客戶機請求方式
!!getContextPath 獲得當前web應用虛擬目錄名稱
-----遍歷jsp頁面的所以請求引數
Enumeration<String> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements)
{
String name=enumeration.nextElement();
String values=request.getParameter(name);
System.out.println(name+":"+value);
}
[中文亂碼問題]
---------獲取請求引數
//在JSP頁面上模擬響應頭,設定字元編碼為UTF-8
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
亂碼問題:
利用request獲取的請求引數,是根據開啟jsp頁面的瀏覽器用的什麼編碼讀取,那麼
就用什麼編碼傳輸,模擬響應頭的話相當於固定設定瀏覽器的讀取編碼格式
但是在伺服器上,預設解析編碼的是用的ISO8859-1,
這樣就會導致解析中文位元組出現亂碼。
//通過設定伺服器的解析編碼方式為UTF-8,這樣就可以避免亂碼了
(這只是適用在post請求,因為post請求的請求引數在實體內容當中;get請求不在實體內容當中,在URL後面)
request.setCharacterEncoding("UTF-8");
對於get請求方式,出現亂碼的話,只能手動解決
假設前端獲取的 usename是亂碼 ,
username =new String (username.getBytes("iso8859-1"),"utf-8");
先把從伺服器上錯誤解析的亂碼username通過iso8859-1的方式重新解析回去;
在利用utf-8的編碼格式去重新解析它。這樣就可以達到手動解析,解決亂碼了。
response.getWriter().write("中文");
這種情況輸出會有亂碼的話,就需要設定
①response.setContentType("text/html;charset=utf-8");
但是這種情況務必把①放在write內容前面!!!!!
以下這種使用OutputStreamwrite輸出,設定放在前後都可以
response.getOutputStream().write("中文國歌".getBytes("utf-8"));
response.setContentType("text/html;charset=utf-8");
----------request的請求轉發
this.getServletContext().getRequestDispatcher("/RequestTest2").forward(request, response);
request.getRequestDispatcher("/RequestTest2").forward(request, response);
--------request的請求包含
request.getRequestDispatcher("/RequestTest2").include(request, response);
請求轉發的話,當前的servlet的輸出資訊是隻能進入伺服器的緩衝區,但是一旦執行轉發
時,就會清除掉實體內容,請求頭資訊不會清除,但是這樣當前的servlet的資訊就輸出不了
;而使用請求包含的話就可以順帶輸出當前servlet的東西。