Baixe o app para aproveitar ainda mais
Prévia do material em texto
Filtro em JSP O objetivo deste exercício é mostrar uma forma simples de fazer o controle, utilizando os filtros da API Servlet. Faremos uma aplicação simples com um formulário de login e uma pagina jsp protegida, a seguir. 1. Banco de dados (MySQL) Criaremos primeiramente um banco de dados, com uma tabela usuário, onde serão cadastrados os usuários da nossa aplicação. Utilizaremos o banco de dados MySQL, execute o seguinte script no console do MySQL: CREATE DATABASE Livraria; USE livraria; CREATE TABLE usuario ( id INT(11) NOT NULL auto_increment, nome varchar(100) DEFAULT NULL, login varchar(50) DEFAULT NULL, senha varchar(50) DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO usuario (nome, login, senha) VALUES ('Administrador', 'admin', '1234'); INSERT INTO usuario (nome, login, senha) VALUES ('Jorge', 'professor', '2m12'); 2. Estrutura básica da aplicação Criaremos também as pastas básicas da aplicação com a seguinte estrutura, dentro da pasta da aplicação WebFilterJSP, como mostrado na figura acima. 3. O Usuário Um usuário do banco de dados será representado por um objeto da classe Usuario, crie o objeto no pacote br.ufrj.cos.zavaleta.model: package br.ufrj.cos.zavaleta.model; import java.io.Serializable; public class Usuario implements Serializable{ private int id; private String nome; private String login; private String senha; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getSenha() { return senha; } public void setSenha(String senha) { this.senha = senha; } } 4. JSP Dentro da pasta admin criaremos uma pagina JSP chamada de logado.jsp, que será protegida por senha, o código dela é mostrado abaixo: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-// W3C/ /DTD HTML 4.01 Transitional/ /EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <tit le>Logado</ title> </head> <body> <h3>Olá <%=((br.ufrj.cos.zavaleta.model.Usuarios)session.getAttribute("usuario")).getNome() %>, você está logado no sistema!</h3> </body> </html> Dentro da pasta WebFilterJSP/Paginas_Web criaremos um arquivo index.jsp que será o formulário de login, o código é o seguinte: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-// W3C/ /DTD HTML 4.01 Transitional/ /EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <tit le>Login</ title> <style type="text/css"> *{ font-family: Verdana, Arial; } table{ background-color: #EEEEEE; border: solid #CCCCCC 1px; } th{ background-color: #CCCCCC; color: #FFFFFF; } .campo{ border: solid #CCCCCC 1px; } </style> </head> <body> <form method="POST" action="Logar"> <table> <tr> <th colspan="2">Login</th> </ tr> <tr> <td>Login: </td> <td><input class="campo" type="text" name="login" /></ td> </ tr> <tr> <td>Senha: </ td> <td><input class="campo" type="password" name="senha" /></ td> </ tr><% String[] erros = {"Usuario ou senha incorretos!", "Você não está logado!"}; String erro = request.getParameter("erro"); if(erro!=null){%> <tr> <td style="color: #FF0000" colspan="2"><%=erros[Integer.parseInt(erro)-1] %></ td> </ tr> <% } %> <tr> <td colspan="2" align="center"><input type="submit" value="Entrar" /></td> </ tr> </ table> </ form> </body> </html> 5. O Servlet Será necessário também criar um Servlet chamado de Logar.java que se conecte com o banco de dados e verifique os dados digitados, então criaremos um: package br.ufrj.cos.zavaleta.controller; import java.io.IOException; import java.sql.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Logar extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ String login = request.getParameter("login"); String senha = request.getParameter("senha"); Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/livraria", "root", "root2m12"); st = conn.prepareStatement("SELECT * FROM usuario WHERE login=?"); st.setString(1, login); rs = st.executeQuery(); //define usuario Usuario usuario = null; if(rs.first()){ usuario = new Usuario(); usuario.setId(rs.getInt("id")); usuario.setNome(rs.getString("nome")); usuario.setLogin(rs.getString("login")); usuario.setSenha(rs.getString("senha")); } if(usuario==null||!usuario.getSenha().equals(senha)){ request.getSession().setAttribute("msg", "Login ou senha incorretos!"); response.sendRedirect("index.jsp"); }else{ request.getSession().setAttribute("usuario", usuario); response.sendRedirect("admin/logado.jsp"); } }catch(Exception e){ throw new ServletException(e); }finally{ try{ rs.close(); st.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); } } } } 6. Configuração Agora vamos configurar o arquivo web.xml (../WEB-INF/web.xml), declare o Servlet como abaixo: <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns=http:/ / java.sun.com/xml/ns/ j2ee xmlns:xsi="http:/ /www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/ / java.sun.com/xml/ns/ j2ee http:/ / java.sun.com/xml/ns/ j2ee/web- app_2_4.xsd"> <display-name>WebFilterJSP</display-name> <servlet> <servlet-name>Logar</servlet-name> <servlet-class>br.ufrj.cos.zavaleta.controller.Logar</servlet-class> </servlet> <servlet-mapping> <servlet-name>Logar</servlet-name> <url-pattern>/Logar</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 7. Teste A aplicação já deve funcionar agora, compile as classes e execute no browser, http://localhost:8084/WbFilterJSP/, será exibida a tela de login, ao digitar o login “admin” e senha “1234” será exibida a tela de “logado” do sistema principal, mas verifique que mesmo sem logar a pagina jsp logado.jsp pode ser visualizada, isso porque ainda não definimos nenhuma restrição para isso. 8. O filtro Os filtros da API servlet são responsáveis por interceptar a chamada a certo recurso, fazer algum processamento e liberá-la ou não. Usaremos um filtro para interceptar as chamadas para os Servlet’se JSP’s de uma área restrita de nossa aplicação, a área será definida pelo prefixo /admin (a pasta admin criada acima), nesse caso seria uma área de administração, por exemplo, com conteúdo restrito. package br.ufrj.cos.zavaleta; import java.io.IOException; 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.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class FiltroSeguranca implements Filter { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpSession session = ((HttpServletRequest)req).getSession(); Usuario usuario = (Usuario)session.getAttribute("usuario"); if(usuario==null){ session.setAttribute("msg","Você não está logado no sistema!"); ((HttpServletResponse)res).sendRedirect("../index.jsp"); }else{ chain.doFilter(req, res); } } public void destroy() { } } Edite o arquivo web.xml e adicione as seguintes linhas abaixo de </welcome-file-list> <filter> <filter-name>Filtro Seguranca</filter-name> <filter-class>br.ufrj.cos.zavaleta.controller.FiltroSeguranca</filter-class> </filter> <filter-mapping> <filter-name>Filtro Seguranca</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping> 9. Finalizando Acesse novamente o endereço http://localhost:8084/WenFilterJSP/admin/logado.jsp, dessa vez não será possível acessar a página sem antes logar. 10. O processo Ao fazer uma requisição a /admin/logado.jsp o pattern bate com o configurado no filter- mapping, assim é chamado primeiramente o filtro, no método doFilter() é verificada a existência do atribute “usuario” na sessão, caso exista é porque o usuário está logado, então o método doChain() libera a execução do Servlet, caso o atributo seja nulo, o usuário é redirecionado para a pagina de login, e o Servlet (JSP) sequer é executado. Jorge J Zavaleta zavaleta@cos.ufrj.br
Compartilhar