Controle de acesso com filtros
Aprenda neste artigo, como fazer o controle de acesso utilizando filtros da API Servlet.
Na maioria dos sistemas web é necessário o controle de acesso a algumas áreas da aplicação. O objetivo desse artigo é justamente mostrar uma forma simples de fazer esse controle, utilizando os filtros da API Servlet.
Faremos uma aplicação simples com um formulário de login e uma pagina jsp protegida, vejamos abaixo.
Banco de dados
Criaremos primeiramente um banco de dados, com uma tabela usuarios, onde serão cadastrados os usuários da nossa aplicação. Nesse exemplo utilizaremos o banco de dados MySQL, execute o seguinte script no console do MySQL:
CREATE DATABASE javamagazine1;
USE javamagazine1;
CREATE TABLE usuarios (
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 usuarios (nome, login, senha) VALUES ('Administrador', 'admin', '1234');
Estrutura básica
Criaremos também as pastas básicas da aplicação com a seguinte estrutura, dentro da pasta webapps do Tomcat:
O Usuário
Um usuário do banco de dados será representado por um objeto da classe Usuario, crie ela no pacote br.com.javamagazine.jairelton1:
package br.com.javamagazine.jairelton1;
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;
}
}
JSP’s
Dentro da pasta admin criaremos uma pagina JSP chamada index.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">
<title>Logado</title>
</head>
<body>
<h3>Olá <%=((br.com.javamagazine.jairelton1.Usuario)session.getAttribute("usuario")).getNome() %>, você está logado no sistema!</h3>
</body>
</html>
Dentro da pasta webapps/JavaMagazine 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">
<title>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 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>
Servlet
Será necessário também um Servlet que se conecte com o banco de dados e verifique os dados digitados, então criaremos um:
package br.com.javamagazine.jairelton1;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Logar extends javax.servlet.http.HttpServlet{
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
Connection conexao = null;
PreparedStatement stmt = null;
ResultSet res = null;
try{
String login = request.getParameter("login");
String senha = request.getParameter("senha");
Class.forName("com.mysql.jdbc.Driver");
conexao = DriverManager.getConnection("jdbc:mysql://localhost/javamagazine1", "root", "senha");
stmt = conexao.prepareStatement("SELECT * FROM usuarios WHERE login=?");
stmt.setString(1, login);
res = stmt.executeQuery();
Usuario usuario = null;
if(res.first()){
usuario = new Usuario();
usuario.setId(res.getInt("id"));
usuario.setNome(res.getString("nome"));
usuario.setLogin(res.getString("login"));
usuario.setSenha(res.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/index.jsp");
}
}catch(Exception e){
throw new ServletException(e);
}finally{
try{
res.close();
stmt.close();
conexao.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
Configuração
Agora vamos configurar o arquivo web.xml (webapps/JavaMagazine/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>JavaMagazine1</display-name>
<servlet>
<description></description>
<display-name>Logar</display-name>
<servlet-name>Logar</servlet-name>
<servlet-class>br.com.javamagazine.jairelton1.Logar</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Logar</servlet-name>
<url-pattern>/Logar</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Teste
A aplicação já deve funcionar agora, compile as classes e execute no browser, http://localhost:8080/javamagazine/, será exibida a tela de login, ao digitar o login “admin” e senha “1234” será exibida a tela protegida adequadamente, mas verifique que mesmo sem logar a pagina jsp admin/index.jsp pode ser visualizada, isso porque ainda não definimos nenhuma restrição para isso.
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.
Utilizaremos eles hoje para interceptar as chamadas para os Servlet’s e 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.com.javamagazine.jairelton1;
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.com.javamagazine.jairelton1.FiltroSeguranca</filter-class>
</filter>
<filter-mapping>
<filter-name>Filtro Seguranca</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
Finalizando
Acesse novamente o endereço http://localhost:8080/JavaMagazine1/admin/index.jsp, dessa vez não será possível acessar a página sem antes logar.
O processo
Ao fazer uma requisição a /admin/index.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. E eis que surge nosso sistema de login.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo