HttpServletRequest對象代表客戶端的請求
通過Request對象進行的常用操作
- 獲取客戶機信息
- 獲取請求頭信息
- 獲取請求參數(shù)
- 利用請求域傳遞對象(request域?qū)ο螅?/li>
- 重定向和轉(zhuǎn)發(fā)的區(qū)別
獲取客戶機信息
獲取請求頭信息
- referer 網(wǎng)頁來源
- user-agent 瀏覽器類型
- MSIE IE瀏覽器
- Firefox 火狐瀏覽器
- Chrome google瀏覽器
/**
* 獲取客戶機的內(nèi)容 和請求頭內(nèi)容
* @author limaoquan
*
*/
public class RequestServlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取IP
String ip = request.getRemoteAddr();
String method = request.getMethod();
String path = request.getContextPath();
System.out.println("IP地址" + ip);
System.out.println("虛擬路徑是 "+ path);
System.out.println("請求方式"+ method);
//獲取請求頭
String referer=request.getHeader("referer");//網(wǎng)頁來源(防盜鏈)
String agent = request.getHeader("user-agent");//判斷瀏覽器(文件下載)
//遍歷所有請求頭
Enumeration<String> names = request.getHeaderNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name + ":" + request.getHeader(name));
}
System.out.println("------------");
System.out.println("您使用瀏覽器:"+ request.getHeader("user-agent"));
//判斷referer是否存在和有效
if(referer!=null&&referer.startsWith("http://localhost/day")){
//不屬于盜鏈
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("機密信息");
}else{
//盜鏈
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("您的請求盜鏈");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
獲取請求參數(shù)(重要)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day10/reg" method="post">
<table border="1" width="50%">
<tr>
<td>輸入姓名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>輸入密碼</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>選擇性別</td>
<td>
<input type="radio" name="sex" value="man"/>男
<input type="radio" name="sex" value="woman"/>女
</td>
</tr>
<tr>
<td>選擇愛好</td>
<td>
<input type="checkbox" name="love" value="lq"/>籃球
<input type="checkbox" name="love" value="zq"/>足球
<input type="checkbox" name="love" value="pq"/>排球
</td>
</tr>
<tr>
<td>選擇城市</td>
<td>
<select name="city">
<option value="none">--請選擇--</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="sz">深圳</option>
</select>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
public class RegServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* request獲取中文的亂碼
* post請求
* setCharacterEncoding(String env) 設置request緩沖區(qū)編碼
*
* get請求
*
*/
//設置request緩沖區(qū)編碼
request.setCharacterEncoding("UTF-8");
//獲取內(nèi)容股淡,做其他操作
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
//獲取愛好伸但,有過個值
String[] loves = request.getParameterValues("love");
String city = request.getParameter("city");
System.out.println("用戶名:" + username);
System.out.println("密碼:" + password);
System.out.println("性別:" + sex);
System.out.println("愛好:" + Arrays.toString(loves));
System.out.println("城市:" + city);
System.out.println("==========================");
//獲取map集合
Map<String,String[]> map = request.getParameterMap();
//循環(huán)遍歷
Set<String> keys = map.keySet();
for(String key:keys){
String[] values = map.get(key);
System.out.println(Arrays.toString(values));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
亂碼問題解決
- POST請求亂碼 :
request.setCharacterEncoding("utf-8"); - GET請求亂碼
解決方案一:修改server.xml (盡力不要用方案一)
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
必須有修改tomcat服務器配置文件權(quán)限解決方案二:逆向編解碼(推薦用)
username = URLEncoder.encode(username, "ISO8859-1");
username = URLDecoder.decode(username, "utf-8");
簡化
username = new String(username.getBytes("ISO8859-1"),"utf-8");
重定向和轉(zhuǎn)發(fā)
域?qū)ο?ServletContext 與 request 的區(qū)別:
- ServletContext: 服務器啟動,為每個web應用只創(chuàng)建一個ServletContext對象,所有應用共享
- request 只有一次請求的范圍
兩者方法相似:
- setAttribute();
- getAttribute();
- removeAttribute();
public class RequestServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//request域設置內(nèi)容
request.setAttribute("name", "Mango");
//轉(zhuǎn)發(fā)(路徑服務器端的絕對路徑) 轉(zhuǎn)發(fā)可以共享request域
request.getRequestDispatcher("/request3").forward(request, response);
//完成重定向(客戶端路徑) 重定向無法共享request域
//response.sendRedirect("/day10/request3");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class RequestServlet3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取
String value = (String)request.getAttribute("name");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("訪問到 了 3 " + value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
轉(zhuǎn)發(fā)
RequestDispatcher rd = request.getRequestDispatcher("/request3");
rd.forward(request, response);