Spring Boot中获取request的三种方式及请求过程
作者:怪咖软妹@
这篇文章主要介绍了Spring Boot当中获取request的三种方式,包括请求过程流程分析及response常用API,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧!
一、请求过程
大概的流程:
1、通过请求,然后访问到服务器,像java常用的服务器就是tomcat。
2、服务器收到请求将请求参数、请求内容封装成一个request和response对象,以参数的形式传到我们的java程序。(这个在servlet最底层的接口当中就会看到的,本篇文章不过多说了,后续找时间出一篇sevlet的博客)
3、这时候java程序就有了request和response对象,request当中包含了请求参数、session、请求路径等一些列关于调用接口的相关内容。而response就是我们对于该请求做出的请求响应。响应内容可以是各种参数,或者页面等等,最终封装到response,响应给服务器。
4、服务器将response响应给客户端。
二、获取request的三种方式
2.1、可以封装为静态方法
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();
2.2、controller的方法里面
@GetMapping(value = "")
public String doSomething(HttpServletRequest request,HttpServletResponse response) {
//...
2.3、直接注入
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
三、request常用API
3.1、request路径相关
// 获取请求方式: GET
String getMethod()
// 获取虚拟目录(上下文目录):虚拟路径通过在application配置当中可以配置
// 配置:server.servlet.context-path=/aaa
String getContextPath()
// 获取Servlet路径:就是获取的controller当中配置的路径
String getServletPath()
/// 获取请求参数: id=3
// http://localhost:8080/aaa/test?id=3
String getQueryString()
// 获取请求URI:/servletDemo/demo1
// 上下文路径+controller当中配置的路径
String getRequestURI()
// 获取完整请求路径:http://localhost:8080/aaa/test
String getRequestURL()
// 获取协议及版本:HTTP/1.1
String getProtocol()
// 获取客户机的IP地址:192.168.0.0
String getRemoteAddr()
3.2、Header相关
// 获取请求头数据,通过请求头名称获取值
String getHeader(String name)
// 获取所有请求头信息
Enumeration<String> getHeaderNames()
3.3、获取请求体
// 获取流对象-获取字符输入流,只能操作字符数据
BufferedReader getReader()
// 获取流对象-获取字节输入流,既能操作字节也能操作字符
ServletInputStream getInputStream()
3.4、获取参数
// 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
String getParameter(String name)
// 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
String[] getParameters(String name)
// 获取请求参数名称(与获取请求头方法类似)
Enumeration<String> getParameterNames()
// 获取所有参数的Map集合
Map<String,String> getParameterMap()
3.5、中文乱码
中文乱码问题,Tomcat8 已经将GET 请求方式的乱码问题 解决了,但是POST方式的中文乱码问题 依旧存在,需要自行配置
在获取参数之前配置
request.setCharacterEncoding("UTF-8");
3.6、转发
浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作。
// 通过request对象获取请求转发服务器:
RequestDispatcher getRequestDispatcher(String path);
// 使用==RequestDispatcher对象来进行转发
forward(ServlertRequest request,ServletResponse response);
3.7、共享数据
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
// 存储数据
setAttribute(String name,Object obj)
// 通过键来获取值
Object getAttribute(String name);
// 通过键移除键对应的值
removeAttribute(String name)
四、response常用API
//设置状态码
response.setStatus(304);
// 设置指定名称响应头的值,下面是导出的时候我们经常要设置的响应头,响应头当中还有文件的名称,也就是通过流下载文件的时候那个文件名称
response.setHeader("Content-Disposition", "attachment;filename=" + zipName);
// 1.字符输出流
PrintWriter getWriter()
// 2.字节输出流(一般导出就是将文件写到字节流,然后响应response)
ServletOutputStream getOutputStream()
// 注意:在同一个Servlet,二种输出流不能同时使用,产生互斥
// response提供了专门负责重定向的方法
response.sendRedirect("/项目地址/资源地址");
// 指定服务器响应中文的编码方式
response.setCharacterEncoding("GBK");
// 统一服务器和客户端的编码方式
response.setContentType("text/html;charset=utf-8");
// 导出的时候如果需要直接通过response流导出Excel,需要和前端设置上下文类型,如下:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
五、常用工具类
5.1、封装的