1. 获取客户端IP、获取请求方式、获取Agent
String addr=request.getRemoteAddr();
System.out.println("IP:"+addr);
String method=request.getMethod();
System.out.println("method:"+method);
String agent=request.getHeader("User-Agent");
response.setCharacterEncoding("utf-8");
if(agent.toLowerCase().contains("chrome")){
response.getWriter().print("您使用的是谷歌浏览器");
}else if(agent.toLowerCase().contains("firefox")){
response.getWriter().print("您使用的是火狐浏览器");
}else{
response.getWriter().print("我猜您使用的是IE浏览器");
}
2. request的各种get
String scheme=request.getScheme(); // http
String context=request.getContextPath(); // /jsp
String server=request.getServerName(); // localhost
int port=request.getServerPort(); // 8080
response.getWriter().print("scheme:"+scheme+"<br>");
response.getWriter().append("context:"+context+"<br>")
.append("server:"+server+"<br>")
.append("port:"+port+"<br>")
.append("getservletpath:"+request.getServletPath()) // /RBservlet
.append("querystring:"+request.getQueryString()) //请求是http://localhost:8080/jsp/RBservlet?chen=133结果是:chen=133
.append("uri:"+request.getRequestURI()+"<br>") // /jsp/RBservlet
.append("URL:"+request.getRequestURL()); //http://localhost:8080/jsp/RBservlet
3. request的Referer请求头完成防盗链
Referer可以统计访问是从哪里来的
防盗链:如果请求不是通过本站的超链接发出去,发送状态码404
String referer=request.getHeader("Referer");
System.out.println(referer);
if(referer==null){ //如果是直接在浏览器里输入的http://localhost:8080/jsp/RCservlet不会有referer必须通过超链接
response.sendRedirect("http://www.baidu.com");
}else if(referer.contains("localhost")){
response.getWriter().print("hello");
}else {
response.getWriter().print("127.0.0.1");
}
发出请求:http://localhost:8080/jsp/jsp/a.html
结果: 地址栏变成http://localhost:8080/jsp/RCservlet
页面显示hello,控制台输出 http://localhost:8080/jsp/jsp/a.html
发出请求:http://127.0.0.1:8080/jsp/jsp/a.html
结果: 地址栏变成http://127.0.0.1:8080/jsp/RCservlet
发出请求:http://localhost:8080/jsp/RCservlet或者
http://127.0.0.1:8080/jsp/RCservlet
结果:跳转到百度页面
4. request之获取请求参数
请求参数是客户端发送给服务器的
请求参数有可能是在请求体中(POST)、也有可能在URL之后(GET)
String getParameter(String name)
获取指定参数的请求参数值,使用与单值
如String name=request.getParameter(“username”);
String[] getParameterValues(String name) 获取指定名称的参数值,适用于多值
Enumeration getParameterNames() 获取所有请求参数名称
Map<字符串String,字符串数组String[]> getParameterMap()
获取所有请求参数,其中key为参数名,value为参数值
案例:超链接参数
案例:表单数据
RDservlet.java
//1.得到URL携带的参数
String x=request.getParameter("x");
System.out.println("post-x:"+x);
//2.得到表单的参数
String username=request.getParameter("username");
String password=request.getParameter("password");
response.getOutputStream().print("username:"+username+"||password:"+password);
//得到checkbox,jsp里name都是hobby,value随便写,如果选中就会有value的值,不选中就没有
String[] hobby=request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobby));
// 3.得到所有参数的键值
Enumeration<String> hs=request.getParameterNames();
while(hs.hasMoreElements()){
System.out.println(hs.nextElement());
}
// 4.map键值
Map<String,String[]> map=request.getParameterMap();
for(String s:map.keySet()){
String[] value=map.get(s);
System.out.println(s+"="+Arrays.toString(value));
}
}
b.jsp
5.请求和转发
RequestDispatcher rd=request.getRequestDispatcher(“/MyServlet”);
使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的路径
请求转发:rd.forword(request,response)
请求包含:rd.include(request,response)
有时候一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet
一个请求跨多个Servlet,需要使用转发和包含
请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
请求包含:由两个Servlet共同完成响应体(都留)
无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response
5.1 请求转发
Forword.java
System.out.println("AServlet");
response.setHeader("aaa", "AAA");
response.getWriter().print("hello forword"); //这个是输不出来的
request.getRequestDispatcher("/ForwordTwo").forward(request, response);
ForwordTwo.java
response.getWriter().print("forwordTwo");
发送请求:http://localhost:8080/jsp/Forword
结果: 页面显示forwordTwo
所谓留头不留体
5.2请求包含
IncludeA.java
response.setHeader("aa", "df");
response.getWriter().print("IncludeA\n"); request.getRequestDispatcher("/IncludeB").include(request, response);
IncludeB.java
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("IncludeB");
}
发送请求:http://localhost:8080/jsp/IncludeA
结果:IncludeA
IncludeB
所谓留头也留体
5.3 request域
实际上servlet中有三大域 request servlet application
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
同一请求范围内使用同一个servlet调用request.setAttribute()、后一个servlet调用getAttribute()
6. 请求转发和重定向的区别
重定向是response对象
重定向发生了两次请求两此响应,浏览器地址会改变
重定向不止重定向到本项目其他资源,还能定向到其他项目,比如百度
重定向要给出requestURI,即包含项目名
转发是request对象
转发发生了一次请求一次响应,浏览器地址不改变
请求转发只能转发到本项目中其他
请求转发是服务器行为,只需要给出转发的servlet路径
请求转发的效率高。