如何在java中解组ruby对象?
我有一个对象,我想用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
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代码,这难道不会导致注入攻击吗我知道这个话题很老,但我只是想把它抛到一边。