Validação de login

Java

19/07/2015

Alguém pode me ajudar?

A idéia aqui é validar na classe a existência de uma variável de sessão criada em um servlet

Meu jsp
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 
<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />
<c:set var="admin" value="${validaAdmin.testaLogin(request)}" />
<c:set var="redireciona" value="${validaAdmin.redireciona(request)}" />
 
<c:choose>
<c:when test="${admin != null}">          
             ${admin.nome};
    </c:when>
<c:otherwise>
             $;
    </c:otherwise>
</c:choose>

Minha classe
package dao.admin;
 
import model.Admin;
 
import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;
 
public class TestaLoginAdmin 
{ 
public Admin testaLogin(HttpServletRequest request) throws ServletException, IOException 
{
HttpSession sessao = request.getSession();
 
Admin admin = (Admin) sessao.getAttribute("admin");
        
if(admin != null)
{
return admin;
}
return null;
}
 
public void redireciona(HttpServletResponse response) throws ServletException, IOException
{
response.sendRedirect("index.jsp");
}
}

Erro:
HTTP Status 500 - org.apache.jasper.JasperException: An exception occurred processing JSP page /_global/testaAdmin.jsp at line 5
 
 
type Exception report
 
message org.apache.jasper.JasperException: An exception occurred processing JSP page /_global/testaAdmin.jsp at line 5
 
description The server encountered an internal error that prevented it from fulfilling this request.
 
exception
org.apache.jasper.JasperException: org.apache.jasper.JasperException: An exception occurred processing JSP page /_global/testaAdmin.jsp at line 5
 
2: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3: 
4: <jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />
5: <c:set var="admin" value="${validaAdmin.testaLogin(request)}" />
6: <c:set var="redireciona" value="${validaAdmin.redireciona(request)}" />
7: 
8: <c:choose>
 
 
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:555)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 
 
root cause
org.apache.jasper.JasperException: An exception occurred processing JSP page /_global/testaAdmin.jsp at line 5
 
2: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3: 
4: <jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />
5: <c:set var="admin" value="${validaAdmin.testaLogin(request)}" />
6: <c:set var="redireciona" value="${validaAdmin.redireciona(request)}" />
7: 
8: <c:choose>
 
 
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:934)
org.apache.jsp.admin.principal_jsp._jspService(principal_jsp.java:89)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 
 
root cause
org.apache.jasper.el.JspELException: /_global/testaAdmin.jsp(5,0) '${validaAdmin.testaLogin(request)}' java.lang.NullPointerException
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:123)
org.apache.jsp._005fglobal.testaAdmin_jsp._jspx_meth_c_005fset_005f0(testaAdmin_jsp.java:161)
org.apache.jsp._005fglobal.testaAdmin_jsp._jspService(testaAdmin_jsp.java:121)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:934)
org.apache.jsp.admin.principal_jsp._jspService(principal_jsp.java:89)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 
 
root cause
java.lang.NullPointerException
dao.admin.TestaLoginAdmin.testaLogin(TestaLoginAdmin.java:13)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
javax.el.BeanELResolver.invoke(BeanELResolver.java:165)
org.apache.jasper.el.JasperELResolver.invoke(JasperELResolver.java:147)
org.apache.el.parser.AstValue.getValue(AstValue.java:159)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:115)
org.apache.jsp._005fglobal.testaAdmin_jsp._jspx_meth_c_005fset_005f0(testaAdmin_jsp.java:161)
org.apache.jsp._005fglobal.testaAdmin_jsp._jspService(testaAdmin_jsp.java:121)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:934)
org.apache.jsp.admin.principal_jsp._jspService(principal_jsp.java:89)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 
 
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.22 logs.
 
 
Apache Tomcat/8.0.22

Alguém pode me ajudar?
Carlos Rocha

Carlos Rocha

Curtidas 0

Respostas

Carlos Rocha

Carlos Rocha

19/07/2015

Pessoal, ainda não consegui resolver essa!

Alguém pode me ajudar?
GOSTEI 0
Robson Teixeira

Robson Teixeira

19/07/2015

Bom Dia,
Fiz alguns testes e o erro e a forma que você está obtendo a requisição e a resposta na sua JSP, para isso use a variavel pageContext conforme o exemplo abaixo.

<c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />
<c:set var="redireciona" value="${validaAdmin.redireciona(pageContext.response)}" />


