Oi Jair…
Dei uma olhada no seu tutorial sobre filter e achei perfeito porem tenho uma dificuldade:
Se tentar executar uma servlet (listaOpeAction) após efetuar a servlet logout, que contem session.invalidate(); o programa redireciona para pagina de login graças a implementação da classe FiltroSeguranca implements Filter.Porem se esse servlet (listaOpeAction) foi acessado durante a sessão, ele é acessado tranquilamente via URL (/cad_Ope.do) mesmo após efetuar logout.O mesmo acontece com qualquer outro servlet declaradano web.xml… A impressão que tenho é que a classe FiltroSeguranca não é acessada neste momento pois
nenhum dos System.out.println são exibidos (esses que estão dentro do if/else) Oque pode ser isso?
Configuração no web.xml
<filter>
<filter-name>Filtro Seguranca</filter-name>
<filter-class>com.myapp.struts.filter.FiltroSeguranca</filter-class>
</filter>
<filter-mapping>
<filter-name>Filtro Seguranca</filter-name>
<url-pattern>/cad_ope.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filtro Seguranca</filter-name>
<url-pattern>/conc_caixa.do</url-pattern>
</filter-mapping>
FiltroSeguranca.java[code]public class FiltroSeguranca implements Filter {
public void init(FilterConfig config) throws ServletException {
}
//é verificada a existência do atribute “idUser” na sessão
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpSession session = ((HttpServletRequest)req).getSession();
String idUser = (String)session.getAttribute("Id");
if(idUser==null){
System.out.println("Você não está logado no sistema!");
((HttpServletResponse)res).sendRedirect("/StrutsFinanceiro");
}else{ //caso exista é porque o usuário está logado
chain.doFilter(req, res);
System.out.println("Logado seu ID "+idUser);
}
}
public void destroy() {
}
}[/code]
LogoutAction.java[code]
public class LogoutAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
HttpSession session = request.getSession();
session.removeAttribute("Id");
session.invalidate();
return (mapping.findForward("success"));
}
}
[/code]ListaOpeAction.java[code]public class listaOpeAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
LinkedList despesas = null;
LinkedList receitas = null;
ActionErrors errors = new ActionErrors();
try {
OpeDAO opeDAO = new OpeDAO(); //instancia classe OpeDAO (select * ...)
HttpSession session = request.getSession(); //carrega o objeto da sessão
String idUser = (String)session.getAttribute("Id"); // para recuperarmos o Id do user em questão da sessão em formato String!!
int id = Integer.parseInt(idUser); //convertendo o ID de Strng para inteiro
despesas = opeDAO.listaDespesas(id); //passa id recuperado e convertido em int para acionar o met que retorna lista de despesas do id correspondente
receitas = opeDAO.listaReceitas(id);
session.setAttribute("listaDespesas", despesas); // nome variavel que sera chamado na JSP, nome variavel que contem o parametro
session.setAttribute("listaReceitas", receitas); // nome variavel que sera chamado na JSP, nome variavel que contem o parametro
}
catch (SQLException e) {
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.ope.lista"));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
return (mapping.findForward("failure")); //pag de erro
}
else {
return (mapping.findForward("lista")); //pag que lista operações
}
}
}[/code]
Obrigado!