Troca de objeto entre aplicações diferentes

fiz um requestDispatcher.forward pra outra aplicação no mesmo server, no request q eu repassei, mandei um objeto como atributo de request
qdo vou pegar ele na outra aplicação, ele lança classCastException, sendo que a classe é a mesma.

Alguem sabe como resolver? se não tiver como resolver, como eu consigo fazer uma troca?

Huummm…vc poderia passar os atributos do como parâmetro em get, ou então, como as duas aplicações estão no mesmo servidor fazer um diretório com os objetos serializados, ou ainda, num sei, talvez usar Corba ou RMI, depende muito do que vc quer fazer!!

Um jeito fácil de resover isso é colocar o objeto na sessão.

Usar sessão mesmo para aplicações diferentes? vc já fez isso? Pensando bem, pode ser que der certo, afinal o objeto fica associado a sessão, num sei, mas isso num vai depender de como servletcontainer vai gerenciar isso, num sei!!???!!!

Vc tem certeza que isso funciona? Pelo que sei, quando vc encaminha o request para outra app, ocorre um redirect e a daí vc perde qualquer dado que haja no request…

Acho que você vai ter que bolar uma outra solução.

[quote=Bjornn Borg]Vc tem certeza que isso funciona? Pelo que sei, quando vc encaminha o request para outra app, ocorre um redirect e a daí vc perde qualquer dado que haja no request…

Acho que você vai ter que bolar uma outra solução.[/quote]

é eu tb acho que não, mas eu pensei, se o cara tivesse os atributos numa request get, tipo:

http://seilah.com.br/app?atributo1=valor1&atributo2=valor2

aí é só ver como mandar isso de um jeito onde o endereço fique preservado, num sei, numca fiz, é só uma idéia…

LuizClaudio, vc quis dizer q pensou q eu tinha parameters.

Estou querendo repassar um login ja feito pra aplicações diferentes, na verdade estou criando um jar q vou partilhar entre as aplicações e faz com que o login esteja centralizado.

Estou usando o tomcat e ja testei um esquema de crossContext, que da pra redirecionar passando o request, eu debugo e o objeto chega (se não funcionasse não daria classCastException, e sim um nullPointer ou algo assim)

Sessão não funciona, ja tentei, sessão é por aplicação e não por containter.
Pelo que entendi até agora, o classpath é outro. O container deve considerar q são classes diferentes.
Quase consegui usando XMLDecoder e XMLEncoder, porém estou com problemas com algumas classes (instantiationException)

Pelo jeito você quer fazer um SSO, certo?

Qual container você está usando? JBoss?

Porque se você duplicou a classe na outra app, pode ser que ele esteja usando o mesmo classloader para as duas aplicações e aí considera como classes diferentes e não como a mesma.

O ideal é, no login, criar um Cookie no cliente, e verificar se está logado peloa cookie, e não ficar enviando login pra cada app diferente.

[quote=O Grande Bé]LuizClaudio, vc quis dizer q pensou q eu tinha parameters.
[/quote]
Não estava falando atributos do objeto que vc quer passar, mas como vc falou que é login num vai rolar vc ter um endereço tipo:

http://seilah.com.br/app?user=meu_user&senha=minha_senha

Consegui contornar este problema serializando objeto inteiro e depois refazendo ele.

Criei dois servlets q fazem uma ponte
em um aplicativo um servlet de saida q encoda o objeto
e no outro um servlet de entrada
só q é estranho pois eu consegui recuperar o objeto setei na sessão pelo servlet, mas qdo tento recupera-lo depois não está mais lá.

Estranho…mas agora o problema é outro né? Essa vida de programador, sai duma fria pra entrar numa gelada… bem que minha mãe falava, filho vai ser advogado eheheheheh num faço idéia do que pode ser, ainda mais sem ver o código, entretanto, posso dizer que eu uso o eclipse Web Tool pra debugar esse tipo de coisa…

Você quer um SSO (Login único)? Porque complicar?

meu…

procura sobre “crossContext tomcat” no nosso amigo google que ele vai ensinar pra vc…

na pratica vc tem q colocar o parametro crosscontext no server.xml do tomcat, com isso sera possivel vc ter acesso as sessões de outras aplicações.

abs, esse e o caminho das pedras.
espero ter ajudado…

Você pode criar um jar e colocar na pasta shared/lib … estes jars são carregados apenas uma vez durante a execução do tomcat (outros servidores tem métodos diferentes para carregar bibliotecas compartilhadas).
Neste jar vc deve criar algo parecido com um Map, mas, singleton.
Futuramente pode até serializar e desserializar os dados do Map para manter as sessões autenticadas após reiniciar a aplicação, e também será necessário caso vc faça uso de um cluster.

Sobre o problema de serialização, que lança uma “InstantiationException”, ocorre quando você não tem um construtor sem parâmetros para a classe.

POG* DETECTED!

* Programação Orientada a Gambiarra

Duvido que as técnicas de SSO use algo muito diferente disso.

Estou certo que não usam. Mesmo porque, como vc disse, isso só deve funcionar no Tomcat. Cadê a portabilidade?
O SSO que fizemos usa Cookies.

Leia denovo.

Acho que você quis dizer que usa sessão identificada por cookies.

Uma sessão pode ser identificada por cookies ou path variables, quando cookies não são permitidos.

Para um SSO é necessário compartilhar um único objeto entre as aplicações: a sessão.
Para compartilhá-lo, você precisa de uma forma para indentificar ele futuramente, que é o que chamamos de identificador da sessão.
O identificador da sessão precisa ser passado pelo cliente ao servidor para que este identifique quem o está acessando.

No nosso caso, cada aplicação tem uma LIB do nosso SSO. Esse cara, que é configurado no módulo de autorização, é quem verifica as permissões e a existência do cookie que o libera de um novo login.

Com as aplicações dentro do mesmo conteiner, pegue o contexto da outra aplicação e encaminhe a requisição para a servlet na outra aplicação.
Segue o código abaixo.

Servlet1 na aplicação 1

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response) throws ServletException,
                                                          IOException {
    request.setAttribute("attr" , "teste"); //adicionando o atributo
    
//buscando o contexto da outra aplicacao
    ServletContext sc = getServletContext().getContext("project2" );
    
    RequestDispatcher rd = sc.getRequestDispatcher("/servlet2");
    rd.forward(request , response);
  }

Servlet 2 na aplicacao project2

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("&lt;html&gt;"); out.println("&lt;head&gt;&lt;title&gt;Appl&lt;/title&gt;&lt;/head&gt;"); out.println("&lt;body&gt;"); out.println("<p>"+request.getAttribute("attr") +"</p>"); out.println("&lt;/body&gt;&lt;/html&gt;"); out.close(); }