E recomendo você utilizar mudar a implementação do seu método redireciona, pois no processo de renderizar a página o método redirecina referenciado é executado e isso já faz sua app ir para a pagina de index e isso impede a exibição do nome do admin


Att
Robson
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Pois é. Esse é o problema.
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />

<c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />
<c:set var="redireciona" value="${validaAdmin.redireciona(pageContext.response)}" />

$

<c:choose>
  <c:when test="${admin != null}">          
            Olá ${admin.nome}
          <c:set var="tipo" value="${admin.tipo}" />
          <c:choose>
            <c:when test="${tipo=='s'}">          
              <style>#super{display:block;}</style>
              <style>#comum{display:none;}</style>
            </c:when>
          </c:choose>
          <c:choose>
            <c:when test="${tipo=='c'}">          
              <style>#super{display:none;}</style>
              <style>#comum{display:bloq;}</style>
            </c:when>
          </c:choose>
  </c:when>
  <c:otherwise>
             $
    </c:otherwise>
</c:choose>

Quando copio uma url que exige a validação e colo no navegador sem passar pelo login, a página abre normalmente!
Se passar pelo login abre e esse script retorna os dados do admim.
Se não passar pelos login, a página abre normalmente e não exibe Null na exibição do admin!
GOSTEI 0
Robson Teixeira

Robson Teixeira

19/07/2015

Favor explique melhor o que você quis dizer, pois realmente não entendi o que você digitou agora pouco.

Att
Robson
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Se eu pegar a url:

imwsaogotardo/admin/principal.jsp

Que tem a validação do arquivo acima, e colar direto no navegador.

Neste caso a validação deveria dizer que o "admin" é null e redirecionar para index.jsp; Mas no caso isso não ocorre esta abrindo a página principal.jsp normalmente

NA VERDADE NEM SEI SE MANTENHO UMA CLASSE PARA VALIDAR O LOGIN IGUAL ESTA AGORA OU SE EU CANCELO ESSA CLASSE E FAÇO A VALIDAÇÃO NO PRÓPRIO JSP DA FORMA ABAIXO:
QUAL A TUA OPINIÃO?
<%@ page import="model.Admin"%>
<%
HttpSession sessao = request.getSession();

Admin admin = (Admin) sessao.getAttribute("admin");
String tipo = admin.getTipo();
out.println("Olá "+admin.getNome());
sessao.setAttribute("tipoAdmin", tipo);
	  
if (sessao.getAttribute("nomeAdmin") != null)
{  
    sessao.removeAttribute("nomeAdmin"); 
}
	  
if (tipo.equals("s"))
{
    out.print("<style>#super{display:block;}</style>");
	out.print("<style>#comum{display:none;}</style>");
} 
else if (tipo.equals("c")) 
{
    out.print("<style>#super{display:none;}</style>");
    out.print("<style>#comum{display:block;}</style>");
}
%>
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Tentei da forma abaixo mas quando admin é null, não imprime nada na tela na linha 9 e nem a função redireciona é executada!

Porque?

<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />

<c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />
<c:set var="redireciona" value="${validaAdmin.redireciona(pageContext.response)}" />

$ ===

<c:choose>
  <c:when test="${admin != null}">          
            Olá ${admin.nome}
          <c:set var="tipo" value="${admin.tipo}" />
          <c:choose>
            <c:when test="${tipo=='s'}">          
              <style>#super{display:block;}</style>
              <style>#comum{display:none;}</style>
            </c:when>
          </c:choose>
          <c:choose>
            <c:when test="${tipo=='c'}">          
              <style>#super{display:none;}</style>
              <style>#comum{display:bloq;}</style>
            </c:when>
          </c:choose>
  </c:when>
</c:choose>

<c:choose>
  <c:when test="${admin == null}">
             $
  </c:when>
</c:choose>
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Olha, agora entendi o que você quis dizer com:
E recomendo você utilizar mudar a implementação do seu método redireciona, pois no processo de renderizar a página o método redirecina referenciado é executado e isso já faz sua app ir para a pagina de index e isso impede a exibição do nome do admin

Mas tenho uma dúvida:
Métodos não deveriam rodar apenas quando fossem chamados?
Nesse caso, o método redireciona não deveria ser chamado na página de testeAdmin.jsp apenas quando a condição do admin fosse nula? Porque ela esta rodando mesmo assim?

