2011-01-18 3 views
5

클릭 할 때 로그온해야하는 하이퍼 링크가 있습니다.하이퍼 링크 클릭을 기록하려면 어떻게해야합니까?

작은 프로토 타입을 만들었고 새로운 MVC 2 웹 응용 프로그램 프로젝트를 만들어 문제를 반복 할 수 있습니다.

Site.Master 파일에

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 

를 추가합니다.

그리고

HomeController.cs에
public ActionResult LogSomething() 
{ 
    string doNothing = DateTime.Now.ToString(); 
    return new EmptyResult(); 
} 

그리고 홈

<p> 
    <a id="lnkTestPost" href="/home/about">Test Post</a> 

    <script type="text/javascript"> 
     $("#lnkTestPost").click(function() { 
      $.post("/home/LogSomething"); 
     }); 
    </script> 
</p> 

/Index.aspx

LogSomething에 브레이크 포인트를 넣어() 소송을 제기 메서드를 호출합니다.

하지만 실행하면 때때로 브레이크 포인트에 충돌하고 그렇지 않은 경우가 있습니다.

나는 다른 페이지로 브라우저를 보내는 실제 링크로 인해 공격 당하지는 않을 것이라고 생각하지만, 링크가 해고되기 전에 게시물이 작성되어서는 안됩니까?

어쨌든 로깅 코드가 해고 될 수 있습니까?

주의 사항 : 링크 대상에 로깅 기능을 추가하는 것은 옵션이 아닙니다.

EDIT : 원본 하이퍼 링크는 실제로 사용자 PC에 설치된 응용 프로그램의 사용자 지정 프로토콜입니다. 따라서 링크는 "myapp : myArgs"와 같습니다. 불행히도, 답을 전혀 쓰지 않아서 단순한 것을 유지하기 위해 언급하지 않았지만 지금은 언급 할 필요가 있다고 생각합니다.

답변

1

브라우저를 클릭하면 로깅하기 전에 URL로 쉽게 이동할 수 있다고 생각합니다. 방법에 대해 :

<p> 
    <a id="lnkTestPost" href="#">Test Post</a> 

    <script type="text/javascript"> 
     $("#lnkTestPost").click(function() { 
      $.post("/home/LogSomething", function(data) { 
       // only tell the browse to navigate away once its logged 
       window.location = '/home/about'; 
      }); 
     }); 
    </script> 
</p> 
+0

나는 그것을 시도했지만 항상 작동하지는 않는다 –

+1

또한, 그것은 "새 탭에서 열기"와 같이 끔찍하게 깨질 것입니다. –

+0

@ 존, 어떤면에서 항상 작동하지 않습니까? 코드에있는 타이밍 문제가 발생하지 않습니다. –

0

나는 "리디렉터"페이지를 가지고있다, 구글 등 많은 사이트에서 사용하는 볼, 그래서 모든 링크가 해당 페이지/컨트롤러를 통해 이동 접근 방법, 당신은 다음, 그것을 기록 당신이 그들을 리디렉션 할 수 있습니다

10

내가 그것을하고 있다면, 나는 아마 구글이 설정하고 다음 리디렉션 로그 URL을 어떻게 할 것입니다. 예를 들면 :

<a href="/home/about">stuff</a> 
<script> 
    $("a:href").each(function(){ 
     this.attr("href", "/log?url=" + encodeURIComponent(this.attr("href"))); 
    }); 
</script> 

다음과 같이 할 것 /log 핸들러 : 당신은 외부 링크 처리에 몇 가지 생각을 넣어 필요할 것

def log(request): 
    target_url = request.GET["url"] 
    log_link(target_url) 
    return HttpRedirect(target_url) 

를 (예를 들어, 당신이 http://example.com/log?url=http://evil.com/을 처리하는 방법) ...하지만 그것은 풀리는 문제입니다.

또한 보너스 포인트의 경우 링크가 클릭 될 때 URL을 바꿀 수 있습니다 (이것은 Google이 검색 결과에서 수행하는 것임). 따라서 마우스 오버 링크 미리보기가 올바르게 보입니다.

+0

+1 순수한 악한 :) – zack

+0

... 그리고 여분의 악한 :'var oldUrl = this.attr ("href"), self = this; setTimeout (function() {self.attr ("href", oldUrl)}, 10)' –

+0

권자. 난 당신이 장고 스타일의 뷰 func도 쓴 그것의 태그로. 네트 mvc – mpen

3

또는, 구글 리더가하는 일을하고, 각 링크에서 "URL에서"넣을 수 :

<script> 
$("a:href").each(function(){ 
    this.attr("href", this.attr("href") + "?from=" + encodeURIComponent(window.location)); 
    // (note: this exact code won't handle links which already have GET vars…) 
}); 
</script> 

그런 다음 인바운드 요청에 "에서"를 로그인 할 몇 가지 미들웨어를 사용합니다.

이것은 다른 도메인으로 이동하는 클릭을 기록 할 수 없다는 단점이 있습니다 ...하지만 그건 괜찮을 수도 있습니다.

0

링크의 일부로 포함 된 각 페이지에서 선택적 "로그"매개 변수를 사용하면 Javascript가 전혀 필요하지 않으니 까? 허락하면, 각 페이지는 리퍼러 페이지에서 무엇인가를 로깅 할 수 있지만, 로깅 포트의 로그 패러미터에있는 정보를 전달하여 계속 진행할 수 있으므로주의해서는 안됩니다.