SimpleTagSuPPort 類
SimlpeTagSuPPort類的生命週期:
1.當jsp容器遇到自定義標籤時。jsp容器會調用標籤處理類的默認構造方法來建立一個標籤處理類的實例。必須爲每個標籤都創建一個新的實例。
2.實例創建後,jsp容器會調用setJspContext()方法。並以一個JspContext實例提供上下文信息。如果是一個嵌套標籤,還講調用setParent()方法。
3.然後容器會調用該標籤中所定義的每個屬性的set方法,這樣標籤處理類實例就已經初始化完成了。
4.接着就由容器調用setJspBody()方法。將該標籤的主題設置爲JspFragment實例。如果標籤主題是空的,則將null值傳到setJspBody().JspFragment實例代表標籤主題片段的引用。
5.接下來,由容器調用doTag()方法標籤要實現的所有邏輯、循環、主體賦值等都在該方法中發生。
6.在doTag()方法返回後,標籤處理類中所有的變量都是同步的。
標籤案例-開發防盜鏈標籤:
盜鏈是指服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。
解決途徑之一——限制引用頁
這種防盜鏈原理是,服務器獲取用戶提交信息的網站地址,然後和真正的服務端的地址相比較,如果一致則表明是站內提交,或者爲自己信任的站點提交,否則視爲盜鏈。
目標:要開發的標籤
<class3g:referer site="http://drinkeye:8080" page="/index.jsp"/>
site:受信任站點,只允許次站點的請求
page:正確的鏈接頁面,發現盜鏈後將其自動轉入此頁面
步驟
-
標籤處理類
public void doTag() throws JspException, IOException { PageContext pageContext = (PageContext) this.getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext.getResponse(); String referer = request.getHeader("referer"); System.out.println(request.getContextPath());
if(referer==null | !referer.startsWith(site)){ //判斷是否盜鏈 //根據page屬性值,講鏈接重定向指訪問被盜鏈內容的正確頁面 String contextPath = request.getContextPath(); if(page.startsWith(contextPath)){ response.sendRedirect(page); }else if(page.startsWith("/")){ response.sendRedirect(contextPath + page); }else{ response.sendRedirect(contextPath + "/" + page); } throw new SkipPageException(); } } |