Bom. essa é a dúvida.

Agora, veja se a solução que usei é a mais ideal:

classe
package dao.admin;

import model.Admin;

import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;

public class TestaLoginAdmin 
{ 
	public Admin testaLogin(HttpServletRequest request) throws ServletException, IOException 
	{
		System.out.println(request+" = Request");
		HttpSession sessao = request.getSession();
		Admin admin = null;

		admin = (Admin) sessao.getAttribute("admin");

		if(admin != null)
		{
			return admin;
		}
		return admin;
	}
}

jsp
<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />

<c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />

<c:choose>
  <c:when test="${admin != null}">          
            Olá ${admin.nome}
          <c:set var="tipo" value="${admin.tipo}" />
          <c:choose>
            <c:when test="${tipo=='s'}">          
              <style>#super{display:block;}</style>
              <style>#comum{display:none;}</style>
            </c:when>
          </c:choose>
          <c:choose>
            <c:when test="${tipo=='c'}">          
              <style>#super{display:none;}</style>
              <style>#comum{display:bloq;}</style>
            </c:when>
          </c:choose>
  </c:when>
</c:choose>

<c:choose>
  <c:when test="${admin == null}">
             out.println("<script>location.href="index.jsp";</script>")
  </c:when>
</c:choose>
GOSTEI 0
Robson Teixeira

Robson Teixeira

19/07/2015

Boa Tarde,
Primeiro desculpe pelo erro de digitação foi sem querer e recomendo que no lugar do seu out.println seja um link para voltar para a pagina inicial de sua app, onde o usuário vai clicar(Veja o exemplo abaixo) e respondendo a sua dúvida sobre a execução de método você concorda que o método testaLogin é executado antes do container renderizar a página? se concorda o mesmo ocorre com a execução do método redireciona que recebe o response e por isso que pedi para que você mudar a implementação já que depois de executar o método testaLogin o redireciona é executado e automaticamente o container redireciona para a pagina index de sua app.

exemplo
<a href="contextoAPP/index.jsp">Voltar</a>

Att
Robson
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Então acho que não entendi direito.

Em,

<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />


TestaLoginAdmin é uma classe que contem o método testaLogin();

O método em si não deve ser executado até que seja chamado. Certo? Então, o método só está sendo chamado no caso em que o admin é nuill. Se o admin nao for null, o método não é chamado.

Não entendi porque esta rodando.

No meu entender, o simples fato de o método estar escrito dentro da classe, não faz com que ele rode não! faz?

Veja:
<c:choose>
  <c:when test="${admin != null}">          
            Olá ${admin.nome}
          <c:set var="tipo" value="${admin.tipo}" />
          <c:choose>
            <c:when test="${tipo=='s'}">          
              <style>#super{display:block;}</style>
              <style>#comum{display:none;}</style>
            </c:when>
          </c:choose>
          <c:choose>
            <c:when test="${tipo=='c'}">          
              <style>#super{display:none;}</style>
              <style>#comum{display:bloq;}</style>
            </c:when>
          </c:choose>
  </c:when>
  <c:otherwise>
             $
    </c:otherwise>
</c:choose>

Outra coisa, e a dúvida sobre qual forma escolher? Validação no próprio jsp ou criar a classe para isso?

Outra coisa: Como você implementaria então o método redireciona lá na classe? Só consigo fazer daquela forma!

Grato pelo apoio que esta me dando!
GOSTEI 0
Robson Teixeira

Robson Teixeira

19/07/2015

Boa Tarde,
Observe o codigo abaixo já apresentado.
  <jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />
  <c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />
<c:set var="redireciona" value="${validaAdmin.redireciona(pageContext.response)}" />


Quando o container executar a linha 2 o método testaLogin é executado e após sua execução o retorno é armazenado na variavel admin e essa execução é feita antes de renderizar a sua pagina e o mesmo vale para a linha 3 causando o redirecionamento da pagina antes mesmo de exibir o seu conteúdo é isso ocorre independente se o usuário estiver logado ou não.

Quando ao redirecionar eu criaria uma classe com a estrutura abaixo.
public class Redirecionador {
    private HttpServletResponse response;
    private String pagina;

    public Redirecionador(HttpServletResponse response, String pagina) {
        this.response = response;
        this.pagina = pagina;
    }
    
