显示标签为“JAVA”的博文。显示所有博文
显示标签为“JAVA”的博文。显示所有博文

2009年3月11日星期三

让JAVA应用服务器支持中文URL路径

  Tomcat等JAVA应用服务器,默认情况下是不支持中文的URL访问路径的,我们可以通过自己添加滤镜的方法让其支持,具体代码如下:


package com.suntek.draw.common;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import java.net.*;
/**
 * <p>Title: </p>
 *
 * <p>Description: Tomcat支持中文路径</p>
 *
 * <p>Copyright: Copyright (c) 2009</p>
 *
 * <p>Company:健新科技 </p>
 *
 * @author wmzsoft
 * @version 1.0
 */
public class DwfFilter implements Filter {
    protected FilterConfig filterConfig = null;
    private String encoding = null;
   
    public void destroy() {
        filterConfig = null;
        encoding = null;
    }
    /**
     * Tomcat支持中文路径。
     * @param request ServletRequest
     * @param response ServletResponse
     * @param chain FilterChain
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String s = req.getRequestURI();
        String url = URLDecoder.decode(s, encoding); //IEIntertnet选项-高级选项-总是以UTF-8发送URL 被选中时。
        String context = req.getContextPath();
        if ((url !=null) && (context !=null)){
            int idx = url.indexOf(context);
            if (idx>=0){
                url = url.substring(idx+context.length());
            }
        }
        filterConfig.getServletContext().getRequestDispatcher(url).forward(req,response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        encoding = filterConfig.getInitParameter("encoding");
    }
}
在Web.XML文件中添加此滤镜即可。
<filter>
    <filter-name>DWFFilter</filter-name>
    <filter-class>com.suntek.draw.common.DwfFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

2008年7月6日星期日

JAVA反编译探讨-javassist & jclasslib

  最近由于一个项目,需要对无源码的Class类修改其中一个方法,只好采用反编译,得到的源码虽然无语法错误,但产生了逻辑错误,具体原因是反编译可能产生类型转换出错或运算优先级出错,之前的文章有讨论到。
  经过google一把之后,找到javassist,感觉好像可以,看看例子,使用方法很简单,可以不需反编译直接修改class的函数体,经过试验,修改函数体到时成功了,不过这东东仍然没有解决问题,虽然没有深入研究javassist,但感觉他修改了不仅仅是我需要修改的函数,其它函数也被修改了,与反编译产生的BUG一样,所以这鸟东东也只是中看不中用。
  再google一把,找到jclasslib,可以直接修改字节码,不过这东东需要去熟悉JVM指令,比较烦,看来还是老老实实地看反编译后的源文件,找出其中反编译有误的地方,一一修正吧,有时最常用的办法,就是最好的办法。

JAVA反编译探讨-运算优先级

废话少说,直接来看一下源代码,如下:

public class Test {
 public static void main(String[] args) {
  int i = 3;
  i = (++i) + (++i);
  System.out.println("i=" + i);
 }
}

运行结果:
 i=9

反编译得到的源码如下:
public class Test{

 public Test(){
 }

 public static void main(String args[]){
  int i = 3;
  i = i++ + i;
  System.out.println("i=" + i);
 }
}

运行结果为:
 i=7

呵呵,看来反编译并不可靠呀。

2008年7月5日星期六

JAVA反编译探讨-类型转换

  最近在做Maximo的过程中,反编译一个Class之后,得到的源码无任何语法错误,但是编译回去之后,运行时却报Stack OverflowError,经过努力发现原来Java反编译在类型转换过程中存在问题。
  例:源码如下:
public void setValue(int value){
 setValue( (long)value);
}

public void setValue(long value){
 this.longvalue = value;
}
  以上代码,运行不会出错,但经过编译后,再将类进行反编译得到的源码如下:

public void setValue(int value){
 setValue(value);
}

public void setValue(long value){
 this.longvalue = value;
}
  由此我们看到,反编译之后,将long类型直接转换为int类型了,所以setValue(int value)函数将出现递归死循环,导致Stack OverflowError也就很正常了。

  反编译会出现类型转换错的,还包括将double与float类型之间的转换,至于其它的类型是否还会出错,暂时没有做深入研究。

 
Friend JXKJ EAMPUB NIU-B China
CopyRight 2007-2009 WMZSOFT QQ