6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr

Capturar IP do usuario no Browser: local e remoto

Saber qual o tipo de browser de nossos clientes/usuários e o seu comportamento é de grande valia. Você precisará disso quando:

  • Prestar suporte ao usuário e ele não souber dizer informações técnicas sobre o browser
  • Logar informações sobre browsers, capacidades e informações
  • Logar informações de parceiros (referrers), domínios e logins
  • Se você criar um site de conteudo restrito poderá detectar logins simultaneos em máquinas ou browsers diferentes
  • Levantamentos estatísticos utilizando as informações logadas acima

Imagine que o login é pessoal e intransferível (lógico neh?) mas que você criou um mecanismo que detecta logins simultâneos e derruba a seção do usuário. Se um usuário se logar de uma rede corporativa, lan-house ou coisa do gênero o IP do client vai ser sempre o mesmo: o IP do proxy ou gateway de acesso a internet. Como saber se foi um usuário diferente que logou com o mesmo login em outra máquina se os IP's são iguais? Pode ter sido o mesmo usuário que abriu dois browsers na mesma máquina.
Na verdade não tem como saber, mas ajudaria bastante se pudéssemos capturar  o IP interno da rede. 

Isso é possível com a variável de servidor (Server Variable) HTTP_X_FORWARDED_FOR. (nem sempre esta variável estará presente, geralmente só quando o acesso for feito via proxy).

O código abaixo é para uma página aspx que mostra todas as capacidades/configurações do browser e suas versões, e mostra também todas as server variables e parâmetros do servidor.

Fique atento a:

  • UserHostAddress
  • REMOTE_ADDR
  • HTTP_X_FORWARDED_FOR
  • Request.Browser.Browser.ToString()
  • Request.Browser.Type.ToString()
  • Request.Browser.Version.ToString()

São as variáveis mais importantes para você atender a essa necessidade.


<html>

<body>
<script runat=server language=C#>

	private void PegaServerVariables()
	{
			Response.Write("IP: " + Request.UserHostAddress + "<br/>");
			Response.Write("Remote Address: " + Request.ServerVariables["REMOTE_ADDR"] + "<br/>");
			
			
			Response.Write("<br><br><br>");
			Response.Write("Browser Caps:<br><br>");
			
			Response.Write("ActiveXControls: " + Request.Browser.ActiveXControls.ToString() + "<br/>");
			Response.Write("AOL: " + Request.Browser.AOL.ToString() + "<br/>");
			Response.Write("BackgroundSounds: " + Request.Browser.BackgroundSounds.ToString() + "<br/>");
			Response.Write("Beta: " + Request.Browser.Beta.ToString() + "<br/>");
			Response.Write("Browser: " + Request.Browser.Browser.ToString() + "<br/>");
			Response.Write("CDF: " + Request.Browser.CDF.ToString() + "<br/>");
			Response.Write("ClrVersion: " + Request.Browser.ClrVersion.ToString() + "<br/>");
			Response.Write("Cookies: " + Request.Browser.Cookies.ToString() + "<br/>");
			Response.Write("Crawler: " + Request.Browser.Crawler.ToString() + "<br/>");
			Response.Write("EcmaScriptVersion: " + Request.Browser.EcmaScriptVersion.ToString() + "<br/>");
			Response.Write("Frames: " + Request.Browser.Frames.ToString() + "<br/>");
			Response.Write("JavaApplets: " + Request.Browser.JavaApplets.ToString() + "<br/>");
			Response.Write("JavaScript: " + Request.Browser.JavaScript.ToString() + "<br/>");
			Response.Write("MajorVersion: " + Request.Browser.MajorVersion.ToString() + "<br/>");
			Response.Write("MinorVersion: " + Request.Browser.MinorVersion.ToString() + "<br/>");
			Response.Write("MSDomVersion: " + Request.Browser.MSDomVersion.ToString() + "<br/>");
			Response.Write("Platform: " + Request.Browser.Platform.ToString() + "<br/>");
			Response.Write("Tables: " + Request.Browser.Tables.ToString() + "<br/>");
			Response.Write("TagWriter: " + Request.Browser.TagWriter.ToString() + "<br/>");
			Response.Write("Type: " + Request.Browser.Type.ToString() + "<br/>");
			Response.Write("VBScript: " + Request.Browser.VBScript.ToString() + "<br/>");
			Response.Write("Version: " + Request.Browser.Version.ToString() + "<br/>");
			Response.Write("W3CDomVersion: " + Request.Browser.W3CDomVersion.ToString() + "<br/>");
			Response.Write("Win16: " + Request.Browser.Win16.ToString() + "<br/>");
			Response.Write("Win32: " + Request.Browser.Win32.ToString() + "<br/>");
			Response.Write("<br><br><br>");			
			

			Response.Write("<br><br><br>");
			Response.Write("Server Variables:<br><br>");
			for(int i=0; i<Request.ServerVariables.Count; i++)
			{
				string valor = string.Empty;
				valor += Request.ServerVariables.GetKey(i) + " = ";
				for(int j=0; j<Request.ServerVariables.GetValues(i).Length; j++)
				{
					valor += Request.ServerVariables.GetValues(i)[j].ToString()+"         ";
				}
				valor += "<br>";
				Response.Write(valor);
			}

			Response.Write("<br><br><br>");
			Response.Write("Server Params:<br><br>");
			for(int i=0; i<Request.Params.Count; i++)
			{
				string valor = string.Empty;
				valor += Request.Params.GetKey(i) + " = ";
				for(int j=0; j<Request.Params.GetValues(i).Length; j++)
				{
					valor += Request.Params.GetValues(i)[j].ToString()+"         ";
				}
				valor += "<br>";
				Response.Write(valor);
			}

	}

	
	
	private void Page_Load(object sender, System.EventArgs e)
	{
		PegaServerVariables();
	}
