HttpServletRequest
HttpServletRequest概述
客户端发送给服务器端的数据。
我们在创建Servlet时会覆盖service()⽅法,或doGet()/doPost(),这些⽅法都有两个参数,
代表请求的request和代表响应response。
HttpServletRequest是ServletRequest的⼦接⼝,功能和⽅法更加强⼤,
通过request获得请求⾏
- 获得客户端的请求⽅式:String getMethod()
- 获得请求的资源:
方法 | 作用 |
---|---|
String getRequestURI() | 获取请求URI |
StringBuffer getRequestURL() | 获取请求URL |
String getContextPath() | 获取虚拟⽬录,动态路径** |
String getServletPath() | 获取Servlet路径 |
String getQueryString() | 获取get⽅式请求参数 |
String getRemoteAddr() | 获取客户机的IP地址 |
@WebServlet("/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获得请求行信息
String method = req.getMethod(); // 请求方式 大写
String uri = req.getRequestURI();//获取请求URI
String url = req.getRequestURL().toString();//获取请求URL
String addr = req.getRemoteAddr();// 获得客户端IP地址
}
通过request获得请求头
方法 | 作用 |
---|---|
long getDateHeader(String name) | |
String getHeader(String name) | |
int getIntHeader(String name) | |
Enumeration getHeaderNames() | 获取所有的请求头名称 |
常用请求头:
- Cookie:与会话有关的技术,用于存放浏览器缓存的cookie信息.
- User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关的信息.
作⽤:可以在服务器端获取该头的信息,解决浏览器的兼容性问题 - Referer:告诉服务器,我(当前请求)从哪⾥来?
作用:防盗链接,可以判定跳转页面,进行拦截
@WebServlet("/Demo2")
public class Demo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String referer = req.getHeader("referer");//处理盗链问题
if (referer==null||referer.contains("day03_war_exploded")){//判断请求中是否包含选定的网址
resp.getWriter().write("success");
}else{
System.out.println("false");
}
}
}
通过request获得请求参数
方法 | method() | 格式/作用 |
---|---|---|
String getQueryString() | get⽅式 | username=zhangsan&password=123 |
BufferedReader getReader() | post方式 | 获取字符输⼊流,只能操作字符数据 |
ServletInputStream getInputStream() | post方式 | 获取字节输⼊流,可以操作所有类型数据 |
请求参数在URL上?(Get方式)
@WebServlet("/Demo04Servlet")
public class Demo04Servlet extends HttpServlet {
// 获得请求参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get请求参数在URI上 ?后面的参数
String queryString = req.getQueryString();
System.out.println(queryString);// 格式:username=lucy&password=111
}
}
请求参数在请求体中?(Post方式)
@WebServlet("/Demo04Servlet")
public class Demo04Servlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post请求参数在请求体里 -> 输入流
ServletInputStream is = req.getInputStream();
byte[] bytes = is.readAllBytes();// 读取所有字节
String s = new String(bytes);
System.out.println(s);// name=lisi&age=18
}
}
request的其他功能
设置字符集
原始方式实现字符集转换
解码思路
public class Demo05Servlet extends HttpServlet {
// 获得请求参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//String username = req.getParameter("username");
//System.out.println(username);
//byte[] bytes = username.getBytes("ISO8859-1");
//username = new String(bytes, "UTF-8");
username = new String(username.getBytes("ISO8859-1"), "UTF-8");
System.out.println(username);
}
}
使用设置字符集方法改变字符集
@WebServlet("/Demo05Servlet")
public class Demo05Servlet extends HttpServlet {
// 获得请求参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求字符集 - 只针对于Post请求方式有效
req.setCharacterEncoding("UTF-8");
String password = req.getParameter("password");
System.out.println(password);
}
}
请求转发与重定向的关系
请求转发
- 步骤:
- 通过request对象获取请求转发器对象:getRequestDispatcher(String path)
- 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)
- 特点:
- 浏览器地址栏路径不发⽣变化
- 只能转发到当前服务器内部资源中
- 转发是⼀次请求
重定向
- 特点:
- 地址栏发⽣变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使⽤request对象来共享数据
共享数据
request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据
方法 | 作用 |
---|---|
void setAttribute(String name,Object obj) | 存储数据 |
Object getAttitude(String name) | 通过键获取值 |
void removeAttribute(String name) | 通过键移除键值对 |