resp.setContentType("text/html;charset=utf-8");//设置页面编码我们可以指定网页从某个特定的网页跳转过来,从其他的页面跳转过来是无效的。这就需要http协议里面的referer协以。可以解决盗链难题
//主要用到一个 GZIPOutputStream进行压缩,需要一个内存流来套接压缩之后的io流 //声明一个内存流,用来存储压缩后的字节数据 ByteOutputStream out =new ByteOutputStream(); GZIPOutputStream gzip=new GZIPOutputStream(out); gzip.write(src);//将src压缩到gzip中,放在内存流中 gzip.close(); byte[] b=out.toByteArray();//从内存中读出来,写到前端去
这个会让数据压缩之后再传到前台去
//设置页面不缓存,验证码的自动记忆功能就会失效。就是前台的img后面的src属性不用带参数了,可以在之前的验证码使用这种技术 resp.setHeader("Expires","-1"); resp.setHeader("Cache-control", "no-cache"); resp.setHeader("Pragma", "no-cache");
<span style="white-space:pre"> </span>如果你是jsp页面则: <% response.setHeader("Expires","-1"); response.setHeader("Cache-control","no-cache"); response.setHeader("Pragma","no-cache"); %>
<span style="white-space:pre"> </span>如果你是Servlet在响应前设置: resp.setHeader("Expires","-1"); resp.setHeader("Pragma","no-cache"); resp.setHeader("Cache-Control","no-cache");
package cn.hncu.com.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 Mypictrue extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //有些网址连接,我们必须从某个页面再能进去,其他页面都进不了,我们用到了http:协议里面的属性referer // resp.setContentType("text/html;charset=utf-8");//设置页面编码 String str="<img src='img/1.jpg' alt='图片'></img>";//图片的连接写在这里面 //String str="<a href='http://www.baidu.com'>百度</a>"; String ref=req.getHeader("Referer");//这个不设置,我们可以复制连接直接访问,但是我们这样设置,就不能访问了 if(ref==null) { str="请从指定的网页进去!!"; }else{ if(!(ref.contains("192.168.31.156"))){//当从别的地方超链接过去的时候,会出现盗链 str="盗链"; } } PrintWriter pw=resp.getWriter();//可以直接把字符串放进io流里面 pw.write(str); //pw.println(str); } }压缩网页的代码:
package cn.hncu.com.servlet; import java.io.IOException; import java.io.OutputStream; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; public class Mygzip extends HttpServlet { //将这里的字符串压缩之后传到前台去(简单的实例) @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String str="aaabbbcccasdsadsaddsasddssad"; byte[] src=str.getBytes();//获得字符数组 //转换之前的的数组长度 int len=src.length; System.out.println("之前的数据"+len); //主要用到一个 GZIPOutputStream进行压缩,需要一个内存流来套接压缩之后的io流 //声明一个内存流,用来存储压缩后的字节数据 ByteOutputStream out =new ByteOutputStream(); GZIPOutputStream gzip=new GZIPOutputStream(out); gzip.write(src);//将src压缩到gzip中,放在内存流中 gzip.close(); byte[] b=out.toByteArray();//从内存中读出来,写到前端去 //必须要写这个,不然浏览器出现下载页面 resp.setHeader("Content-Encoding", "gzip"); resp.setHeader("Content-Length", ""+b.length); // //设置页面不缓存的。下面这三句都要写 resp.setHeader("Expires","-1"); resp.setHeader("Cache-control","no-cache"); resp.setHeader("Pragma","no-cache"); int len2=b.length; System.out.println("压缩之后的"+len2); OutputStream out2=resp.getOutputStream(); out2.write(b); out2.close(); } }