用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处理:
<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>
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); }}
//执行过滤的核心方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException { //---------下面代码用于对用户请求执行预处理--------- //获取ServletContext对象,用于记录日志 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis(); System.out.println("开始过滤..."); //将请求转换成HttpServletRequest请求 HttpServletRequest hrequest = (HttpServletRequest)request; //截取所有图片请求 if(hrequest.getServletPath().equals("你的魔术图片的url")) { //生成随机数,产生随机url,进行魔术变换,相应的业务逻辑写到这里, //最后调用context.getRequestDispatcher将图片请求的url转发 context.getRequestDispatcher("/img/daolian.gif").forward(request, response); } //Filter只是链式处理,请求依然放行到目的地址 chain.doFilter(request, response); }
[解决办法]
感觉不需要这么复杂~~~你可以用javascript或<% %>嵌入java代码得到一个0—10的随机数,然后进行url拼接,比如:
Random r = new Random();
int a = r.nextInt(10);a为0-9这10个数
现实图片的url="/images/picture"+<%=a%>+".jpg" 把10张图片分别命名为picture0.jpg-picture9.jpg,每刷新一下都会得到一个随机数,而url也会变,图片也会变,而且不管多少张图片都可以~~
[解决办法]
你可以这样试一下,把 刷新更换 这个链接的url用encode编码一下,这样就把sessionId放到请求头信息中了,这样或许会得到上一次的Session
[解决办法]
[解决办法]
这么多解决办法,人多办法多。
[解决办法]
学习哦。。。
[解决办法]
学习,虽然偶不太懂。。。
[解决办法]
有结果了没?
[解决办法]
我觉得哈
既然你是想要一个顺序的图片结果集,那图片的filename生成 就是一个单独的生成器来生成的,可以定义一个全局的static变量来维护,而和你的session是没有关系的。
[解决办法]
你应该先获取当前的picname吧,获取的了然后往下面累加,如果picname为空,就是第一个开始便利,感觉你程序写的怪怪的
[解决办法]
学习中,帮顶
[解决办法]
帮顶
[解决办法]
学习.....
[解决办法]
学习中!
[解决办法]
学习了~~~~~~~~~
[解决办法]
学习一下
[解决办法]