    public void redirecione() throws IOException{
        response.sendRedirect(pagina);
    }
}


e no método redireciona da classe TestaLoginAdmin eu faria da seguinte forma

 
  public Redirecionador redireciona(HttpServletResponse response) throws ServletException, IOException {        
        return new Redirecionador(response, "index.jsp");
    }


e na jsp ficaria assim


<jsp:useBean id="validaAdmin" class="dao.admin.TestaLoginAdmin" />
<c:set var="admin" value="${validaAdmin.testaLogin(pageContext.request)}" />
<c:set var="redirecidor" value="${validaAdmin.redireciona(pageContext.response)}" />
<c:choose>
  <c:when test="${admin != null}">          
            Olá ${admin.nome}
          <c:set var="tipo" value="${admin.tipo}" />
          <c:choose>
            <c:when test="${tipo=='s'}">          
              <style>#super{display:block;}</style>
              <style>#comum{display:none;}</style>
            </c:when>
          </c:choose>
          <c:choose>
            <c:when test="${tipo=='c'}">          
              <style>#super{display:none;}</style>
              <style>#comum{display:bloq;}</style>
            </c:when>
          </c:choose>
  </c:when>
  <c:otherwise>
             ${redirecidor.redirecione}
    </c:otherwise>
</c:choose>


As alterações que apresentei acima são para que sua app se comporte do jeito que você queria.
Eu particularmente criaria um filtro e esse filtro fica com a responsabilidade de veririficar se o usuario está logado e caso esteja eu deixaria a requisição continuar normalmente e caso não esteja eu redirecionaria a requisição para a pagina inicial da aplicação.

Att
Robson
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Seria algo do tipo:
package filtro;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter("/admin/*")
public class AdminFilter implements Filter 
{
    private static List<String> allowedURIs;
    
    public AdminFilter() 
    {
        // TODO Auto-generated constructor stub
    }

	public void destroy() 
	{
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    {         
	       HttpServletRequest req = (HttpServletRequest) request;  
	       HttpServletResponse res = (HttpServletResponse) response;  
	       HttpSession sessao= req.getSession();  
	       
           if(
        		   sessao.getAttribute("admin")!= null || 
        		   precisaDireitoAcessoURI(req.getRequestURI()) || 
        		   req.getRequestURI().equals("/imwsaogotardo/admin/") || 
        		   req.getRequestURI().equals("/imwsaogotardo/admin")
        	 )
           {
               chain.doFilter( request, response );
           }
           else
           {    
               res.sendRedirect("index.jsp");  
           }    	       
    }

	public void init(FilterConfig fConfig) throws ServletException 
    {
        if(allowedURIs == null)
        {
            allowedURIs = new ArrayList<String>();
            allowedURIs.add("/imwsaogotardo/admin/index.jsp");
            allowedURIs.add("/imwsaogotardo/admin/retornos/");
        }
    }
	
	public boolean precisaDireitoAcessoURI(String uriAtual) 
	{

	    for (String uri: allowedURIs) 
	    {
	        if (uriAtual.contains(uri))
	            return true;
	    }
	 
	    return false;
	}	
}

??
GOSTEI 0
Robson Teixeira

Robson Teixeira

19/07/2015

Bom Dia,
Sim seria algo desse tipo.
GOSTEI 0
Carlos Rocha

Carlos Rocha

19/07/2015

Bom, não sei se seria pedir muito mas estou estudando java web pois acabei a faculdade e gostaria de orientação sobre padrão de projeto ou coisa do tipo.

Estou deixando uma cópia do meu projeto com as devidas alterações para download em:

Projeto

http://www.funerariasaopedro.net.br/imwsaogotardo.zip

E gostaria de saber se daria para você passar o olho e me indicar algum erro grosseiro que acha que eu devo mudar!

A ideia é uma página principal e um sistema de fórum de duvidas igual a este mas direcionado tipo uma escola.

Que tem classes e professores e usuários.

Esta aproximadamente 20% concluído. Mas gostaria de eliminar erros de padrão de projeto já desde o inicio.

Estou apanhando muito mas aprendendo muita coisa também!

Esta tudo funcionando. Erros mesmo não tem. Apenas orientação de padrão ou forma mais digamos "profissional" de trabalhar.

Desde já agradeço o apoio!
GOSTEI 0
POSTAR