/*
*request-->封装了客户端所有的请求数据
*请求行
*请求头
*空行
*请求体(GET没体)
* http协议:请求协议中的数据都可以通过request对象来获取
* 获取常用信息
* 获取客户端IP 封IP request.getRemoteAddr()
* 请求方法 request.getMethod() 可能是POST也可能是GET
* 获取Http请求头 与http相关
* ***String getHeader(String name) 适用于单值头
* Int GetIntHeader(String name) 适用于单值Int类型的请求头
* long getDateHeader(String name) 适用于单值毫秒类型的请求头
* Enumeration<String> getHeaders(String name) 适用于多值请求头
*
* 案例
* 通过User-Agent识别用户浏览器类型
* 防盗链 如果请求不是通过本站的超链接发出的发送错误状态码404 如果请求不是通过本站的超链接发出的
*发送错误状态码404 Referer这个请求头 表示请求的来源
* 获取请求URL
* http://localhost:8080/day04_02/AServlet?username=xxx&password=y
* String getSchema() 获取协议 http
* String getServerName() 获取服务器名 localhost
* String getServerPort() 获取服务器端口 8080
* String getContextPath() 获取项目名 /day04_02
* String getServletPath() 获取Servlet路径 /AServlet
* String getQueryString() 获取参数部分即问号后面的部分 username=xxx&password=y
* String getRequestURI() 获取请求uri 等于项目名+Servlet路径 /day04_02/AServlet
* String getRequestURL() 获取请求URL 等于不包含参数的整个请求路径 http://localhost:8080/day04_02/AServlet
* getRequestURL()+"?"+getQueryString() 完整路径
*获取请求参数 请求参数是由客户端发送给服务器的 有可能是在请求体中(POST) 也可能是URL之后(GET)
* 请求参数 有一个参数一个值的 还有一个参数多个值
* String getParameter(String name) 获取指定名称的请求参数值 适用于单值请求参数
* String getParameterValues(String name)获取指定名称的请求参数值 适用于多值请求参数
* Enumeration<String> getParameterNames() 获取所有请求参数名称
* Map<String,String[]> getParameterMap() 获取所有请求参数 其中key为参数名 value为参数值
* 请求转发和请求包含
* RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
* 使用request获取RequestDispatcher对象 方法的参数是被转发或包含的Servlet的Servlet路径
* 请求转发 ** rd.forward(request.response);
* 请求包含 rd.include(request.response);
*有时一个请求需要多个Servlet协作才能完成 所以需要在一个Servlet中跳到另一个Servlet
* 一个请求跨多个Servlet 需要使用转发和包含
* 请求转发 由下一个Servlet完成响应体 当前Servlet可以设置响应头(留头不留体)[自己完成不了让其他人协作完成]
* 请求包含 由两个Servlet共同来完成响应体(都留)
* 无论是请求转发还是请求包含 都在一个请求范围内 使用同一个request和response
*request域
* servlet中三大域对象 request、session、application都有如下三种方法
* void setAttribute(String name,Object value)
* Object getAttribute(String name)
* 同一请求范围内使用request.setAttribute() request.getAttribute()来传值 前一个Servlet调用setAttribute()保存值后一个调用getAttribute
*
* 请求转发和重定向的区别
* 请求转发是一个请求一次响应 而重定向是两次请求两次响应
* 请求转发地址栏不变化 而重定向会显示后一个请求的地址
* 请求转发只能转发到本项目其他Servlet 而重定向 不只能重定向到本项目的其他Servlet 还能定向到其他项目
* 请求转发是服务器端行为 只需给出转发的Servlet路径 而重定向需要给出requestURI 即包含项目名
*
* 请求转发和重定向 效率是转发高 因为是一个请求
* 需要地址栏发生变化必须用重定向
* 需要在下一个Servlet中获取request域中的数据 必须要用转发
*/
/*
* 通过request来获取url的相关方法
*/
response.getWriter().println(request.getScheme()+"<br/>");//获取请求协议
response.getWriter().println(request.getServerName()+"<br/>");//获取服务器名称
response.getWriter().println(request.getServerPort()+"<br/>");//获取服务器端口号
response.getWriter().println(request.getContextPath()+"<br/>");//获取项目名称 最常用因为移动后的项目名不一定
response.getWriter().println(request.getServletPath()+"<br/>");//获取servlet路径
response.getWriter().println(request.getQueryString()+"<br/>");//获取参数部分
response.getWriter().println(request.getRequestURI()+"<br/>");//获取请求URI
response.getWriter().println(request.getRequestURL()+"<br/>");//获取请求URL
/*
* 获取客户端的ip地址 获取请求方式 获取User-Agent 得到客户端的信息(操作系统 浏览器)
*/
String addr = request.getRemoteAddr();//获取客户端的IP地址
System.out.println("IP "+addr);
System.out.println("请求方式"+request.getMethod());//获取请求方式
String userAgent = request.getHeader("User-Agent");//获取名为User-Agent的请求头
System.out.println(userAgent);
//是否包含Chrome 如果包含 说明用户使用的是google浏览器
if(userAgent.toLowerCase().contains("chrome")) {
System.out.println("好"+addr+"用了谷歌");
}else if(userAgent.toLowerCase().contains("firefox")) {
System.out.println("好"+addr+"用了火狐");
}else if(userAgent.toLowerCase().contains("msie")) {//微软的ie
System.out.println("好"+addr+"用了ie");
}
/*
*使用Referer请求头 防盗链
*/
String referer = request.getHeader("Referer");
System.out.println(referer);
if(referer==null || !referer.contains("localhost")) {
response.sendRedirect("http://www.baidu.com");
}else if(referer.contains("localhost")) {
System.out.println("hello");
}
a.html
<h1>测试请求参数</h1>
<a href="/day04_02/DServlet?x=xxx&y=YYY">abc</a>
<hr/>
<form action="/day04_02/DServlet" method="post">
用户名 <input type="text" name="username"/>
密码<input type ="password" name ="password"/>
爱好<input type="checkbox" name = "ho" value="cf"/>吃饭
<input type="checkbox" name="ho" value ="ss"/> 史诗
<input type="submit" value="提交"/>
</form>
doGet{
System.out.println("GET"+request.getParameter("x"));
}
doPost{
String username = request.getParameter("username");
String password = request.getParameter("password");
//有缺陷 少用一点
String[] ho = request.getParameterValues("ho");
System.out.println(username+" "+password+"..."+Arrays.toString(ho));
/*
*测试获取所有请求参数的名称
*/
Enumeration names = request.getAttributeNames();
while(names.hasMoreElements()) {
System.out.println(names.nextElement());
}
/*
* 获取所有请求参数 封装到map中
*/
Map<String,String[]> map = request.getParameterMap();
System.out.println(map);
for(String name:map.keySet()) {
String[] values = map.get(name);
System.out.println(name+"="+Arrays.toString(values));
}
}