目录
Request
用户通过浏览器访问服务器的时候,Tomcat将Http请求中所有的信息都封装咋Request对象中,开发人员可以通过request对象方法来获取浏览器中发送的所有信息
Request获取请求信息
获取请求行信息
请求行信息包括:请求方式 请求路径(get请求会携带参数) 协议/版本
相关API:
reqeust.getMethod() ---->获取请求方式
request.getContextPath() ----->获取项目的应用路径
request.getRemoteAddr() ----->获取请求者的ip
request.getQueryString() ------>获取get请求的所有请求参数
request.getProtocol() ------->获取协议和版本
request.getRequestURI() ----->获取请求路径
getRequestURL():统一资源定位符(绝对路径)
getRequestURI():统一资源描述符(相对路径)
代码案例:
public class RequestLineServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.1 获得请求方式
String method = request.getMethod();
//1.2 获得项目的虚拟发布名称(别名) - 用于动态的项目路径
String contextPath = request.getContextPath();
//1.3 获得远程主机的ip地址(指的是客户端的ip)
String remoteAddr = request.getRemoteAddr();
//1.4 获得?号后面的数据部分
String queryString = request.getQueryString();
//1.5 获得协议版本
String protocol = request.getProtocol();
//1.6统一资源定位符(绝对路径)
StringBuffer requestURL=request.getRequestURL();
//1.7统一资源描述符(相对路径)
String requestURI = request.getRequestURI();
}
}
获取请求头信息:
getHeader(String): ---->根据key获得字符串数据
常见的请求头:
referer: ---->获取资源的来源,若是直接输入就没有referer
user-agent ---->系统版本和浏览器版本
referer常用来显示上一个资源路径,在应用过程中,用于防盗链:例如别人在访问新闻的时候如果从一个正确的合法的网站调转过去就可以正常浏览,如果从非法网站指向具体新闻的时候,页面来源就是他人的网站(网站地址是唯一的).这就形成了盗链.所以我们可以在一个连接访问的时候判断一下是不是自己网站内部提供即可.
代码案例:
public class RefererServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("网站内部后台被访问了");
//多个人可以访问服务器 需要判断
String referer = request.getHeader("referer");
if("http://localhost:8080/day09/index.html".equals(referer)){
System.out.println("自己网站的路径 可以继续访问");
}else{
System.out.println("钓鱼网站的路径 提示用户修改密码");
}
}
}
获取请求参数:
string getParameter(String s) ------>根据key获取值
Map<String,String[]> getParameterMap() ------>获取所有键值对数据,并封装到map中
string[] getParameterValues() ------>根据key获取一组值
代码案例:
public class RequestParamServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby");
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()));
}
}
}
处理post请求中文乱码
关于乱码问题:只有在存储和读取编码不一致的情况下才会发生.在表单提交数据的时候,http协议的默认编码是iso-8859-1,这种编码的特点就是不支持中文,但是在执行get请求的时候不会发生乱码问题.这种情况和tomcat的版本有关.tomcat8.5开始已经处理了get请求的中文乱码,但是post没有处理,需要我们自己处理.处理的方式就是只需要在获取参数之前的时候处理一下即可.
//设置请求的编码
request.setCharacterEncoding("utf-8");这句处理的代码一定放在最前面:
请求参数的信息放在缓冲区中,缓冲区的代码只能在没有获得数据之前初始化一次并设置编码,如果先从缓冲区中获得数据,缓冲区的编码固定,就再也不能修改了.
Request其他功能
域对象(共享数据)
- 域对象:一个有作用范围的对象,可以在作用范围内共享数据
- reqeust域:代表一次请求范围,可在一次请求转发的两个资源中共享数据
- request的生命周期:当请求来的时候创建request对象,当响应生成的时候request销毁
请求转发:点击查看请求转发与重定向区别
Response
Response操作响应信息
操作响应行
响应行信息包括协议/版本号和状态码:
状态码:
- 200:请求响应成功
- 302:重定向,浏览器重新发起第二次请求
- 304:浏览器默认读取本地缓存
- 404:文件找不到 地址书写不对
- 405:get或post方法没有找到 或手动调用了父类的get或者post方法
- 500:服务器内部代码错误.
设置响应头
常见的响应头:
- location:设置重定向的地址
- refresh:定时刷新
- content-type:设置返回的数据的mime类型及编码
- content-disposition:设置声明方式打开响应回去的内容,用于文件下载,值为attachment;filename=文件名称.后缀
API:
setHeader(String 响应头, String 值):设置值为string类型的响应头,后设置的会把前面设置的覆盖
addHeader(Strign 响应头, String 值):追加值为String类型的响应头
代码案例:重定向
public class ThreeServletServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置状态吗
//response.setStatus(302);
//2.设置响应头地址信息 可以跳转站外地址
//response.setHeader("location", "http://www.baidu.com/");
//可以跳转站内资源 跟请求转发不一样的时候 需要加上项目的虚拟路径名称
//请求转发: 只是服务器内部的动作 , 重定向是可以跳转服务器外部信息
//response.setHeader("location", "/day09/fourServlet");
//重定向的简化api
response.sendRedirect( "/day09/fourServlet");
}
}
操作响应体:
API
PrintWriter getWriter();//一般写字符数据用
ServletOutputStream getOutputStream();//一般文件下载使用
注意:
两个流不能出现同一个逻辑中,俩流互斥
响应中文乱码处理
setContentType("mime类型,charset=utf-8")
- 设置响应回去的数据mime类型
- 设置数据的字符编码
- 通知浏览器用什么编码解析数据
public class ResponseBodyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 响应体其实就是流
* 字节流 : 一般用于输出 图片 视频 文件..信息
* response.getOutputStream() 字节流
* 字符流 : 一般用于输出 文本信息
* response.getWriter() 打印流 字符流
* api : 都是write 用于输出内容
* print的底层都是write 建议都用print方法输出内容
* 注意: 字节流和字符流不能同时使用(会报错)
*/
//我们需要特殊设置内容 通知浏览器 以什么方式 什么编码解析内容
//设置响应的数据格式及编码 设置输入法 在中文下使用英文标点
//出现在第一行
request.setCharacterEncoding("utf-8");
//response.setHeader("content-type" , "text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("aaa<a href=''>百度一下</a>");
}
}