2011-01-18 38 views
5

Tôi có một siêu liên kết mà tôi cần đăng nhập khi được nhấp.Tôi làm cách nào để ghi nhật ký một nhấp chuột siêu liên kết?

Tôi đã tạo một mẫu thử nghiệm nhỏ và vấn đề có thể lặp lại bằng cách tạo dự án ứng dụng web MVC 2 mới.

Thêm

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

đến tập tin Site.Master.

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

đến HomeController.cs nộp

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

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

trong Trang chủ/index.aspx

Đặt một điểm break trong LogSomething() hành động trong HomeController.

Nhưng khi tôi chạy nó, đôi khi điểm ngắt được nhấn, thời gian khác nó không phải là.

Tôi giả định rằng nó không bị tấn công do liên kết thực sự gửi trình duyệt đến một trang khác, nhưng không nên đăng bài trước khi liên kết được kích hoạt?

Có cách nào tôi có thể đảm bảo mã đăng nhập được kích hoạt không?

Xin lưu ý; việc thêm chức năng ghi nhật ký vào mục tiêu liên kết không phải là một tùy chọn.

EDIT: Liên kết gốc thực sự là một giao thức tùy chỉnh cho một ứng dụng được cài đặt trên máy tính người dùng. Vì vậy, liên kết là một cái gì đó như "myapp: myArgs". Tôi đã không đề cập rằng để giữ cho mọi thứ đơn giản, thật không may, vì không có câu trả lời nào thực sự áp dụng cho tôi, tôi nghĩ rằng nó cần phải đề cập đến.

Trả lời

1

Tôi nghĩ trình duyệt có thể dễ dàng điều hướng đến URL trước khi đăng nhập. Làm thế nào về:

<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

Tôi đã thử điều đó, nhưng nó không phải lúc nào cũng hoạt động –

+1

Ngoài ra, điều đó sẽ phá vỡ khủng khiếp với, ví dụ như "mở trong tab mới". –

+0

@ John, theo cách nào nó không phải lúc nào cũng hoạt động? Nó không bị các vấn đề về thời gian mà mã của bạn có. –

0

Một cách tiếp cận mà tôi đã thấy được sử dụng bởi nhiều trang web, bao gồm cả google, là phải có một trang "redirector", vì vậy tất cả các liên kết đi qua đó trang/điều khiển, bạn đăng nhập nó, sau đó từ ở đó bạn có thể chuyển hướng chúng

10

Nếu tôi đang thực hiện, tôi có thể làm gì, ví dụ: Google thực hiện và thiết lập URL mà nhật ký sẽ chuyển hướng. Ví dụ:

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

Sau đó /log handler sẽ làm điều gì đó như:

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

Bạn sẽ cần phải đặt một số suy nghĩ vào đối phó với các liên kết bên ngoài (ví dụ, làm thế nào bạn muốn xử lý http://example.com/log?url=http://evil.com/) ... Nhưng đó là một vấn đề có thể giải quyết được.

Ngoài ra, đối với điểm thưởng, bạn có thể hoán đổi URL khi liên kết được nhấp (đây là những gì Google thực hiện trong kết quả tìm kiếm của họ), vì vậy, xem trước liên kết chuột sẽ chính xác.

+0

+1 tinh khiết ác :) – zack

+0

... và để được thêm ác: 'var oldUrl = this.attr (" href "), self = this; setTimeout (function() {self.attr ("href", oldUrl)}, 10) ' –

+0

lol. Tôi thích cách bạn đã viết một phong cách django xem func thậm chí tho của nó được gắn thẻ là .net mvc – mpen

3

Ngoài ra, bạn có thể làm những gì Google Reader không, và đặt một "từ url" trong mỗi liên kết:

<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> 

Sau đó, sử dụng một số trung gian để đăng nhập "từ" trong các yêu cầu gửi đến.

Điều này có bất lợi là nó sẽ không thể ghi nhật ký các lần nhấp vào một tên miền khác… Nhưng điều đó có thể không sao.

0

Làm thế nào để bẻ khóa "đăng nhập" tùy chọn trên mỗi trang được bao gồm như một phần của các liên kết để bạn không phải có bất kỳ Javascript nào? Cấp, mỗi trang có thể đăng nhập một cái gì đó từ trang giới thiệu, nhưng nó không nên quan tâm, vì bạn có thể có nó chỉ cần vượt qua bất cứ điều gì trong parm đăng nhập vào infra đăng nhập và tiếp tục.

Các vấn đề liên quan