zl程序教程

您现在的位置是:首页 >  其它

当前栏目

HttpServletRequest通过Referer实现简单防盗链

实现 简单 通过 防盗链 HttpServletRequest REFERER
2023-09-14 09:14:18 时间

        我们知道在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,发现重定向到了登录界面


        上面就是一个最简单的防盗链,我们通过Referer就能实现对请求的控制,对哪些请求做出正确的响应,对哪些非法请求做出拒绝