/** * 1.新建类继承SimpleTagSupport * 新建2个属性, 添加对应的set方法 * 覆盖doTag()方法 */ import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.SkipPageException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class RefererTag extends SimpleTagSupport { private String webSite; private String jumpPage; public void setWebSite(String webSite) { this.webSite = webSite; } public void setJumpPage(String jumpPage) { this.jumpPage = jumpPage; } @Override public void doTag() throws JspException, IOException { PageContext pageContext = (PageContext) this.getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext.getResponse(); String webRoot = request.getContextPath(); // 得到 referer String referer = request.getHeader("referer"); if (referer == null || !referer.startsWith(webSite)) { // 是盗链者 if (jumpPage.startsWith(webRoot)) { // "/web/index.jsp" response.sendRedirect(jumpPage); } else if (jumpPage.startsWith("/")) { // "/index.jsp" response.sendRedirect(webRoot + jumpPage); } else {// "index.jsp" response.sendRedirect(webRoot + "/" + jumpPage); } throw new SkipPageException();// 如果是盗链者,就抛出这个异常 } } }
<?xml version="1.0" encoding="UTF-8" ?> <!-- 文件名 /WEB-INF/referer.tld --> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>anyName</short-name><!-- 这个值可以任意设置 --> <uri>anyUri</uri><!-- 这个Uri可以任意设置,但是不要与别的 .tld 文件相同 --> <tag> <name>referer</name> <tag-class>de.bvb.web.tag.RefererTag</tag-class> <body-content>empty</body-content> <!-- 不要标签体 --> <attribute> <name>webSite</name><!-- 需要添加前面设置的2个属性 --> <required>true</required><!-- required表示是否必须 --> <rtexprvalue>true</rtexprvalue><!-- rtexprvalue表示属性的值是否可以使用el表达式 --> </attribute> <attribute> <name>jumpPage</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="referer" uri="/WEB-INF/referer.tld"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!-- 3.设置好标签库以后添加下面这行标签就可以进行防盗链了。 webSite表示不设置防盗链的站点,jumpPage表示发现盗链以后跳转的页面 --> <referer:referer webSite="http://localhost" jumpPage="index.jsp" /> <html> <head> <title>通过jsp标签进行防盗链</title> </head> <body>某某某的文章</body></html>