Protegendo as páginas JSP com Filter

5 respostas
D

Boa tarde pessoal,

Estou com dúvidas em relação a restrição do bloqueio das páginas .jsp da minha aplicação.

Criei um Filter para validar o acesso nas demais páginas, porém quando eu digito na URL alguma página que só pode ser acessada via login válido o mesmo consegue acesso.

Alguém saberia ou teria alguma idéia de como fazer esse tipo de restrição?

Desde já agradeço!

5 Respostas

G

Passos:

  1. Crie um formulário de login.
  2. Pegue os dados do formulário, autentique o usuario e coloque-o em sessão.
  3. Crie o filtro verificando se existe um usuário logado e se não existir lance uma exceção ou um HTTP STATUS para acesso negado.
  4. Mapeie o filtro no contexto protegido.

Algo assim:
2.

String login = request.getParameter("login");
Usuario usuario = acharUsuario(login);
if(usuario != null && usuario.getSenha().equals(request.getParameter("senha")){
  request.getSession().setAttribute("usuario_logado", usuario);
}
... doFilter(... {
  HttpServletRequest request = (HttpServletRequest) arg0;
  HttpServletResponse response = (HttpServletResponse) arg1;
  Usuario usuario = (Usuario) request.getSession().getAttribute("usuario_logado");

  if(usuario == null){
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  }
  // ...
}
  1. web.xml:
<filter>
		<filter-name>usuarioLogado</filter-name>
		<filter-class>...</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>usuarioLogado</filter-name>
		<url-pattern>/contexto/restrito/*</url-pattern>
	</filter-mapping>
D

Boa noite Guilherme,

Desde já agradeço a preciosa ajuda, mas seguindo seus conselhos e fazendo do jeito que você postou, eu ainda continuo acessando os jsps restritos.

Vou postar o código para que caso esteja errado e vc ou alguém puder me dar uma força :slight_smile:

package com.cadastro;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Cadastro extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private String nome;
	private String email;
	private String login;
	private String senha;
	private Long id;

	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;

	public Cadastro() {
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws IOException, ServletException {

		response.setContentType("text/html;charset=UTF-8");

		PrintWriter out = response.getWriter();
		String nome = request.getParameter("nome");
		String email = request.getParameter("email");
		String login = request.getParameter("login");
		String senha = request.getParameter("senha");
		String senha2 = request.getParameter("senha2");
		
		if (senha.equals(senha2)) {
			try {
				Class.forName("com.mysql.jdbc.Driver");
				con = DriverManager.getConnection(
						"jdbc:mysql://localhost/e_learning", "root", "root");
				stmt = con
						.prepareStatement("insert into cadastro (nome,email,login,senha)values(?,?,?,?)");
				stmt.setString(1, nome);
				stmt.setString(2, email);
				stmt.setString(3, login);
				stmt.setString(4, senha);
				stmt.execute();
				stmt.close();

				response.sendRedirect("index.jsp");
			} catch (Exception e) {
				out.print(e.getMessage());
			}
		}
	}

}
package com.filtro;

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 com.login.Login;

public class Filtro implements Filter {

	// String page = "index.jsp";

	public void init(FilterConfig filterConfig) throws ServletException {
		// if (filterConfig.getInitParameter("page") != null) {
		// page = filterConfig.getInitParameter("page");
		// }
	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {

		try {

			HttpServletRequest request = (HttpServletRequest) req;
			HttpServletResponse response = (HttpServletResponse)resp;
			//HttpSession session = request.getSession();

			Login login =  (Login) request.getSession().getAttribute("login");
			// Object login = session.getAttribute("login");
			// RequestDispatcher dispatcher = null;

			if (login == null) {

				response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
				/*
				 * Caso a pagina requisitada nao seja a pagina index, o usuario
				 * vai ser redirecionado para a index
				 * 
				 * if (!request.getRequestURI().equals(
				 * "/E_Learning/faces/index.jsp")) { dispatcher =
				 * req.getRequestDispatcher("../../index.jsp");
				 * dispatcher.forward(req, response); } else {
				 * chain.doFilter(req, response); }
				 */

			} else {
				chain.doFilter(req, resp);
				// dispatcher =
				// req.getRequestDispatcher(request.getRequestURI());
				// dispatcher =
				// req.getRequestDispatcher(StringUtils.removeStart(
				// request.getRequestURI(), "pages/logado.jsp"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void destroy() {
	}

}
package com.login;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Login extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private String login;
	private String senha;

	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;

	public Login() {
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");

		try {

			String login = request.getParameter("login");
			String senha = request.getParameter("senha");

			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost/e_learning", "root", "root");
			stmt = con
					.prepareStatement("select login,senha from cadastro where login=? and senha=?");
			stmt.setString(1, login);
			stmt.setString(2, senha);
			rs = stmt.executeQuery();

			if (rs.next()) {
				request.getSession().setAttribute("login", login);
				response.sendRedirect("pages/logado.jsp");

				/*
				 * HttpSession session = (HttpSession) FacesContext
				 * .getCurrentInstance().getExternalContext().getSession(
				 * false); session.setAttribute("login", login);
				 * response.sendRedirect("pages/logado.jsp");
				 */

			} else {
				//response.sendRedirect("../../index.jsp");
				response.sendRedirect("index.jsp");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
<?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>E_Learning</display-name>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet>
		<servlet-name>Cadastro</servlet-name>
		<servlet-class>com.cadastro.Cadastro</servlet-class>
	</servlet>

	<servlet>
		<servlet-name>Login</servlet-name>
		<servlet-class>com.login.Login</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
	
	<servlet-mapping>
		<servlet-name>Cadastro</servlet-name>
		<url-pattern>/Cadastro</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>Login</servlet-name>
		<url-pattern>/Login</url-pattern>
	</servlet-mapping>


	<session-config>
		<session-timeout>17</session-timeout>
	</session-config>

	<listener>
		<listener-class>
			org.apache.myfaces.webapp.StartupServletContextListener
		</listener-class>
	</listener>

	<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-list>
	
	<filter>
		<filter-name>Filtro</filter-name>
		<filter-class>com.filtro.Filtro</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>Filtro</filter-name>
		<url-pattern>/pages/*</url-pattern>
	</filter-mapping>	
	
</web-app>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Bem-vindo ao portal LOGICPROG</title>
<link href="pages/css/estilo.css" rel="stylesheet" type="text/css" />
</head>
<body>
	<div align="center">
		<table width="886" border="2" bordercolor="#999999" bgcolor="#003366">
			<tr bordercolor="#999999" bgcolor="#003366">
				<td width="874">
					<div align="center"><img src="pages/images/topo/topo1.jpg"
							width="226" height="206" /><img src="pages/images/topo/topo2.jpg"
							width="191" height="206" /><img src="pages/images/topo/topo3.jpg"
							width="208" height="206" /><img src="pages/images/topo/topo4.jpg"
							width="145" height="206" />
					</div>
				 </td>
			</tr>
			<tr bordercolor="#999999">
				<td>
					<div align="center"><img src="pages/images/menu/menu1.jpg"
							width="119" height="75" border="0" usemap="#Map5" /><img
							src="pages/images/menu/menu2.jpg" width="237" height="75" border="0"
							usemap="#Map" /><img src="pages/images/menu/menu3.jpg" width="150"
							height="75" border="0" usemap="#Map2" /><img
							src="pages/images/menu/menu4.jpg" width="98" height="75" border="0"
							usemap="#Map3" /><img src="pages/images/menu/menu5.jpg" width="126"
							height="75" border="0" usemap="#Map4" /> 
								<map name="Map4" id="Map4">
									<area shape="rect" coords="5,24,89,56" a
										href="mailto:[email removido]" target="_parent" />
								</map>
					</div>
				</td>
			</tr>
			<tr bordercolor="#999999">
				<td height="218">
					<div align="center">
						<table width="805" height="558" bordercolor="#003366">
							<tr bordercolor="#999999">
								<td width="484" height="552">
									<table width="400">
										<tr>
											<td>
												<div align="left"><img src="pages/images/topicos/topico_home.png"
														width="349" height="30" />
												</div>
											</td>
										</tr>
										<tr>
											<td height="104">
												<h3>LOGICPROG</h3>
												<p>No portal voc&ecirc; obter&aacute; os conhecimentos
													necess&aacute;rios para embarcar no mundo da l&oacute;gica de
													programa&ccedil;&atilde;o, estando apto a desenvolver algoritmos
													e c&oacute;digo para programas. Al&eacute;m disso voc&ecirc;
													contar&aacute; com o material de apoio para download que pode ser
													feito no pr&oacute;prio site.<br />
												</p>
											</td>
										</tr>
									</table>
									<table width="400">
										<tr>
											<td height="29">
												<h1><img src="pages/images/topicos/topico_logica.png" width="302" height="30" /></h1>
											</td>
										</tr>
										<tr>
											<td height="101">
												<p>Consiste no uso correto das leis de pensamento, da ordem
												&ldquo;ordem da raz&atilde;o&rdquo; e de processos de
												racioc&iacute;nio e simboliza&ccedil;&atilde;o formais na
												programa&ccedil;&atilde;o de computadores, objetivando
												racionalidade e o desenvolvimento de t&eacute;cnicas que cooperem
												para a produ&ccedil;&atilde;o de solu&ccedil;&otilde;es
												logicamente v&aacute;lidas e coerentes, que resolvam com
												qualidade os problemas que desejamos programar.</p>
											</td>
										</tr>
									</table>
									<table width="400">
										<tr>
											<td>
												<h1 align="left"><img src="pages/images/topicos/topico_aula.png" width="289" height="30" /></h1>
											</td>
										</tr>
										<tr>
											<td height="41">
												<p>Aprimore seus conhecimentos atr&aacute;ves das video-aulas
												disponibilizadas. Confira as video-aulas no link
												"Video-Aula". <br />
												</p>
											</td>
										</tr>
									</table>
									<table width="400">
										<tr>
											<td>
												<h1><img src="pages/images/topicos/topico_arquivos.png"	width="291" height="30" /></h1>
											</td>
										</tr>
										<tr>
											<td height="30">
												<p>Confira o material dispon&iacute;vel no link
													"Arquivos".
												</p>
											</td>
										</tr>
									</table>
								</td>
								<td width="309">
									<div align="center">
										<table width="316" height="544" align="center">
											<tr bordercolor="#999999">
												<td width="308" height="210" bordercolor="#999999">
													<h3 align="center">Seja bem vindo acesse o Portal</h3>
													<form method="post" name="login" action="Login">
														<ul id="login">
															<div align="center">
																<table>
																	<tr>
																		<td>					
																			<h6>Login:</h6>
																		</td>
																		<td>
																			<input type=text name=login value="" size="15"/>
																		</td>
																	</tr>
																	<tr>	
																		<td>
																			<h6>Senha:</h6>
																		</td>	
																		<td>
																			<input type=password name=senha value="" size="15"/>
																		</td>
																	</tr>
																	<tr>
																		<td>
																			<input type="submit" name="controle" value="Logar"/>
																		</td>
																	</tr>	
																</table>
															</div>
															<h6 align="center"><a href="cadastro.jsp">Cadastre-se</a></h6>
														</ul>
													</form>
												</td>
											</tr>
											<tr bordercolor="#999999">
												<td height="326">
													<table width="447" height="179">
														<tr>
															<td width="167" height="173">
																<h2><img src="pages/images/images.jpg" width="130" height="127" /></h2>
														    </td>
															<td width="268">
																<table width="118" height="171">
																	<tr>
																		<td width="110" height="32">
																			<div align="right"><img
																					src="pages/images/topicos/topico_links.png" width="110"
																					height="30" />
																			</div>
																		</td>
																	</tr>
																	<tr>
																		<td height="131">
																			<ul>
																				<h6 align="left">
																					<li type="square"><a href="http://www.google.com" target="_blank">Google</a></li>
																	     		</h6>
																				<h6 align="left">
																					<li type="square"><a href="http://www.mysql.com" target="_blank">MySQL</a></li>
																				</h6>
																				<h6 align="left">
																					<li type="square"><a href="http://www.eclipse.org/" target="_blank">Eclipse</a></li>
																				</h6>
																				<h6 align="left">
																					<li type="square"><a href="http://www.guj.com.br" target="_blank">Java</a></li>
																				</h6>
																			</ul>
																		 </td>
																	</tr>
																</table>
															</td>
														</tr>
													</table>
												</td>
											</tr>
										</table>
									</div>
								</td>
							</tr>
						</table>
						<table width="874" bordercolor="#999999">
							<tr>
								<td width="866" bordercolor="#FFFFFF">
									<p align="center">Designed&copy;BoneMasters 2009- Todos os
										direitos reservados
									</p>
								</td>
							</tr>
						</table>
					</div>
				</td>
			</tr>
			<tr>
				<td>
					<div align="center"><img src="pages/images/rodape/rodape.jpg"
						width="770" height="64" align="bottom" />
					</div>
				</td>
			</tr>
	    </table>
	</div>

			<map name="Map" id="Map">
				<area shape="rect" coords="-5,21,212,54" href="index.jsp"
					target="_parent" />
			</map>
			<map name="Map2" id="Map2">
				<area shape="rect" coords="2,22,106,55" href="index.jsp"
					target="_parent" />
			</map>
			<map name="Map3" id="Map3">
				<area shape="rect" coords="0,22,80,55" href="index.jsp"
					target="_parent" />
			</map>
			<map name="Map5" id="Map5">
				<area shape="rect" coords="11,22,91,54" href="index.jsp"
					target="_parent" />
			</map>
	</body>
</html>

Desde já vlw!!

K
Guilherme Gomes:
Passos: 1. Crie um formulário de login. 2. Pegue os dados do formulário, autentique o usuario e coloque-o em sessão. 3. Crie o filtro verificando se existe um usuário logado e se não existir lance uma exceção ou um HTTP STATUS para acesso negado. 4. Mapeie o filtro no contexto protegido. Algo assim: 2.
String login = request.getParameter("login");
Usuario usuario = acharUsuario(login);
if(usuario != null && usuario.getSenha().equals(request.getParameter("senha")){
  request.getSession().setAttribute("usuario_logado", usuario);
}
3.
... doFilter(... {
  HttpServletRequest request = (HttpServletRequest) arg0;
  HttpServletResponse response = (HttpServletResponse) arg1;
  Usuario usuario = (Usuario) request.getSession().getAttribute("usuario_logado");

  if(usuario == null){
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  }
  // ...
}
4. web.xml:
<filter>
		<filter-name>usuarioLogado</filter-name>
		<filter-class>...</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>usuarioLogado</filter-name>
		<url-pattern>/contexto/restrito/*</url-pattern>
	</filter-mapping>

Olá Guilherme, td bem?

Meu amigo, estou com a mesma dificuldade para fazer essa proteçao, e gostaria de saber se tem como vc detalhar melhor os 3o e 4o passos. Não tenho mto conhecimento com java e preciso de ajuda. Agradeço.

K

eae, alguem ajuda??

G

Crie uma classe implementando a interface javax.servlet.Filter. Essa interface é chamada pelo Servlet Engine (tomcat, jetty, etc) uma vez ao iniciar e uma vez ao derrubar a aplicação, mas mais importante é que ela é chamada a cada requisição!
No método doFilter() você pode verificar se existe algum usuario logado como eu fiz no meu exemplo!

Vamos supor que a área restrita da sua aplicação seja tudo que estiver dentro de uma pasta chamada restrito dentro do raiz. Logo, você pode mapear no seu web.xml assim:

<filter>
		<filter-name>usuarioLogado</filter-name>
		<filter-class>br.com.meuteste.MeuFiltro</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>usuarioLogado</filter-name>
		<url-pattern>/restrito/*</url-pattern>
	</filter-mapping>
Criado 20 de maio de 2009
Ultima resposta 9 de set. de 2009
Respostas 5
Participantes 3