HTTP 协议知识整理
HTTP(超文本传输协议)是一种请求-响应协议,基于TCP协议,用来传递数据。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态。
特点:
方法 | 说明 |
---|---|
GET | 获取 Request-URI 所标识的资源 |
POST | Request-URI 所标识的资源后附加新的数据 |
HEAD | 请求获取 Request-URI 标识资源的响应头 |
DELETE | 请求删除 Request-URI 所标识的资源 |
PUT | 请求服务器存储一个资源 |
OPTIONS | 请求服务器性能或查询与资源相关的选项和需求 |
TRACE | 测试或诊断 |
CONNECT | 保留以备后用 |
GET | POST | |
---|---|---|
地址栏显示 | 是 | 否 |
安全性 | 否 | 是 |
长度限制 | 有 | 无 |
Content-Type 类型格式是“大类型/小类型”,浏览器通常使用 MIME 类型来确定如何处理URL
MIME 类型文档
Servlet = Service + Applet,运行在服务器上的小程序
实现 Servlet 程序步骤
实现 Servlet 接口(或继承 HTTPServlet)
public class TestServlet implements Servlet
配置 web.xml
<servlet>
<servlet-name>testservlet-name>
<servlet-class>com.wang.servlet.TestServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>testservlet-name>
<url-pattern>/testurl-pattern>
servlet-mapping>
service(默认调用,一般不用)doGet doPost doXXX…
接收请求 到 Tomcat 关闭
接收请求 调用构造器方法
<load-on-startup>1load-on-startup>
init 方法
service 方法
Tomcat 关闭调用 destroy 方法
每个 Servlet 程序都有自己对应的 ServletConfig
重写 init 方法要调用父类的 init 方法
获取ServletConfig
ServletConfig config = this.getServletConfig();
一个 web 工程只有一个,由服务器创建,所有用户共享
获取 ServletContext 方式
// 方式1
ServletContext context = this.getServletContext();
// 方式2
ServletContext context = this.getServletConfig().getServletContext();
// 方式3
ServletContext context = request.getSession().getServletContext();
每次只要有请求进入服务器,服务器会把请求过来的HTTP协议信息解析好,封装成对象中,传递到 service 方法。
HTTPServletReques 表示请求过来的信息,请求行、请求头、请求体,也可以在里面放对象
HTTPServletResponse 表示所有响应的信息,响应行、响应头、响应体
req.getRequestDispatcher("1.jsp").forward(request,response);
//方式1
resp.setStatus(302);
resp.sendRedirect("1.jsp");
//方式2
res.setHeader("Location","http://www.baidu.com");
//方式3:超链接
//方式4:表单提交
译码与解码不匹配
Tomcat 默认 iso-8859-1
get 请求:改 Tomcat 配置文件
post 请求:设置 Request 的字符编码格式
响应乱码:设置 Response 的字符编码格式
不同域的数据共享
HTTP 是无状态的协议,交互结束后,不会保存任何信息
// 1. 创建Cookie
Cookie cookie = new Cookie("hello","world");
// 2. 添加到response
response.addCookie(cookie);
当次请求如果设置 Cookie 则会在响应头出现 Set-Cookie
在以后的 所有请求头 中的 Cookie 里都会有已设置 Cookie 的信息
可以为 Cookie 设置路径,使某些路径请求头不带上 Cookie
默认存储在客户内存中,浏览器退出则失效;设置过期时间为其持久化
// 获取session
HttpSession session = request.getSession();
服务器默认存储时长为30分钟,可以设置过期时间
一般每个会话维护一个 Session
request.getSession()
后就会形成这样的键值对。因为 JSESSIONID 是临时 Cookie,所以关闭浏览器后丢失,所以每次会话都会创建新的 JSESSIONID,所以每次会话请求的 Session 对象不同
JSESSIONID 不能直接从 Cookie 里获取,但是你可以覆盖
HttpSession session = request.getSession();
Cookie jsessionid = new Cookie("JSESSIONID", session.getId());
jsessionid.setMaxAge(3*60*60);
response.addCookie(jsessionid);
Session | Cookie | |
---|---|---|
存储位置 | 服务器端 | 客户端 |
默认时效 | 30分钟 | 关闭丢失 |
//1. 解决重定向
url = response.encodeRedirectURL(url);
//2. 解决非重定向
url = encodeURL(URL);
//会将JssesionID暴露在URL中
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
req.setCharacterEnconding("utf-8");
resp.setCharacterEnconding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
chain.doFilter(req,reps); //使请求继续
}
<filter>
<filter-name>filterfilter-name>
<filter-class>com.wang.Filter.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>filterfilter-name>
<url-pattern>/url-pattern>
filter-mapping>
某个事件产生前后做点什么
监听对象 | 监听接口 |
---|---|
ServletContext | ServletContextListener、ServletContextAttributeListener |
HttpSession | HttpSessionListener、HttpSessionActivationListener、HttpSessionAttributeListener、HttpSessionBindingListener |
ServletRequest | ServletRequestListener、ServletRequestAttributeListener |
<listener>
<listener-class>com.wang.listener.MyListenerlistener-class>
listener>
<base href=""/>
设置页面相对路径工作时参照的地址
http://ip:port/
http://ip:port/工程路径/
response.sendRediect("/");
解析得到http://ip:port/
不管有多少个/
,只要是连续的,都视为一个/
Servlet、Filter、Listener 映射匹配使用的是 ANT 风格
通配符 | 说明 |
---|---|
? | 匹配任何单字符 |
* | 匹配任意多个字符 |
** | 匹配任意目录 |
最长匹配原则:若有多个映射匹配成功,选择最长最精确的
配置文件的方式比较麻烦,可以为 Servlet、Filter、Listener 添加注解@WebServlet
、@WebFilter
、@WebListener
@WebServlet
、@WebFilter
、@WebListener
@WebServlet(urlPatterns = "/hi")
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
}
}
@ServletComponentScan
@SpringBootApplication
@ServletComponentScan
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean<HiServlet> getServletRegistrationBean(){
return new ServletRegistrationBean<>(new HiServlet(),"/hi");
}
}