1. Http组成部分
tcp协议进行访问、二进制
同步概念:请求和响应 B/S架构
异步概念:服务器不需要及时响应给客户端,由服务器处理好结果后推送给客户端
HttpServerRequest
请求行
Request URL: https://zhidao.baidu.com/notice/get/ <!--请求地址-->
Request Method: GET <!--请求方式-->
Status Code: 200 OK <!--响应状态码-->
Remote Address: 220.181.107.200:443 <!--远程调用地址-->
Referrer Policy: unsafe-url <!--上次访问URL-->
请求头
Accept: application/json, text/javascript, */*; q=0.01 <!--请求类型-->
Accept-Encoding: gzip, deflate, br <!--压缩格式-->
Accept-Language: zh-CN,zh;q=0.9 <!--语言编码格式-->
Connection: keep-alive <!--长连接-->
Cookie: m_lpvt_6859ce5aaf00fb00387e6434e4fcc925=1567135531
Host: zhidao.baidu.com
<!--请求来源,企业可以用来白名单、黑名单,防盗链-->
Referer: https://zhidao.baidu.com/question/2075467092661157468.html
<!--浏览器版本信息-->
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
X-ik-ssl: 1
X-Requested-With: XMLHttpRequest
自定义请求头?移动登录将token存放在请求头中
企业实际移动端登录案例
请求体
只有post请求时会把实体放在请求体中
响应200为向服务器请求资源,304为缓存使用本地资源。
HttpResponse
响应头、响应体
2. 防盗链----企业白名单和黑名单机制
a. 使用nginx反向代理解决防盗链
b. 反盗链机制:Java代码控制请求来源资源判断Referer
方式:项目写个过滤器过滤请求头的来源自断
@WebFilter(filterName = "ImgFilter",urlPatterns = "/img/*")
public class ImgFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter...");
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse res=(HttpServletResponse)servletResponse;
String referer = req.getHeader("referer");
//请求服务名称
String serverName = req.getServerName();
System.out.println("referer"+referer+",serverName"+serverName);
if(referer==null ||(referer.contains(serverName))){
req.getRequestDispatcher("error.png").forward(req,res);
return;
}
//放行
filterChain.doFilter(req,res);
}
@Override
public void destroy() {
}
}
3. 重定向和转发原理分析
重定向请求两次,两次响应
转发请求一次,响应一次
重定向地址栏会变,转发不会变
转发过程:
客户端请求,服务端找到对应servlet并执行,执行后调用getRequestDispacther()转发请求给指定jsp文件。整个流程在服务端完成,一次请求一次响应。
重定向过程:
客服端请求,服务端找到对应servlet并执行,执行后调用response.senRedirect()返回响应,并告诉客户端让他再发一个请求访问jsp文件,然后得到一个新的响应,整个过程两次请求,两次响应。第一次请求为302请求,第二次请求为200请求。
4. 时间戳
每次发布版本,一定在js、图片上加上时间戳防止,解决缓存冲突问题。
5. 常见错误码
a. 404 URL地址错误
b. 500 系统错误
c. 403 参数错误
d. 302 重定向
e. 502 正在发布
6. http和https区别
https —>ssl+证书传输 — 非对称加密、证书加密
效率低,安全高,使用https没有证书的话网站会报错提示
http 不安全
http端口:80
https端口:443
抓包工具作用(fiddler):通过宽带连接,都可以通过抓包分析到请求。
a. 笔记本上创建一个wifi
b. 手机连接wif
post请求 浏览器看不到提交参数 抓包可以分析参数
7. HttpClient
public class HttpClientTest {
static public void get() {
try {
//创建默认链接
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建get请求
HttpGet httpGet = new HttpGet("https://www.baidu.com/");
CloseableHttpResponse response = httpClient.execute(httpGet);
int code = response.getStatusLine().getStatusCode();
//获取状态
System.out.println("http请求结果" + code);
if (code == 200) {
System.out.println(EntityUtils.toString(response.getEntity()));
}
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
get();
}
}
8. 长连接和短连接
http1.0 属于短连接
http1.1 默认长连接,保留短连接
为什么有长连接?
短连接过程:
建立连接(三次握手)→数据传输→关闭连接(四次挥手)
长连接过程:
建立连接(三次握手)→数据传输→保持连接→数据传输→关闭连接(四次挥手)
效率高
长连接什么时候关闭?
a. 配置失效心跳检测时间,客户端没有继续建立连接,直接关闭
b. 浏览器配置参数后可以主动关闭
c. tomcat服务器配置长连接超市时间
长连接和短连接应用场景:
长连接:默认网站长连接、rpc远程调用、dubbo、netty、移动APP消息推送
短连接:调用接口,使用不是很频繁
9. 跨域解决方案
跨域:跨域其实是浏览器安全机制,请求访问的域名与ajax请求地址不一致,浏览器会直接无法返回请求结果。
a. jsonp 支持get请求不支持post请求
$.ajax({
typt: "GET",
async:false,
url: "http://a.com/index",
dataType: 'jsonp',
jsonp:"jsonpCallback"
success: function(data) {
alert("获取结果:"+data["userName"]);
},
error:function(){
alert("fail");
});
——
String userName=req.getParameter("userName");
JSONObject jsonObject=new JSONObject();
jsonObject.put("userName",userName);
String jsonpCallback=req.getParameter("jsonpCallback");
resp.getWriter().println(jsonpCallback+"("+jsonObject.toJSONString()+")");
jsonp原理:使用JavaScript发送get请求,传参数回调带回来解析。
b. 使用接口网关----spingcloud zull、nginx----互联网公司实际案例
c. httpclient内部转发
@WebServlet("/ToFromServlet")
public class ToFromServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建默认链接
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建get请求
HttpGet httpGet = new HttpGet("https://b.com/b/ToFromServlet?userName="+req.getParameter("userName"));
CloseableHttpResponse response = httpClient.execute(httpGet);
int code = response.getStatusLine().getStatusCode();
//获取状态
System.out.println("http请求结果" + code);
if (code == 200) {
String result=EntityUtils.toString(response.getEntity());
resp.getWriter().print(result);
System.out.println(result);
}
response.close();
httpClient.close();
}
}
——
$.ajax({
typt: "GET",
async:false,
url: "http://a.com/index",
dataType: 'json',
success: function(data) {
alert("获取结果:"+data["userName"]);
},
error:function(){
alert("fail");
});
通过本地服务调用本地接口,然后内部进行转发调用其他服务接口
缺点:两次请求,不靠谱,浪费资源
优点:安全,不存在跨域安全,抓包分析不到
d. 添加header请求允许访问
resp.setHeader("Access-Control-Allow-Origin","*");
10. 表单重复提交
造成原因:
网络延迟、刷新、提交成功后重新加载、回退
解决方法:
使用token
什么是token→令牌、有效期、唯一不重复的标识
token类似于sessionid
@WebServlet("/FromServlet")
public class FromServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String token= UUID.randomUUID().toString();
req.getSession().setAttribute("token",token);
req.getRequestDispatcher("from.jsp").forward(req,resp);
}
}
原理:
客户端请求来到表单验证页面,session中存入了token值,表单input中存放session值
第一次提交表单,通过判断
req.getParameter("sessionToken");
req.getSession().getAttribute("token");
两值是否相等,如果相等保存数据,并删除session值
重复提交表单后判断结果是不相等,返回友好提示不要重复提交
11. 防止模拟http请求
a. 使用令牌—好处 唯一性 只能有一次请求
知道token方式知道后,如果杜绝被模拟请求
程序使用验证码
token+验证码能杜绝模拟http请求
ps: 单纯记录自己所学记录------------仅供参考