HTTP协议介绍
1.什么是HTTP协议
HTTP(Hyper Text Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,常用于Web应用中,用于浏览器和Web服务器之间传输超文本内容。HTTP是一个基于客户端-服务器架构模型的协议,客户端发出请求,服务器回送响应。HTTP协议一般使用TCP作为传输层协议,HTTP的主要特点是简单、快速、灵活。HTTP协议的最新版本是HTTP2.0。
2.请求头
GET /myweb/index.html HTTP/1.1(请求行)
消息头
Accept-Encoding gzip, deflate
Host localhost:8080
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Accept text/html, application/xhtml+xml, */*
Accept-Language zh-CN
3.响应头
HTTP/1.1 304 Not Modified(状态行)
消息头
ETag W/"37-1368603309298"
Content-Type text/html
Content-Length 37
Last-Modified Wed, 15 May 2019 07:35:09 GMT
实例 (下载图片、防盗链、定时刷新、防止重复提交)
1.下载图片
1.1新建一个jsp页面,选择一张图片
<%--
Created by IntelliJ IDEA.
User: Asus
Date: 2023/10/9
Time: 11:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载</title>
</head>
<body>
<img src="img/OIP-C.jpg"><br>
<a href="DownloadConntroller?filename=img/OIP-C.jpg">下载</a>
</body>
</html>
1.2新建一个Servlet
package com.org.controller;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
@WebServlet("/DownloadConntroller")
public class DownloadConntroller extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html:charset=utf-8");
//获得资源名
String filename = req.getParameter("filename");
//获取绝对路径
String realPath = this.getServletContext().getRealPath(filename);
//截取资源名
int i = realPath.lastIndexOf(File.separator);
String substring = realPath.substring(i + 1);
//设置下载
resp.setHeader("content-disposition","attouchment;filename="+ URLEncoder.encode(substring,"utf-8"));
FileInputStream in = new FileInputStream(realPath);
OutputStream out = resp.getOutputStream();
byte[] b = new byte[2*1024];
int len = 0;
while ((len=in.read(b))!=-1){
out.write(b,0,len);
}
}
}
1.3运行结果
下载完成打开文件
2.防盗链
2.1什么是防盗链
盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担
2.2java代码
//防止盗链
String referer = resp.getHeader("referer");
String server = "http://" + req.getServerName();
if (referer!=null && referer.startsWith(server)){
req.getRequestDispatcher("download.jsp").forward(req,resp);
}
3.定时刷新
3.1网页定时刷新
<%--
Created by IntelliJ IDEA.
User: Asus
Date: 2023/10/10
Time: 10:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<style>
#span1{
color: mediumvioletred;
font-size: 50px;
}
</style>
<body>
<div>
注册成功
<span id="span1">3</span>
秒后跳转登录页面,如果没有跳转点击
<a href="login.jsp">登录</a>
</div>
</body>
<script>
function fun() {
//获得span
var span1 = document.getElementById("span1");
//获得span标签中的值
var i = span1.innerHTML;
if (i>0){
i=i-1;
span1.innerHTML=i;
}
}
//定时器每秒调用一次
window.setInterval("fun()",1000);
<%
//设置浏览器的属性
response.setHeader("refresh","3;url=/formdemo/login1.jsp");
%>
</script>
</html>
3.2运行结果
点击注册3秒后跳转到登录界面
4.防止重复提交
4.1模拟服务器卡顿
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
4.2在网页中处理重复提交
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: Asus
Date: 2023/9/21
Time: 11:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
HashMap<String,String> error = (HashMap<String,String>)request.getAttribute("error");
String register = request.getParameter("register");
%>
<div>
<div style="width:100%; text-align: center"><%=register==null?"":register%></div>
<form action="UserController" method="post" onsubmit="fun()">
<input type="hidden" value="register" name="userAction">
<table border="1" cellpadding="0" cellspacing="0" width="50%" height="500px" align="center">
<tr>
<td colspan="2" align="center">用户注册</td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" value="" name="username"></td>
<%=error==null?"":error.get("username")==null?"":error.get("username")%>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" value="" name="password"></td>
<%=error==null?"":error.get("password")==null?"":error.get("password")%>
</tr>
<%--<tr>--%>
<%--<td>生日:</td>--%>
<%--<td><input type="text" value="" name="birthday"></td>--%>
<%--</tr>--%>
<tr>
<td>性别:</td>
<td>
<input type="radio" value="男" name="gender">男
<input type="radio" value="女" name="gender">女
</td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" value="篮球" name="hobby">篮球
<input type="checkbox" value="唱" name="hobby">唱
<input type="checkbox" value="跳" name="hobby">跳
<input type="checkbox" value="rap" name="hobby">rap
</td>
</tr>
<tr>
<td>地址:</td>
<td>
<select name="address">
<option value="北京">北京</option>
<option value="四川">四川</option>
<option value="广州">广州</option>
<option value="上海">上海</option>
</select>
</td>
</tr>
<tr>
<td>备注:</td>
<td>
<textarea cols="80" rows="20" name="remark">
</textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注册" id="sub">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</div>
</body>
<script type="text/javascript">
//处理重复提交
var i=1;
function fun() {
var sub = document.getElementById("sub");
if (i>1){
sub.disable("disable");
alert("请勿重复提交");
return false;
}
i++;
}
</script>
</html>
4.3运行结果
多次点击注册后弹出提示