日期:2014-05-18  浏览次数:20863 次

用servlet实现图片自动换(用一个.jpg结尾的URL获得一张可变图片),求教如何在每次被外链引用时按顺序更换图片
每次刷新页面,同样一个图片URL显示的图片不一样。曾经有不少网站搞过这东西,魔幻图片夹、天使表情网等等,因为未知原因一一关闭。于是想自己尝试制作出类似的效果。该效果常用于百度贴吧骗回帖,论坛动态签名头像等。看到不少人问过类似问题,但给的答案都是用jsp页面或者flash实现,这样返回的内容不能当作图片URL被外链。看到有PHP的实现方法,但是URL是以.php的形式表现,不具备足够的隐蔽性。

详细需求说明:
1.输入输出效果与jpg图片URL完全类似,即输入一个后缀为.jpg的URL,获得一个图片文件。URL不能用.php,.jsp或者.do带参数等形式,否则影响隐蔽效果;返回的内容不能是一个使用img标签的页面,否则此url放入img标签将不能被正常显示。
2.按顺序或者随机的显示方式,当用户每次刷新时,返回的图片将产生相应的变化。

我现在的实现方法是:
1.配置web.xml,添加如下代码,用于将某特定的jpg请求转向到servlet处理:
XML code
<servlet>
    <servlet-name>PicChange</servlet-name>
    <servlet-class>PicChange</servlet-class>
  </servlet>
 
 <servlet-mapping>
    <servlet-name>PicChange</servlet-name>
    <url-pattern>/orz.jpg</url-pattern>
  </servlet-mapping>



2.创建对应的servlet,名为PicChange.java,输出写法是参考了验证码图片
Java code

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class PicChange extends HttpServlet {

 

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  doPost(request,response);
 }

 /*mir
  Mar 31, 2009*/

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("image/jpeg");
  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
  
  OutputStream out = response.getOutputStream();
  //显示方式暂时采用传入的参数,可从数据库或者配置文件中获取定义
  String orderOrRandom = (String)request.getParameter("random");
  if(orderOrRandom==null||"".equals(orderOrRandom)){
   orderOrRandom = "order";
  }else if("true".equals(orderOrRandom)){
   orderOrRandom = "random";
  }
  String img = request.getSession().getServletContext().getRealPath("image");
  File imgPath = new File(img);
  File[] imgList = imgPath.listFiles();//获得图片文件夹下的所有图片File
  
  Integer num;
  
  if("order".equals(orderOrRandom)){
   HttpSession session = request.getSession();
   num = (Integer)session.getAttribute("num");
   if(num==null||num>=imgList.length){
    num=0;
   }
   session.setAttribute("num", num+1);
   
  }else{
   num = ((Double)(Math.random()*(imgList.length))).intValue();
   
  }
  ImageIO.write(ImageIO.read(imgList[num]),"JPEG",out);

 }
}





预览效果:



好了问题来了……之前测试的时候发现,貌似图片仅仅在外链被引用时并不会产生session。本打算默认的变化方式是按顺序,用户每次提交时在session中取一个累加计数器来返回不同的图片。
结果每次刷新时都只会显示第一张图片。只有当用户将这个URL放入地址栏访问过后才会生效,这时点击刷新就会按顺序更换了,并且此时保持浏览器不关闭,访问其他的论坛中外链的这张图片,也能够看到变化效果。

在这个问题没解决的情况下,我现在已设置为随机更换图片效果。随机不会出现这种问题……
我想知道是否有更好的办法来实现顺序更换,或者有更好更节省资源的算法?第一次发帖,希望各位高手不吝赐教,谢谢……

------解决方案--------------------
不太懂~mark~学习~
------解决方案--------------------
request.getSession() 可以创建一个