我们知道在http中请求头中有一个referer来表示请求来自于哪里,于是我们就可以通过这个请求来判断是不是应该非法的请求,例如没有登录就直接进行访问。下面用Referer来实现应该简单的防盗链。
我们首先创建登录界面,然后再创建一个Servlet来接收登录请求,如果直接访问这个Servlet那么就重定向到登录界面,如果链接来自于登录界面,那么就输出访问成功,代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="http://localhost:8080/servlet/referer" method="post">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/referer")
public class RefererServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Referer
String referer = request.getHeader("Referer");
//设置响应的MIME和编码
response.setContentType("text/html;charset=utf-8");
//判断是不是来自登录界面
if ("http://localhost:8080/servlet/login_request.html".equals(referer)){
//获取输出流写出数据
PrintWriter writer = response.getWriter();
writer.write("<h1>访问成功</h1>");
}else {
//重定向到登录界面
response.sendRedirect("http://localhost:8080/servlet/login_request.html");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
我们首先正常流程进行登录访问,发现访问成功
那么现在我们再来尝试直接访问这个Servlet,发现重定向到了登录界面