Jump to content
RSN

Servlet Filter

Recommended Posts

Boa noite,
Estou utilizando filter para filtrar as requisições porém está permitindo acessar as páginas mesmo sem o usuário estar logado.

package filter;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
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.HttpSession;

import beans.Usuario;
import dao.DaoUsuario;

@WebFilter(urlPatterns={"/*"})
public class FilterAutenticacao implements Filter{

//faz alguma coisa quando a aplicação é derrubada
@Override
public void destroy() {
	
}

//intercepta todas as requisições
@Override
public void doFilter(ServletRequest request, ServletResponse response,
		FilterChain chain) throws IOException, ServletException {
	
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		
		String urlParaAutenticar = req.getServletPath();	
		// retorna null caso não esteja logado
	    Usuario usuario = (Usuario) session.getAttribute("usuario");
	    
	    if (usuario == null && !urlParaAutenticar.equalsIgnoreCase("/pages/ServletAutenticacao")){ // usuário não logado
	    	RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp?url="+urlParaAutenticar);
	    	dispatcher.forward(request, response);
	    	return;// para o processo para redirecionar
	    }
 	
		// executa as ações do request e response
		chain.doFilter(request, response);
	
}

// executa alguma coisa quando a aplicação é iniciada
@Override
public void init(FilterConfig arg0) throws ServletException {
	
}
}

package servlet;

import java.io.IOException;
import java.net.InetAddress;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.DaoLogin;
import dao.DaoOcorrenciaAcesso;
import beans.OcorrenciaAcesso;
import beans.Usuario;

@WebServlet("/ServletAutenticacao")
public class ServletAutenticacao extends HttpServlet {
private static final long serialVersionUID = 1L;

private DaoLogin daoLogin = new DaoLogin();

public ServletAutenticacao() {
	super();
}

protected void doGet(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
	
	if(Boolean.parseBoolean(request.getParameter("deslogar"))){
		//adicionar usuario logado na sessao
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		session.invalidate();
		//redireciona para login novamente
		response.sendRedirect("index.jsp");
	}
}

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

	String login = request.getParameter("login");
	String senha = request.getParameter("senha");
	String ipDaMaquina = InetAddress.getLocalHost().getHostAddress();
    //System.out.println(ipDaMaquina);
        //nome da maquina.
    String nomeDaMaquina = InetAddress.getLocalHost().getHostName();
    //System.out.println(nomeDaMaquina);

	String url = request.getParameter("url");

	// neste momento pode ser feito uma validação no banco de dados
	try {
		if (login != null && !login.isEmpty() && senha != null
				&& !senha.isEmpty()) {
			if (daoLogin.validarLogin(login, senha)) {
			// se o login foi bem sucedido

			Usuario usuario = new Usuario();
			usuario.setLogin(login);
			usuario.setSenha(senha);
			
			OcorrenciaAcesso ocorrenciaAcesso = new OcorrenciaAcesso();
			ocorrenciaAcesso.setLogin(login);
			ocorrenciaAcesso.setIpDaMaquina(ipDaMaquina);
			ocorrenciaAcesso.setNomeDaMaquina(nomeDaMaquina);
			
			DaoOcorrenciaAcesso daoOcorrenciaAcesso = new DaoOcorrenciaAcesso();
			
			daoOcorrenciaAcesso.salvarOcorrenciaAcesso(ocorrenciaAcesso);
			

			// adiciona usuário logado na sessão
			HttpServletRequest req = (HttpServletRequest) request;
			HttpSession session = req.getSession();
			session.setAttribute("login", usuario);


			// redireciona para o sistema e autoriza
			RequestDispatcher dispatcher = request
					.getRequestDispatcher("pages/usuario.jsp");
			dispatcher.forward(request, response);
			
			//gravar log de acesso
			
			
			
			
			} else {// acesso negado
				RequestDispatcher dispatcher = request
						.getRequestDispatcher("acessonegado.jsp");
				dispatcher.forward(request, response);
			}

		} else {// se o login falhou
				// redireciona para login novamente
			RequestDispatcher dispatcher = request
					.getRequestDispatcher("/index.jsp");
			dispatcher.forward(request, response);
		}

	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

}
}

package servlet;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import javax.xml.bind.DatatypeConverter;

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.codec.binary.Base64;

import beans.Ocorrencia;
import beans.Usuario;
import dao.DaoUsuario;

/**

Servlet implementation class ServletUsuario
*/
@WebServlet("/salvarUsuario")
public class ServletUsuario extends HttpServlet {
private static final long serialVersionUID = 1L;

private DaoUsuario daoUsuario = new DaoUsuario();

Ocorrencia ocorrencia = new Ocorrencia();

public ServletUsuario() {
super();

}
private String acaoGet;
private String sessionUsuario;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

