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!!
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:
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)
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:
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ê 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.
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);
}