Bom dia pessoal.
Minha dúvida é a seguinte: estou fazendo um sistema de login em java, que busca um usuario e senha no banco de dados e os direciona para determinadas páginas, dependendo do seu nível de acesso. Até aqui tudo bem.
Estou tendo problemas na questão de segurança do acesso das jsp's. Qualquer pessoa pode digitar a URL das páginas jsp's (inclusive paginas administrativas) e acessa-las. Pesquisei muito na internet sobre isso, e vi várias formas de fazer, inclusive usando filtros, usando o PhaseListener, usando o Realm. Mas, a forma mais simples que eu vi (pra mim), foi colocando as jsp's dentro da pasta WEB-INF. Eu fiz isso e realmente funcionou. O problema, é que tem q mudar os caminhos dentro da jsp para acessar o banco e as outras jsp's. Quando eu faço isso, a minha jsp mainpage fica em branco no navegador. Olha como estao os meus jsp's e os xml's.
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<f:view>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sistema de Login</title>
</head>
<body>
<f:loadBundle basename="messages" var="msgs" />
<h:form id="login_form">
<h:panelGrid columns="2" id="login_panel">
<f:facet name="header">
<h:outputText value="Login" />
</f:facet>
<f:facet name="footer">
<h:commandButton value="Logar" action="#{LoginHandler.login}"/>
</f:facet>
<!--campo usuario-->
<h:outputLabel for="usuario">
<h:outputText value="Usuario"/>
</h:outputLabel>
<h:inputText value="#{LoginHandler.LO.usuario}" id="usuario" />
<!--campo senha-->
<h:outputLabel for="password">
<h:outputText value="password"/>
</h:outputLabel>
<h:inputSecret value="#{LoginHandler.LO.password}" id="password" />
</h:panelGrid>
</h:form>
</body>
</f:view>
</html>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sistema de contas a pagar</title>
</head>
<body>
<f:view>
<f:loadBundle basename="messages" var="msgs" />
<h:outputText value="#{msgs['bemvindo']} " />
<h:outputText value="#{usuarioHandler.usuario.nome}" />!<br />
<rich:tabPanel>
<rich:tab label="Fornecedores">
<h:form id="Cadastro">
<h:outputText value="#{msgs['fornecedor-nome']}" />
<br />
<h:inputText id="nome" required="true"
value="#{fornecedorHandler.fornecedor.nome}"
validator="#{fornecedorHandler.validaCase}">
<f:validateLength minimum="5" />
</h:inputText>
<h:message for="nome" style="color: darkred" />
<br />
<h:outputText value="#{msgs['fornecedor-descricao']}" />
<br />
<h:inputTextarea id="descricao"
value="#{fornecedorHandler.fornecedor.descricao}" />
<h:message for="descricao" style="color: darkred" />
<br />
<h:commandButton value="Salvar" action="#{fornecedorHandler.salva}" />
</h:form>
<rich:spacer height="10"/>
<rich:separator height="1" lineType="dotted"/>
<rich:spacer height="10"/>
<jsp:include page="lista.jsp" />
</rich:tab>
<rich:tab label="Contas a Pagar">
<jsp:include page="contas.jsp"/>
</rich:tab>
</rich:tabPanel>
</f:view>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Contas a pagar</title>
</head>
<body>
<f:subview id="contas">
<h:form>
<h:panelGrid>
<h:outputText value="Fornecedor"/>
<h:selectOneMenu binding="#{contaPagarHandler.fornecedorSelecionado}">
<f:selectItem itemValue="0" itemLabel="Selecione Fornecedor"/>
<f:selectItems value="#{contaPagarHandler.fornecedoresParaComboBox}" />
</h:selectOneMenu>
<h:outputText value="Descrição"/>
<h:inputText value="#{contaPagarHandler.contaPagar.descricao}"/>
<h:outputText value="Data de pagamento"/>
<rich:calendar value="#{contaPagarHandler.contaPagar.data.time}"/>
<h:outputText value="Valor"/>
<h:inputText value="#{contaPagarHandler.contaPagar.valor}"/>
<h:selectBooleanCheckbox value="#{contaPagarHandler.contaPagar.pago}">
<h:outputText value="Pago? "/></h:selectBooleanCheckbox>
<h:messages/>
<h:commandButton actionListener="#{contaPagarHandler.salva}" value="gravar"/>
<rich:dataList value="#{contaPagarHandler.contas}" var="conta">
<h:outputText value="#{conta.descricao}"/>
<h:outputText value=" - "/>
<h:outputText value="#{conta.fornecedor.nome}"/>
</rich:dataList>
</h:panelGrid>
</h:form>
</f:subview>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>lista</title>
</head>
<body>
<f:subview id="lista">
<h:form>
<rich:dataTable value="#{fornecedorHandler.fornecedores}" var="f" rendered="#{not empty fornecedorHandler.fornecedores}" rows="5" id="fornecedores">
<h:column>
<f:facet name="header">
<h:outputText value="Id"/>
</f:facet>
<h:outputText value="#{f.id}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome"/>
</f:facet>
<h:outputText value="#{f.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Descrição"/>
</f:facet>
<h:outputText value="#{f.descricao}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Alterar"/>
</f:facet>
<h:commandLink actionListener="#{fornecedorHandler.escolheFornecedor}">
<h:outputText value="(alterar)"/>
<f:param id="editId" name="id" value="#{f.id}"/>
</h:commandLink>
</h:column>
<%--Rodape com o paginador--%>
<f:facet name="footer">
<rich:datascroller/>
</f:facet>
</rich:dataTable>
</h:form>
</f:subview>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
id="Contas_A_Pagar" version="2.5">
<display-name>projetojsf</display-name>
<!-- Arquivos que sao acessados quando / eh acessada -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm </welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>olajsf.jsp</welcome-file>
</welcome-file-list>
<!-- Define a skin do richfaces. Ha varias opcoes -->
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<!--<param-value>.xhtml</param-value> -->
<!--<param-value>DEFAULT</param-value>-->
<!--<param-value>plain</param-value>-->
<!--<param-value>emeraldTown</param-value>-->
<param-value>blueSky</param-value>
<!-- <param-value>wine</param-value>-->
<!-- <param-value>japanCherry</param-value>-->
<!--<param-value>ruby</param-value>-->
<!--<param-value>classic</param-value>-->
<!-- <param-value>deepMarine</param-value>-->
</context-param>
<!-- Configura onde salvar o estado dos componentes. O padrao é server -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<!-- Configura o filtro obrigatorio do Ajax4Jsf -->
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
<filter-name>HibernateSessionFilter</filter-name>
<filter-class>br.com.caelum.fj26.util.HibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Configura a servlet do JSF. -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<application>
<message-bundle>messages</message-bundle>
<locale-config>
<default-locale>pt</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
</application>
<managed-bean>
<managed-bean-name>LoginHandler</managed-bean-name>
<managed-bean-class>br.com.caelum.fj26.LoginHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>fornecedorHandler</managed-bean-name>
<managed-bean-class>br.com.caelum.fj26.FornecedorHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>contaPagarHandler</managed-bean-name>
<managed-bean-class>br.com.caelum.fj26.ContaPagarHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>usuarioHandler</managed-bean-name>
<managed-bean-class>br.com.caelum.fj26.UsuarioHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/olajsf.jsp</from-view-id>
<navigation-case>
<from-outcome>ok</from-outcome>
<to-view-id>/WEB-INF/jsp/mainpage.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/olajsf.jsp</from-view-id>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/admin.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/olajsf.jsp</from-view-id>
<navigation-case>
<from-outcome>erro</from-outcome>
<to-view-id>/olajsf.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!-- <navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>loginPage</from-outcome>
<to-view-id>/olajsf.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<lifecycle>
<phase-listener>br.com.caelum.fj26.util.AuthorizationListener</phase-listener>
</lifecycle> -->
</faces-config>
A pagina de login (olajsf.jsf) diretamente dentro da WebContent, já as paginas mainpage, contas e lista estão dentro de WebContent/WEB-INF/jsp.
A mainpage.jsp chama através de um rich:tab as paginas contas e lista. Se eu nao modificar os endereços, ela abre normal, mas quando eu salvo um cadastro ou clico na aba de contas, ela dá um erro que nao encontra a pagina. Se eu modificar na linha por exemplo:
<jsp:include page="contas.jsp"/>
<!-- modificar para-->
<jsp:include page="WebContent/WEB-INF/jsp/contas.jsp"/>
ele abre a página, só que toda em branco.
E ae pessoal, alguem tem alguma dica do que eu posso estar fazendo errado?? Sou iniciante no java, e pelo que eu vi, esse é o método mais simples pra implementar essa segurança.
Desde já agradeço a todos.