 try {
 	

 	String acao = request.getParameter("acao")  != null ? request.getParameter("acao"): "listartodos";
 	String user = request.getParameter("user");
 	acaoGet = acao; 

 	if (acao != null && acao.equalsIgnoreCase("listartodos"))

 	{

 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("usuarios", daoUsuario.listar());
 		view.forward(request, response);

 	}

 	else if (acao != null && acao.equalsIgnoreCase("delete")
 			&& user != null) {
 		daoUsuario.delete(user);
 		request.setAttribute("msg",  "Usuário excluído com Sucesso!");
 		//Tipo de mensagem
 		request.setAttribute("tipo", "success");
 		// daoUsuario.salvarOcorrencia(ocorrencia);
 		// daoUsuario.deleteOcorrencia(ocorrencia);
 		daoUsuario.acaoPagina(acaoGet);
 		daoUsuario.recuperarID();
 		daoUsuario.recuperarNome();
 		daoUsuario.recuperarUsuario(sessionUsuario);
 		daoUsuario.salvarOcorrencia(ocorrencia);
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("usuarios", daoUsuario.listar());
 		view.forward(request, response);

 	} else if (acao != null && acao.equalsIgnoreCase("editar")
 			&& user != null) {
 		Usuario usuario = daoUsuario.consultar(user);
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("user", usuario);
 		view.forward(request, response);

 	} else if (acao != null && acao.equalsIgnoreCase("ocorrencia")) {
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/ocorrencia.jsp");
 		request.setAttribute("ocorrencias",
 				daoUsuario.listarOcorrencia(user));
 		view.forward(request, response);
 		
 	}

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

 }
}

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

 String acao = ("SalvarUsuario");
 String usuarioSessao = request.getParameter("usuarioSessao");
 sessionUsuario = usuarioSessao;

 boolean podeInserir = true;
 String msg = null;

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

 Usuario usuario = new Usuario();
 usuario.setId(!id.isEmpty() ? Long.parseLong(id) : null);
 usuario.setLogin(login);
 usuario.setNome(nome);
 usuario.setSenha(senha);

 Ocorrencia ocorrencia = new Ocorrencia();

 try {
 	if (id == null || id.isEmpty() && podeInserir) {
 		daoUsuario.salvar(usuario);
 		//Mensagem salvo com sucesso
 		request.setAttribute("msg",  "Usuário salvo com Sucesso!");
 		//Tipo de mensagem
 		request.setAttribute("tipo", "success");
 		daoUsuario.acaoPagina(acao);
 		daoUsuario.recuperarID();
 		daoUsuario.recuperarNome();
 		daoUsuario.recuperarUsuario(usuarioSessao);
 		daoUsuario.salvarOcorrencia(ocorrencia);
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("usuarios", daoUsuario.listar());
 		view.forward(request, response);

 	}
 	if (id != null && !id.isEmpty()) {
 		daoUsuario.atualizar(usuario);
 		request.setAttribute("msg",  "Usuário editado com Sucesso!");
 		//Tipo de mensagem
 		request.setAttribute("tipo", "success");
 		daoUsuario.acaoPagina(acaoGet);
 		daoUsuario.recuperarID();
 		daoUsuario.recuperarNome();
 		daoUsuario.recuperarUsuario(usuarioSessao);
 		daoUsuario.salvarOcorrencia(ocorrencia);
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("usuarios", daoUsuario.listar());
 		view.forward(request, response);

 	}else{
        
 		RequestDispatcher view = request
 				.getRequestDispatcher("/pages/usuario.jsp");
 		request.setAttribute("usuarios", daoUsuario.listar());

 	}

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

}
   

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Good
      Boa noite,
       
      estamos utilizando visual studio numa equipe de programação. E gostaríamos de criar tipo um repositório ao vivo, onde pudéssemos ver em qual arquivo cada um está editando.
      Tipo as pessoas que estão conectadas, etc.
       
      Existe algo do tipo? Já instalei o live share, mas n é mto util, dá para ver o outro editando o código. Porém é complicado, queriamos monitorar o trabalho, ver o que está sendo feito, etc.
       
      Github já usamos também.
    • By NaPraia
      Tenho uma aplicação(projeto) java J1 onde tenho um registro.
      Eu gostaria de enviar o valor desse registro para outra aplicação J2.
       
      Como posso fazer isso?
      Estou utilizando o eclipse
    • By fideles
      Senhores, um dúvida e acho que vocês podem me ajudar a exclarecer ou mudar o codigo.
       
      Tenho um formulario onde pode acrescentar varias linhas com javascript e com um botão para chamar a função e que funciona bacana, codigo abaixo;
      <script type="text/javascript"> $(function () { $(".adicionarCampo").click(function () { novoCampo = $("tr.linhas:first").clone(); novoCampo.find("input").val(""); novoCampo.insertAfter("tr.linhas:last"); removeCampo(); }); }); </script> Tenho uma função em javascript também que faz preencher alguns campos automaticamente com base em um select.
      <script type="text/javascript"> function update(cod_atividade){ $.post("scripts/codigos_atividades.php", {cod_atividade:cod_atividade}, function(retorno){ dados = retorno.split("/"); $('#descricao').val(dados[0]); //alert(dados[0]); }); } </script>  
      O problema é que nos input, nos nomes eu coloquei colchetes no final, uma vez que eu tenho um array para gravar tudo de uma vez no banco.
      <input name="descricao[]" type="text" required="required" id="descricao" size="45" maxlength="255" readonly="readonly" /> So  que no script acima, ele direciona os inputs pelo ID, como o ID é unico, como que eu faço para ele reconher cada linha acrecentada conforme o 1º JS?
       
      Ex: 
      Cliquei na primeira linha, selecionei uma opção no select e preencheu o campo descrição
      Ao adicionar uma segunda linha, como o id é unico, ele não preenche, acaba alterando a primeira linha novamente.
       
      Alguém sugere algo que eu consiga ele identificar cada linha acrescentada e preenche o campo daquela respectiva linha?
       
      Obrigado desde já.
       
       
    • By kaayasinho
      Boa tarde Pessoal tudo bom?
      Durante um tempo eu fui estudante de programação, para web. E esse forum me foi muito util pois aprendi muitas coisas, e tirei muitas duvidas com todos os participantes. Por outro lado não segui a carreira de programado pois tive outras oportunidades.
       
      Em fim, estou com um projeto de criar uma plataforma online para eventos, e estou tentando montar um time chegar nesse objetivo. Por hora ainda estou tentando juntando a equipe necessária para isso acontecer.
       
      Pela pouca experiência que tive na programação, sei que fazer essa plataforma é bem complexa principalmente com as necessidades que vamos englobar, porém o mercado esta escasso de plataformas flexíveis, no sentido de oferecer algumas ferramentas básicas na comunicação. apesar de ja existir algumas plataformas no mercado.
       
      Resumo:
      1-) Procuro por programadores backend com experiência (não sei exatamente informar a linguagem) mas chuto que Java, Javascript e PHP sejam fundamentais. (sei que abusaremos muito do AJAX)
       
      2-) Programador FrontEnd, com experiência. E que tenha principalmente em boas praticas, pois código sujo cheio de plugins tornará a plataforma pesada, e cheia de bugs.
       
      PS: Não procuro nada pronto, claro que plugins coisas são inevitáveis porém para funcionarmos Lisos com menos bugs possíveis procuro algo feito “artesanalmente” rsrs.
       
      Obs: o projeto esta no inicio ainda, estou juntando contatos para chegar no objetivo, e assim que tiver um contato gostaria de poder conversar trocar ideias, caso seja um projeto onde você se identifique nada impede de sermos parceiros ter uma % sobre o negocio.
       
       
      Obs2: Desculpem se escrevi meio enrolado ou esta complicado de entender. pois apenas disse plataforma de eventos e não especifiquei nada. mas assim que receber um contato eu passo mais informações com alguns links de exemplos, que é melhor que falar.
       
      E caso aqui seja o lugar correto posso passar mais informações por aqui também.
       
      Seguem alguns exemplos de plataforma de eventos online.
      Download de 2 PDFs de apresentações do mesmo segmento
       
      Site de uma das plataformas porém proximo do que almejamos
      https://www.swaper.com.br/
       
       
      Fico a disposição,
       
      Desculpem se postei no local incorreto
       
    • By jrxxjr
      Sou iniciante em Android, e fiz uma pequena aplicação Android de teste, usando Java, para aprender a utilizar um ListView com botões, e tive um problema. Os botões não funcionam direito, as vezes eu clico em cima do Edit, ele muda a mensagem para clicado, "Edit", confirmando que eu cliquei ai. Mas tem vezes que eu clico no botão Delete, e depois no botão Edit, e o texto não é mudado, ou seja o evento click não funcionou, se eu coloco um break point, no código-fonte, onde está entrando no evento setOnItemClickListener. Mas a mensagem exibida, não está correta.
      E tem um outro erro, de funcionamento do AlertDialog, da mensagem de confirmação de deleção.
      O código-fonte está abaixo.
      Por favor, alguém poderia me ajudar ?
       
      AgendaActivity.java
      package com.test.android.view; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.test.android.model.Agenda; import com.test.android.util.Util; public class AgendaActivity extends AppCompatActivity { ListView listview; MyArrayAdapter agendaArrayAdapter; ArrayList<AgendaTo> agendaArray = new ArrayList<AgendaTo>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_agenda); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("Nick", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("John", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("Anthony", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("James", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("Jack", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()), Util.fillSpaces("Jeremy", 50))); agendaArray.add(new AgendaTo(sdf.format(new Date()),Util.fillSpaces("Long", 50))); agendaArrayAdapter = new MyArrayAdapter(AgendaActivity.this, R.layout.list_item, agendaArray); listview = (ListView) findViewById(R.id.listView); listview.setItemsCanFocus(false); listview.setAdapter(agendaArrayAdapter); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, final int position, long id) { Toast.makeText(AgendaActivity.this, "List Item Clicked:" + position, Toast.LENGTH_LONG) .show(); } }); } } MyArrayAdapter.java
      package com.test.android.view; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.text.SimpleDateFormat; import java.util.ArrayList; public class MyArrayAdapter extends ArrayAdapter<AgendaTo> { Context context; int layoutResourceId; ArrayList<AgendaTo> agendas = new ArrayList<AgendaTo>(); public MyArrayAdapter(Context context, int layoutResourceId, ArrayList<AgendaTo> agendas) { super(context, layoutResourceId, agendas); this.layoutResourceId = layoutResourceId; this.context = context; this.agendas = agendas; } @Override public View getView(int position, View convertView, ViewGroup parent) { View item = convertView; AgendaWrapper agendaWrapper = null; if (item == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); item = inflater.inflate(layoutResourceId, parent, false); agendaWrapper = new AgendaWrapper(); agendaWrapper.nome = (TextView) item.findViewById(R.id.textNome); agendaWrapper.data = (TextView) item.findViewById(R.id.textData); agendaWrapper.edit = (Button) item.findViewById(R.id.btnEdit); agendaWrapper.delete = (Button) item.findViewById(R.id.btnDelete); item.setTag(agendaWrapper); } else { agendaWrapper = (AgendaWrapper) item.getTag(); } AgendaTo agenda = agendas.get(position); agendaWrapper.nome.setText(agenda.getNome()); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); agendaWrapper.data.setText(sdf.format(agenda.getData())); agendaWrapper.edit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "Edit", Toast.LENGTH_LONG).show(); } }); final int absolutePsition = position; final AgendaWrapper itemDelete = agendaWrapper; final ViewGroup viewGroup = parent; agendaWrapper.delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "Delete " + absolutePsition, Toast.LENGTH_LONG).show(); AlertDialog diaBox = AskOption(itemDelete, absolutePsition, viewGroup); diaBox.show(); } }); return item; } private AlertDialog AskOption(AgendaWrapper agendaWrapper, int position, final ViewGroup viewGroup) { final int deletePosition = position; AlertDialog myQuittingDialogBox = new AlertDialog.Builder(context) .setTitle("Delete") .setMessage("Do you want to Delete") .setPositiveButton("Delete", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { agendas.remove(deletePosition); refreshListView(agendas, viewGroup); dialog.dismiss(); } private void refreshListView(final ArrayList<AgendaTo> agendas, final ViewGroup viewGroup) { final MyArrayAdapter myArrayAdapter = new MyArrayAdapter(context, R.layout.list_item, agendas); final LayoutInflater inflater = ((Activity) context).getLayoutInflater(); final View view = inflater.inflate(layoutResourceId, viewGroup, false); final ListView listview = (ListView) view.findViewById(R.id.listView); listview.setAdapter(myArrayAdapter); } }) .setNegativeButton("cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create(); return myQuittingDialogBox; } static class AgendaWrapper { TextView nome; TextView data; Button edit; Button delete; } } list_item.xml
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" tools:context=".AgendaActivity" > <TextView android:id="@+id/textNome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Nome:" android:width="50dp" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textData" android:layout_alignTop="@id/textNome" android:layout_alignRight="@id/textNome" android:layout_alignParentLeft="true" android:layout_marginTop="5dp" android:width="50dp" android:text="Data:" android:textAppearance="?android:attr/dateTextAppearance" android:textSize="16sp" /> <Button android:id="@+id/btnEdit" android:layout_width="80dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="#99CC" android:focusable="false" android:focusableInTouchMode="false" android:text="Edit" android:textColor="#FFFFFF" /> <Button android:id="@+id/btnDelete" android:layout_width="80dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_below="@+id/btnEdit" android:layout_marginTop="3dp" android:background="#99CC" android:focusable="false" android:focusableInTouchMode="false" android:text="Delete" android:textColor="#FFFFFF" /> </RelativeLayout> activity_agenda.xml
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#990044" tools:context="com.test.android.view.AgendaActivity" > <TextView android:id="@+id/listLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Touch List" android:textColor="#FFFFFF" android:textSize="25sp" /> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/listLabel" android:layout_marginTop="5dp" android:cacheColorHint="#FFFFFF" /> </RelativeLayout>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.