目錄
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、信息安全等相關知識哦。