1. 定义一个用于输出JavaScript代码 的Servlet类。
package com.mycompany.response.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HideJavaScript extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("text/javascript;charset=UTF-8");
PrintWriter out = response.getWriter();
String referer = request.getHeader("referer");
if(!(referer==null)&&!referer.equalsIgnoreCase("")&&referer.startsWith("http://localhost:8080/response/"))
{
out.println("document.write('这些就是隐藏的JavaScript代码!')");
out.println("window.alert('执行了此代码!')");
}
else
{
out.println("请勿盗链!");
}
}
}
2. 解释
首先通过http头实现禁止缓存的功能。防止浏览器将代码缓存。
然后设置mime类型为text/javascript。通过判断referer向外输出JavaScript代码。
3. 在需要使用JavaScript的页面中:
在jsp页面中:
<script type="text/javascript" src="<%=request.getContextPath() %>/hidejavascript">
</script>
在html页面中:
<script type="text/javascript" src="/website1/hidejavascript">
</script>
4. Jsp页面中的地址
4.1 Form的Action的地址,JavaScript的src地址,link的css的href的地址,response.sendRecirect(String path)方法都遵循如下规则:
地址不以/开头代表相对与本页面设置的<base href=”基地址”>的地址,基地址默认为本页所在目录。地址以/开头代表相对于当前web站点根目录的地址,这里的web站点根目录指的是,例如:http://localhost:8080,而web应用的根目录是,例如:http://localhost:8080/website1。之所以这些地址都是相对于http://localhost:8080,因为这些地址是交给浏览器执行的。
比较保障的做法是,都使用/开头的路径。例如在a.jsp页面forward到b.jsp页面,如果b.jsp页面中的css文件使用的是相对路径,而a.jsp和b.jsp又不在一个目录,就会出错。因为浏览器是不知道被forword到b.jsp,还按照相对a.jsp的目录去查找资源。
4.2 Request的getRequestDispatcher(String path)方法,这里的path如果是以/开头,代表web应用程序的根目录,如果不是,则表示相对目录。