</script>
<body>

</html>


Só o método, sem o html, num arquivo .cs (code behind) seria assim:

private void PegaServerVariables()
{
  Response.Write("IP: " + Request.UserHostAddress + "
"); Response.Write("Remote Address: " + Request.ServerVariables["REMOTE_ADDR"] + "
"); Response.Write("


"); Response.Write("Browser Caps:

"); Response.Write("ActiveXControls: " + Request.Browser.ActiveXControls.ToString() + "
"); Response.Write("AOL: " + Request.Browser.AOL.ToString() + "
"); Response.Write("BackgroundSounds: " + Request.Browser.BackgroundSounds.ToString() + "
"); Response.Write("Beta: " + Request.Browser.Beta.ToString() + "
"); Response.Write("Browser: " + Request.Browser.Browser.ToString() + "
"); Response.Write("CDF: " + Request.Browser.CDF.ToString() + "
"); Response.Write("ClrVersion: " + Request.Browser.ClrVersion.ToString() + "
"); Response.Write("Cookies: " + Request.Browser.Cookies.ToString() + "
"); Response.Write("Crawler: " + Request.Browser.Crawler.ToString() + "
"); Response.Write("EcmaScriptVersion: " + Request.Browser.EcmaScriptVersion.ToString() + "
"); Response.Write("Frames: " + Request.Browser.Frames.ToString() + "
"); Response.Write("JavaApplets: " + Request.Browser.JavaApplets.ToString() + "
"); Response.Write("JavaScript: " + Request.Browser.JavaScript.ToString() + "
"); Response.Write("MajorVersion: " + Request.Browser.MajorVersion.ToString() + "
"); Response.Write("MinorVersion: " + Request.Browser.MinorVersion.ToString() + "
"); Response.Write("MSDomVersion: " + Request.Browser.MSDomVersion.ToString() + "
"); Response.Write("Platform: " + Request.Browser.Platform.ToString() + "
"); Response.Write("Tables: " + Request.Browser.Tables.ToString() + "
"); Response.Write("TagWriter: " + Request.Browser.TagWriter.ToString() + "
"); Response.Write("Type: " + Request.Browser.Type.ToString() + "
"); Response.Write("VBScript: " + Request.Browser.VBScript.ToString() + "
"); Response.Write("Version: " + Request.Browser.Version.ToString() + "
"); Response.Write("W3CDomVersion: " + Request.Browser.W3CDomVersion.ToString() + "
"); Response.Write("Win16: " + Request.Browser.Win16.ToString() + "
"); Response.Write("Win32: " + Request.Browser.Win32.ToString() + "
"); Response.Write("


"); Response.Write("


"); Response.Write("Server Variables:
"); for(int i=0; i < Request.ServerVariables.Count; i++) { string valor = string.Empty; valor += Request.ServerVariables.GetKey(i) + " = "; for(int j=0; j < Request.ServerVariables.GetValues(i).Length; j++) { valor += Request.ServerVariables.GetValues(i)[j].ToString()+" "; } valor += "
"; Response.Write(valor); } Response.Write("


"); Response.Write("Server Params:

"); for(int i=0; i<Request.Params.Count; i++) { string valor = string.Empty; valor += Request.Params.GetKey(i) + " = "; for(int j=0; j<Request.Params.GetValues(i).Length; j++) { valor += Request.Params.GetValues(i)[j].ToString()+" "; } valor += "
"; Response.Write(valor); } }

Isso funciona não só em qualquer linguagem .net (VB.net, ironPython etc...) mas tem similares em qualquer linguagem dinâmica Web, seja Java, PHP, Ruby ou Python.

Até + ;)

Comentários

  1. Como eu capturo o ip do usuário e armazeno ele em arquivo txt ? :/

    ResponderExcluir
  2. Obrigado pelo feedback.
    Para fazer isso, em vez de usar response.write para escrever na página você pode usar o streamwriter para gravar em um arquivo. Você pode usar um caminho absoluto da máquina / servidor (mais fácil) ou usar mappath para obter o caminho relativo à aplicação/página onde você está.

    Veja exemplos do uso da classe streamwriter no site do msdn:
    http://msdn.microsoft.com/pt-br/library/system.io.streamwriter.aspx

    ResponderExcluir
  3. Boa noite Luiz, como vai?

    Gostaria sepode me ajudar. Preciso pegar a porta que aparece no browser do cliente, mas até agora não encontrei nada! Pegar o IP, sem problemas, mas a porta...Por exemplo:

    "http://IP:porta..."

    Tem algum método para isso?
    Até!

    ResponderExcluir
  4. A porta por padrão é 80. Se for especificada uma porta diferente no browser pegue o atributo URL do objeto response e "parseie-o". Divida (split) a url em duas partes partindo do sinal de dois pontos (:) e pegue a parte da direita, antes da barra.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Uso de memória no SQL Server

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Botão Add This para adicionar seu post em qualquer rede