GET请求和POST请求
可以简单的认为HHTP中的POST GET PUT DELETE对应着CRUD
区别:
1)从语义上讲GET更偏向于查询操作,即GET请求不会对后台数据产生影响;而POST则不同
2)一般来讲GET请求是幂等的
Ps看到一个关于幂等很好的定义 abs(a) = abs(abs(a))
3)GET将数据放在url上,而POST将数据放在HTTP body中;POST相对安全
4)如果使用POST就无法保存书签
RESTFUL API
参考链接:https://juejin.im/entry/59e460c951882542f578f2f0
1)URL表示资源;两种方式 /employees & /employees/56
2)名词+方法替换动词url /createEmployee -> POST + /employees
/updateEmployee -> PUT /employees/56
3)条件筛选时,使用?添加条件 GET /employees?state=internal&maturity=senior
4)非资源请求使用动词url GET /calculate?para2=23¶2=432
|
POST(创建) |
GET(读取) |
PUT(更新) |
DELETE(删除) |
/employees |
创建一个新员工 |
列出所有员工 |
批量更新员工信息 |
删除所有员工 |
/employees/56 |
(错误) |
获取56号员工的信息 |
更新56号员工的信息 |
删除56号员工 |
Session & Cookie
HTTP是一个无状态协议,如何维持同一个用户的会话?
对于客户的第一个请求,容器会生成一个唯一的sessionId给到客户端,客户再以后的每一个请求中发回这个sessionId,这样容器就知道客户的身份了
客户端和容器如何交换SessionId?
最常用的方法是通过cookie,在服务端给到客户端的response中,header中有一个叫Set-Cookie的属性,用于存放JSESSIONID;在客户端到服务端的request中,header中有一个叫Cookie的属性,用于存放JSESSIONID
如果禁用cookie这套机制怎么玩的转?
用户禁用cookie后,会忽视response的header中的Set-Cookie;此时需要换一种办法来交换sessionId
1)URL重写
origin url + ;jsessionid=1231231
注意这里是服务端返回给客户端的,在响应发回的html中(比如href)
2)表单隐藏
分布式环境如何实现session共享?
参考链接:https://blog.csdn.net/u010028869/article/details/50773174?ref=myread
1)nginx对特定的sessionId进行映射,即一个用户的请求只会交给一个固定的机器处理
优点:无须对session做任何处理只要存在本机即可
缺点:如果某台机器挂掉,那么这台机器保存session的用户都要重新登录
2)session复制,即所有的服务器共享session,任何一个服务器上session发生改变,都同步到其他服务器
优点:容错性较好,即使机器挂掉也ok
缺点:容易造成网络堵塞
3)session第三方共享,redis(集群) or db(集群)
Forward VS Redirect
二者都可以称为请求转发,前者称为直接请求转发,后者称为间接请求转发
Redirect:客户端发送一个http请求,服务端Servlet1处理,之后执行response.sendRedirect("target url"),之后客户端再次向target url发送http请求
Forward:客户端发送一个http请求,服务端Servlet1处理,之后调用requestDispatcher.forward(request,response),进行请求转发,直接转发到Servlet2处理,最后处理完成后将response返回到客户端
举个例子:Servlet将模型传递到jsp就是通过forward
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
view.forward(request,response);