1.页面验证码: 
response.reset();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
//out.clear();
//out=pageContext.pushBody();tomcat中需要 out.clear();out=pageContext.pushBody();这两行才不报错!
而weblogic 中需要 //out.clear();//out=pageContext.pushBody();才不报错!
2.tomcat中对于前台页面传递中文参数url需要在后台 name=new String(name.getBytes("ISO-8859-1"), "gbk");转换编码格式才能正常接收中文参数。 而对于weblogic则不用这样转码,如果转码了反而出错了。 
因为前台代码为 ‘ <tr height="20" align="center" class="mytr" style="cursor:hand" onclick="sysaction22('<%=basePath%>argiSetAction!getSelArea.action?quId=<s:property value="#area.id.countyId"/>&&areaId=<s:property value="#area.id.localId"/>&&name=<s:property value="#area.localName"/>')">  ’  参数的传递用了 <s: 标签,所以没法对参数进行转码,只能在后台转码,但是后台又要区分是weblogic和tomcat!
  请问怎么通过代码区别他们?

解决方案 »

  1.   

    你可以写个配置文件 从配置文件里读取到底是那种web服务。
      

  2.   

    问题1:
    <% String info = application.getServerInfo() %>
    然后可以根据内容去判断。
    但是,输出验证码为啥要 out.clear() 和 pageContext.pushBody() ?
    问题2:
    那是因为你没有设置Tomcat关于URI的缺省编码,所以它默认是ISO8859-1,而Weblogic默认就是UTF-8找找 conf\server.xml<Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"
      

  3.   

    1. out.clear() 和 pageContext.pushBody()   是weblogic在验证码中需要的,如果不写这两句话就会报错,虽然不影响程序运行但是不好看。 但是如果是tomcat的话就需要这两句,才能正常。因为项目要部署到两种服务器上,所以才需要判断当前运行的环境是tomcat还是weblogic?
    2. tomcat默认解码uri的设置,我试过可以,但是一般该项目部署的容器里还有其他项目,所以这个不是最好的解决办法!!!
      

  4.   

    1、我在Tomcat和Weblogic下都做过验证码,从没用过这两句话;2、统一编码规范是最合理的,否则就自己手工转码吧;也可以尝试在Filter中 request.setCharacterEncoding(xxoo)。
      

  5.   

    <%@ page language="java" contentType="image/jpeg; charset=gbk"%>
    <%@ page import="java.util.Random" %>
    <%@ page import="java.awt.Graphics" %>
    <%@ page import="java.awt.Font" %>
    <%@ page import="java.awt.Color" %>
    <%@ page import="java.awt.image.BufferedImage" %>
    <%@ page import="com.sun.image.codec.jpeg.*" %>
     <%!   
      Color   getRandColor(int   fc,int   bc){   
      //给定范围获得随机颜色   
      Random   random   =   new   Random();   
      if(fc>255)   fc=255;   
      if(bc>255)   bc=255;   
      int   r=fc+random.nextInt(bc-fc);   
      int   g=fc+random.nextInt(bc-fc);   
      int   b=fc+random.nextInt(bc-fc);   
      return   new   Color(r,g,b);   
      }   
      %>   
      <% 
      response.reset();
      response.setContentType("image/jpeg");   
      //设置页面不缓存   
      response.setHeader("Pragma","No-cache");   
      response.setHeader("Cache-Control","no-cache");   
      //response.setDateHeader("Expires",   0);   
        
      //   在内存中创建图象   
      int   width=60,   height=20;   
      BufferedImage   image   =   new   BufferedImage(width,   height,   BufferedImage.TYPE_INT_RGB);   
        
      //   获取图形上下文   
      Graphics   g   =   image.getGraphics();   
        
      //生成随机类   
      Random   random   =   new   Random();   
        
      //   设定背景色   
      g.setColor(getRandColor(200,250));   
      g.fillRect(0,   0,   width,   height);   
        
      //设定字体   
      g.setFont(new   Font("Times   New   Roman",Font.PLAIN,18));   
        
      //画边框   
      g.setColor(new   Color(100,100,100));   
      g.drawRect(0,0,width-1,height-1);   
        
      //   随机产生155条干扰线,使图象中的认证码不易被其它程序探测到   
      g.setColor(getRandColor(160,200));   
      for(int i=0;i<155;i++){   
      int   x   =   random.nextInt(width);   
      int   y   =   random.nextInt(height);   
      int   xl   =   random.nextInt(12);   
      int   yl   =   random.nextInt(12);   
      g.drawLine(x,y,x+xl,y+yl);   
      }   
        
      //   取随机产生的认证码(4位数字)   
      String   sRand="";   
      for(int i=0;i<4;i++){   
      String   rand=String.valueOf(random.nextInt(10));   
      sRand+=rand;   
      //   将认证码显示到图象中   
      g.setColor(new   Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));   
      //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成   
      g.drawString(rand,13*i+6,16);   
      }   
      //   将认证码存入SESSION   
      session.setAttribute("yanzhengma",sRand);   
      //   图象生效   
      g.dispose();   
      //   输出图象到页面   
      //ImageIO.write(image,"JPEG",response.getOutputStream());   
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
      encoder.encode(image); 
      
      
      //out.clear();
      //out=pageContext.pushBody();
      %>             
    这个我们项目里面的验证码jsp文件。
    关于转码,你说的统一编码是怎么统一的?   前台编码依据的是谁?  后台解码依据的是谁? 编码这一块我都快被网上的说法给弄晕了。自己试也没试出个所以然来!!!
      

  6.   

    统一编码,指的是: Web、源代码、中间件URI 和 数据库 全部采用同一套字符集,目前首推是 UTF-8 了。这样可以减少很多编码转换的复杂度 和 时间开销;子系统之间的集成和数据交换也就没有这类风险了。