虽然我们热衷开源(Open Source),但是有时候我们还是有必要将自己的代码加密混淆,防止对手据为己有。关于Java代码的混淆,网上说的很多,而对于Jsp提到的却甚少,也许大家都将业务逻辑封装到Java Bean中的原因吧,呵呵。下面以Weblogic(Windows平台)为例,谈谈如何隐藏Jsp代码。
[b][Weblogic][/b]
一、用weblogic.jspc编译JSP文件
a. 创建一个文件jspc.cmd
set JAVA_HOME=
@要包括jsp代码依赖的jar
set CLASSPATH=
@rem 这是JSP编译后的servlet文件的存放目录
set TARGET_DIR=
@rem 这是你要发布的Web Application的目录
set WEBAPP_DIR=
java -classpath %CLASSPATH% weblogic.jspc -k -g -compileAll -d %TARGET_DIR% -webapp %WEBAPP_DIR%
b. 根据项目的情况,设置“=”右边的值
c. 执行jspc.cmd文件,进行JSP文件的编译,编译后的class文件,应该在%TARGET_DIR%/jsp_servlet目录下,可以将它放在项目的classes目录下,也可以打包成jar
二、编译成功后,将项目中的Jsp移走
三、编辑weblogic.xml文件,把jsp-descriptor标签内的内容清空,加入如下的内容:
<jsp-descriptor>
<jsp-param>
<param-name>precompile</param-name>
<param-value>false</param-value>
</jsp-param>
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>-1</param-value>
</jsp-param>
</jsp-descriptor>
四、编辑web.xml文件,在其中添加如下内容:
<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
五、重新发布项目,可以看到在没有Jsp代码的情况下,应用能成功被访问
备注:上述方式,采用的其实就是jsp的预编译,如果在预编译的时候生成java文件,然后将java文件混淆编译、打包,隐藏就更进一步了,呵呵
[b][Tomcat5.5][/b]
[code]
<?xml version="1.0" encoding="utf-8"?>
<project name="WebApp Precompilation JSP to Java to Class to Jar" basedir="." default="help">
<property name="tomcat.home" value="D:/tomcat5.5.15"/>
<property name="webapp.name" value="myapp"/>
<property name="webapp.path" value="D:/web"/>
<target name="all" depends="jsp2java,java2class,class2jar,clear"/>
<target name="help">
<echo message="显示功能列表"/>
<echo message="jsp2java 通过JspC将JSP转换成Java源代码"/>
<echo message="java2class 将转换后的Java源代码进行编译成class文件"/>
<echo message="class2jar 将编译后的class文件打包"/>
<echo message="clear 清理现场"/>
</target>
<target name="jsp2java">
<taskdef classname="org.apache.jasper.JspC" name="jsp2java">
<classpath id="jsp2java.classpath">
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/server/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
<!-- 注意JSP文件要设置为UTF-8编码 -->
<jsp2java classpath="jsp2java.classpath" javaEncoding="UTF-8" validateXml="false" uriroot="${webapp.path}"
webXmlFragment="${webapp.path}/WEB-INF/webJSP.xml" outputDir="${webapp.path}/WEB-INF/JspC/src"/>
</target>
<target name="java2class">
<mkdir dir="${webapp.path}/WEB-INF/JspC/classes"/>
<!-- 同样Java文件要设置为UTF-8编码 -->
<javac srcdir="${webapp.path}/WEB-INF/JspC/src" destdir="${webapp.path}/WEB-INF/JspC/classes" encoding="UTF-8"
optimize="off" debug="on" failοnerrοr="false" excludes="**/*.smap">
<classpath id="java2class.classpath">
<pathelement location="${webapp.path}/WEB-INF/classes"/>
<fileset dir="${webapp.path}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</classpath>
<include name="**"/>
<exclude name="tags/**"/>
</javac>
</target>
<target name="class2jar">
<mkdir dir="${webapp.path}/WEB-INF/lib"/>
<jar basedir="${webapp.path}/WEB-INF/JspC/classes" jarfile="${webapp.path}/WEB-INF/lib/${webapp.name}JSP.jar"/>
</target>
<target name="clear">
<delete dir="${webapp.path}/WEB-INF/JspC/classes"/>
<delete dir="${webapp.path}/WEB-INF/JspC/src"/>
<delete dir="${webapp.path}/WEB-INF/JspC"/>
</target>
</project>
[/code]
修改相关配置后,运行ant all,生成好的jar文件是{$webappname}JSP.jar。在做为产品发布的时候,只需要你的类jar包和JSP预编译的包放到WEB-INF\lib\目录下即可,如${webappname}.jar和JSP预编译的包${webappname}JSP.jar;然后删除掉你的JSP源文件;并且将${webapp.path}/WEB-INF/webJSP.xml里的servlet映射,添加到${webapp.path}/WEB-INF/web.xml里面。
[b][Weblogic][/b]
一、用weblogic.jspc编译JSP文件
a. 创建一个文件jspc.cmd
set JAVA_HOME=
@要包括jsp代码依赖的jar
set CLASSPATH=
@rem 这是JSP编译后的servlet文件的存放目录
set TARGET_DIR=
@rem 这是你要发布的Web Application的目录
set WEBAPP_DIR=
java -classpath %CLASSPATH% weblogic.jspc -k -g -compileAll -d %TARGET_DIR% -webapp %WEBAPP_DIR%
b. 根据项目的情况,设置“=”右边的值
c. 执行jspc.cmd文件,进行JSP文件的编译,编译后的class文件,应该在%TARGET_DIR%/jsp_servlet目录下,可以将它放在项目的classes目录下,也可以打包成jar
二、编译成功后,将项目中的Jsp移走
三、编辑weblogic.xml文件,把jsp-descriptor标签内的内容清空,加入如下的内容:
<jsp-descriptor>
<jsp-param>
<param-name>precompile</param-name>
<param-value>false</param-value>
</jsp-param>
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>-1</param-value>
</jsp-param>
</jsp-descriptor>
四、编辑web.xml文件,在其中添加如下内容:
<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
五、重新发布项目,可以看到在没有Jsp代码的情况下,应用能成功被访问
备注:上述方式,采用的其实就是jsp的预编译,如果在预编译的时候生成java文件,然后将java文件混淆编译、打包,隐藏就更进一步了,呵呵
[b][Tomcat5.5][/b]
[code]
<?xml version="1.0" encoding="utf-8"?>
<project name="WebApp Precompilation JSP to Java to Class to Jar" basedir="." default="help">
<property name="tomcat.home" value="D:/tomcat5.5.15"/>
<property name="webapp.name" value="myapp"/>
<property name="webapp.path" value="D:/web"/>
<target name="all" depends="jsp2java,java2class,class2jar,clear"/>
<target name="help">
<echo message="显示功能列表"/>
<echo message="jsp2java 通过JspC将JSP转换成Java源代码"/>
<echo message="java2class 将转换后的Java源代码进行编译成class文件"/>
<echo message="class2jar 将编译后的class文件打包"/>
<echo message="clear 清理现场"/>
</target>
<target name="jsp2java">
<taskdef classname="org.apache.jasper.JspC" name="jsp2java">
<classpath id="jsp2java.classpath">
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/server/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
<!-- 注意JSP文件要设置为UTF-8编码 -->
<jsp2java classpath="jsp2java.classpath" javaEncoding="UTF-8" validateXml="false" uriroot="${webapp.path}"
webXmlFragment="${webapp.path}/WEB-INF/webJSP.xml" outputDir="${webapp.path}/WEB-INF/JspC/src"/>
</target>
<target name="java2class">
<mkdir dir="${webapp.path}/WEB-INF/JspC/classes"/>
<!-- 同样Java文件要设置为UTF-8编码 -->
<javac srcdir="${webapp.path}/WEB-INF/JspC/src" destdir="${webapp.path}/WEB-INF/JspC/classes" encoding="UTF-8"
optimize="off" debug="on" failοnerrοr="false" excludes="**/*.smap">
<classpath id="java2class.classpath">
<pathelement location="${webapp.path}/WEB-INF/classes"/>
<fileset dir="${webapp.path}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</classpath>
<include name="**"/>
<exclude name="tags/**"/>
</javac>
</target>
<target name="class2jar">
<mkdir dir="${webapp.path}/WEB-INF/lib"/>
<jar basedir="${webapp.path}/WEB-INF/JspC/classes" jarfile="${webapp.path}/WEB-INF/lib/${webapp.name}JSP.jar"/>
</target>
<target name="clear">
<delete dir="${webapp.path}/WEB-INF/JspC/classes"/>
<delete dir="${webapp.path}/WEB-INF/JspC/src"/>
<delete dir="${webapp.path}/WEB-INF/JspC"/>
</target>
</project>
[/code]
修改相关配置后,运行ant all,生成好的jar文件是{$webappname}JSP.jar。在做为产品发布的时候,只需要你的类jar包和JSP预编译的包放到WEB-INF\lib\目录下即可,如${webappname}.jar和JSP预编译的包${webappname}JSP.jar;然后删除掉你的JSP源文件;并且将${webapp.path}/WEB-INF/webJSP.xml里的servlet映射,添加到${webapp.path}/WEB-INF/web.xml里面。