标签的好处就是能够让JSP界面不出现Java脚本代码,然后加上属性这个东西就大大增强了标签的可复用性,下面我们使用标签技术来开发一个防盗链标签。
首先还是写一个类实现SimpleTagSupport
package com.bird.web.tag.example; 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 site; private String page; public void setSite(String site) { this.site = site; } public void setPage(String page) { this.page = page; } @Override public void doTag() throws JspException, IOException { PageContext pageContext = (PageContext) this.getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext.getResponse(); //1.首先的到来访者的网址 String referer = request.getHeader("referer"); if(referer == null || !referer.startsWith(site)){ if(page.startsWith(request.getContextPath())){ response.sendRedirect(page); }else if(page.startsWith("/")){ response.sendRedirect(request.getContextPath() + page); }else{ response.sendRedirect(request.getContextPath() + "/" + page); } throw new SkipPageException(); }else{ } //2.判断是否是来自防盗链的网站 } } 这个标签带两个属性,一个是site也就是这个防盗链需要来自什么地方的连接才能够访问,第二个page的意思是如果是其他位置访问本页面需要跳转到哪里去。
JspContext必须转型为pageContext才能获得需要的几个对象,然后根据浏览器带过来的referer头就可以知道访问位置,然后对于标签的友好型,还可以自己设置输入格式,下面需要在tld文件中描述一下这个标签
<?xml version="1.0" encoding="UTF-8" ?> <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"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>Bird</short-name> <uri>/example</uri> <tag> <name>referer</name> <tag-class>com.bird.web.tag.example.RefererTag</tag-class> <body-content>empty</body-content> <attribute> <name>site</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>page</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
然后使用这个标签就可以了