Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中解组ruby对象?_Java_Ruby_Jruby_Marshalling - Fatal编程技术网

如何在java中解组ruby对象?

如何在java中解组ruby对象?,java,ruby,jruby,marshalling,Java,Ruby,Jruby,Marshalling,我有一个对象,我想用java获取它的内容。 唯一的问题是它目前在ruby中 irb(main):050:0> blah => "BAh7ByIeYXV0aGVudGljYXRpb25fc3RyYXRlZ2llczAiCXVzZXJpBg%253D%253D-\ -0cdecf4edfaa5cbe4693c9fb83b204c1256a54a6" irb(main):049:0> Marshal.load(Base64.decode64(blah)) => {"authe

我有一个对象,我想用java获取它的内容。 唯一的问题是它目前在ruby中

irb(main):050:0> blah
=> "BAh7ByIeYXV0aGVudGljYXRpb25fc3RyYXRlZ2llczAiCXVzZXJpBg%253D%253D-\
-0cdecf4edfaa5cbe4693c9fb83b204c1256a54a6"

irb(main):049:0> Marshal.load(Base64.decode64(blah))
=> {"authentication_strategies"=>nil, "user"=>1}
我得到了base64部分——现在所有内容都是以字节为单位的。我如何访问第二个字符串?我认为jruby可以做一些事情,但我以前从未使用过它,也不知道从哪里开始

让我在这里详细说明我的问题

1) 这些是我试图在tomcat上的servlet和apache上的merb应用程序之间共享的cookie

2) 我不会将它们存储在数据库中。我曾考虑过在memcached中使用它们,但出于其他原因,我希望将它们存储为cookie(是的,我非常清楚涉及的安全问题)

我目前正在研究jruby的RedBridge/jruby嵌入,然而,因为我只需要看70个字节,所以我认为为这么简单的东西调用这么多开销是荒谬的

而不是提出一个新问题。。。。我现在拥有的代码如下所示:

        // using commons
        Base64 b64 = new Base64();
        byte[] decoded = b64.decode(cookie.getValue().getBytes());

        ScriptingContainer container = new ScriptingContainer();
        container.runScriptlet("la = Marshal.load(\"" + decoded + "\"); puts la.to_s;");

显然,这是行不通的,因为marshal将检查解码的前2个字节,因为它与jruby的主要/次要版本不匹配…hrmss..

对于不涉及jruby的解决方案,为什么不序列化您感兴趣的字段?例如,将它们作为原始字符串保存到文件或关系数据库中

我意识到这可能不完全回答这个问题,但这可能是你之前没有想到的一种可能性


编辑-feydr明确表示,他并不是在谈论将对象数据序列化到文件。因此,我假设序列化用于进程间通信,在这种情况下,通过套接字交付的二进制协议(或任何协议)是一个很好的解决方案,并且易于实现。你可以做的比看(甚至可以在java方面做代码生成)更糟糕。

你也可以考虑使用谷歌协议缓冲区,以及C++和Python。这就是我所做的。让我再次重申一下,我在这里的全部目的是将一个cookie会话从merb发送到一个在tomcat下运行的servlet

import java.io.*;
import java.util.*;
import org.jruby.embed.ScriptingContainer;
import org.apache.commons.codec.binary.Base64;
import javax.servlet.*;
import javax.servlet.http.*;

public class process extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   HttpSession session = request.getSession(true);

    PrintWriter out = response.getWriter();
    Cookie[] cookies = request.getCookies();

    for(int i=0; i<cookies.length; i++) {
      Cookie cookie = cookies[i];

      // base64 decode, then un-marshall ruby style...
      // finally figure out what to do with our session secret key
      if(cookie.getName().equals("_session_id")) {
        ScriptingContainer container = new ScriptingContainer();
        container.setWriter(out);
        container.runScriptlet("require 'base64'; puts \"" + cookie.getValue() + "\"; " +
                              "puts Marshal.load(Base64.decode64(\"" + cookie.getValue() + "\")).to_s; ");
      }                       

    } 

}     
}
import java.io.*;
导入java.util.*;
导入org.jruby.embed.ScriptingContainer;
导入org.apache.commons.codec.binary.Base64;
导入javax.servlet.*;
导入javax.servlet.http.*;
公共类进程扩展HttpServlet{
public void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
HttpSession session=request.getSession(true);
PrintWriter out=response.getWriter();
Cookie[]cookies=request.getCookies();

对于(int i=0;如果文件io存储会话信息的成本很高,而且肯定已经过时了……我们的主要web应用程序是ruby,我不可能每次点击页面时都查看文件,我没有基准来证明这一点,但使用数据库进行会话对数据库来说听起来相当困难——是否提供任何关于这方面的案例?真的是memcache如果这个问题没有答案的话,我现在就是这么想的抱歉-我想,考虑到你在谈论序列化/封送,文件IO正是你在做的!你可以尝试在socketsI上使用二进制协议。这可能是错误的,但如果cookie中有ruby代码,这难道不会导致注入攻击吗我知道这个话题很老,但我只是想把它抛到一边。