目錄
1. Servlet請求處理
2. Servlet中文亂碼問題
3. request/response對象的使用
4. Cookie的應用
5. 過濾器
1. Servlet請求處理
表單送出中get和post方式的差別有幾點
- get是從伺服器上擷取資料,post是向伺服器傳送資料。
- get是把參數資料隊列加到送出表單的ACTION屬性所指的URL中,值和表單内各個字段一一對應,在URL中可以看到。post是通過HTTPpost機制,将表單内各個字段與其内容放置在HTML HEADER内一起傳送到ACTION屬性所指的URL位址。使用者看不到這個過程。
- get傳送的資料量較小,不能大于2KB。post傳送的資料量較大,一般被預設為不受限制。
- get安全性非常低,post安全性較高。
那麼在servlet中,是如何處理這些請求的呢?
表單以POST方式送出, servlet調用doPost()處理,
doPost()方法有兩個參數:HttpServletRequest對象封裝請求中資料(HTTP頭部)及用戶端資訊,HttpServletResponse 用戶端響應
表單以GET方式送出,即GET請求;處理方式方法和doPost完全相同,一個servlet可同時處理POST,GET請求。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("處理GET方法");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
2. Servlet中文亂碼問題
亂碼情況:
- 用戶端送出資料到servlet中文出現亂碼
- 響應至用戶端包含中文出現亂碼
解決方法:
Get送出:
軟編碼轉換 new String(suser.getBytes("ISO-8859-1"),"GBK|UTF-8")
批量解決:Tomcat/conf/server.xml設定URIEncoding="GBK|UTF-8"
Post送出
對擷取到的資料轉編碼:new String (suser.getBytes("ISO-8859-1"),"GBK");
擷取資料前設定request編碼: request.setCharacterEncoding("GBK|UTF-8");
下面舉個列子:在WebContent中建立一個html頁面,寫一個表單用于傳送表單資料。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<form action="./IndexServlet" method="post">
<input type="text" placeholder="請輸入賬号...." name="username">
<input type="text" placeholder="請輸入性别" name="gender">
<input type="password" placeholder="請輸入密碼...." name="password">
<input type="submit" value="登入">
</form>
</body>
</html>
Servlet中修改上一節的代碼:
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* index
* @author CHTW
*
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String gender = request.getParameter("gender");
String passsword = request.getParameter("passsword");
System.out.println(username);
System.out.println("gender:"+gender);
System.out.println("password:"+password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
啟動伺服器:
點選登入後檢視控制台:
出現了中文亂碼的情況
修改IndexServlet:
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* index
* @author CHTW
*
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String gender = request.getParameter("gender");
String password = request.getParameter("password");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
gender = new String(gender.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username:"+username);
System.out.println("gender:"+gender);
System.out.println("password:"+password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
get方法處理方式和這種方法相似,上面也已經說過了。
響應至用戶端包含中文時亂碼:
- response.setCharacterEncoding("GBK");
- response.setContentType("text/html; charset=GBK");
3. request/response對象的使用
request 根據單詞意思也可以猜到,用于接收用戶端浏覽器送出的資料 。常用方法如下:
getScheme() //擷取協定名
getServerName() //擷取ip或機器名或域名
getServerPort() //擷取端口号
getContextPath() //擷取上文路徑名[工程名]
getSession() //擷取通信會話HttpSession對象
getQueryString() //擷取請求字元串
request.getRequestURI()//獲得工程名/servlet路徑
getRemoteHost() //擷取用戶端主機
getRemoteAddr() //擷取用戶端IP
getRequestDispatcher() //擷取請求轉發對象
getCookies() //擷取用戶端發送來的Cookie對象數組
getServletPath() //擷取Servlet對應的路徑
setCharacterEncoding(arg0) //設定request對象的資料字元集
response 對象的功能則是将伺服器端的資料發送到用戶端浏覽器。常用方法如下:
setContentType(arg0) //設定JSP頁面的顯示方式,如'text/html','text/html; charset=gb2312’'等
setCharacterEncoding(arg0) //設定頁面的編碼方式:比如gb2312, gbk, big5, 還有UTF-8等
addCookie(Cookie) //往用戶端添加一個Cookie
sendRedirect(String) //重定向請求
response.setHeader(name,contect); //設定html頭head
4. Cookie的應用
Cookie是伺服器端或javascript用于維護用戶端的一種方式;Cookie是駐留在用戶端的一個文本檔案;
作用:在用戶端儲存使用者相關的簡單資訊,通路某些網站時登入界面設定儲存使用者名複選框,下次通路登入頁面自動把之前輸入使用者名顯示在界面,自動儲存使用者名,如果浏覽器清除了緩存,則cookie檔案就删除了。
Cookie類相關方法:
- set/getName()
- set/getValue()
- set/getMaxAge() 失效時間 機關秒
- set/getPath() 适用的路徑
- set/getDomain() 适用的域名
5. 過濾器
過濾器是一個程式,它先于與之相關的servlet或JSP頁面運作在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求資訊。在這之後,過濾器可以作如下的選擇:
①以正常的方式調用資源。
②利用修改過的請求資訊調用資源。
③調用資源,但在發送響應到客戶機前對其進行修改。
④阻止該資源調用,代之以轉到其他的資源,傳回一個特定的狀态代碼或生成替換輸出。
所有的Servlet過濾器類都必須實作javax.servlet.Filter接口。這個接口含有3個過濾器類必須實作的方法:
init(): 初始化方法,性質等同與servlet的init方法。
doFilter():完成實際的過濾操作,當請求通路過濾器關聯的URL時,Servlet容器将先調用過濾器的doFilter方法。FilterChain參數用于通路後續過濾器
destroy():Servlet容器在銷毀過濾器執行個體前調用該方法,這個方法中可以釋放Servlet過濾器占用的資源。性質等同與servlet的destory()方法。
建立一個filter,來統一處理亂碼問題:
package com.chtw.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/IndexFilter")
public class IndexFilter implements Filter {
public IndexFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//該過濾器主要防止亂碼
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("textml;charset=utf-8");
//過濾鍊過濾下一條
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
web.xml中添加配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>java_servlet_test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.chtw.servlet.IndexServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>張山</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
<filter>
<filter-name>IndexFilter</filter-name>
<filter-class>com.chtw.filter.IndexFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IndexFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
IndexServlet中将處理亂碼的代碼注釋掉,然後啟動伺服器:
本人聯系方式2329095893,歡迎各位進行學習讨論
歡迎關注熊熊出沒ING公衆号,不定時跟新Java、python、資訊安全等相關知識哦。