Cách đọc các thông số yêu cầu bài đăng bằng JavaScript


92

Tôi đang cố đọc các tham số yêu cầu bài đăng từ HTML của mình. Tôi có thể đọc các tham số nhận yêu cầu bằng cách sử dụng mã sau trong JavaScript.

$wnd.location.search

Nhưng nó không hoạt động cho yêu cầu đăng. Có ai có thể cho tôi biết cách đọc các giá trị tham số yêu cầu bài đăng trong HTML của tôi bằng JavaScript không?

Câu trả lời:


184

Dữ liệu POST là dữ liệu được xử lý phía máy chủ . Và Javascript ở phía máy khách. Vì vậy, không có cách nào bạn có thể đọc dữ liệu bài đăng bằng JavaScript.


69
Mặc dù kết luận là đúng (bạn không thể lấy dữ liệu đó từ javascript) nhưng lý do là sai. Máy khách (trình duyệt) là ứng dụng gửi dữ liệu POST đến máy chủ ngay từ đầu. Vì vậy, khách hàng biết rất rõ dữ liệu đó là gì. Lý do thực tế đơn giản là trình duyệt không cung cấp dữ liệu đó cho javascript (nhưng nó hoàn toàn có thể).
GetFree

@GetFree: Cái gọi là kiến ​​thức về các biến POST này có ích lợi gì đối với nhà phát triển web? Sẽ không có nhà phát triển web nào viết một kịch bản phía máy khách dự đoán trên trình duyệt có thể làm cho dữ liệu bài đăng có sẵn cho JavaScript vì như bạn đã chỉ ra, điều này không bao giờ xảy ra trong thực tế . Vì vậy, trong thế giới thực , câu trả lời được trình bày ở đây là chính xác, cũng như của riêng tôi.
Platinum Azure

34
@PlatinumAzure, tôi không chắc bạn hiểu vấn đề. Bạn nói rằng dữ liệu POST tồn tại trong máy chủ và vì javascript chạy trong máy khách, không có cách nào mà JS có thể truy cập vào dữ liệu đó. Điều đó là sai, dữ liệu POST tồn tại cả trong máy khách và máy chủ và lý do tại sao JS không thể truy cập dữ liệu đó đơn giản là vì máy khách (trình duyệt) không cung cấp nó cho JS. Đơn giản vậy thôi.
GetFree

13
@PlatinumAzure, Vâng, không thể thực hiện được vì bất cứ lý do gì. Nhưng nếu bạn định giải thích lý do đó là gì, hãy chắc chắn rằng đó là lý do chính xác. Bạn giải thích lý do tại sao nó không thể là sai, đó là vấn đề.
GetFree

10
Vì các trình duyệt đang nhận những thứ như ứng dụng web, ứng dụng chạy (thường xuyên) 100% trong trình duyệt (không có máy chủ, ngoại trừ các tệp lưu trữ), nó sẽ trở thành một nhu cầu tự nhiên để có thể nhận được lượng lớn dữ liệu hơn. Có một giới hạn về kích thước của chuỗi truy vấn (phương pháp GET) (nghĩ là 4K), vì vậy khả năng đọc các phần lớn hơn của dữ liệu POSTED từ javascript sẽ là một ý tưởng tuyệt vời IMHO.
Netsi1964

26

Một đoạn PHP nhỏ để máy chủ điền biến JavaScript thật nhanh chóng và dễ dàng:

var my_javascript_variable = <?php echo json_encode($_POST['my_post'] ?? null) ?>;

Sau đó, chỉ cần truy cập biến JavaScript theo cách bình thường.

Lưu ý rằng không có gì đảm bảo rằng bất kỳ dữ liệu hoặc loại dữ liệu nhất định nào sẽ được đăng trừ khi bạn kiểm tra - tất cả các trường đầu vào là gợi ý, không phải đảm bảo.


12
Hãy cẩn thận để thoát / thêm dấu ngoặc kép / v.v. vào dữ liệu POST của bạn nếu bạn đi tuyến đường này. Một giải pháp thay thế là sử dụng json_encode (), sẽ hoạt động với hầu hết mọi kiểu dữ liệu. Ví dụ: abeautifulsite.net/passing-data-from-php-to-javascript
claviska

Bây giờ đây là những gì tôi gọi là suy nghĩ ra khỏi hộp.
I.Am.A.Guy

Đây là cách đơn giản nhất để làm điều này chắc chắn. Điều này đã làm việc cho tôi trong wordpress bằng cách tạo một trang chủ đề mới và chỉ đơn giản là hiển thị dữ liệu bài đăng ở cấp cửa sổ như window.my_prefix_post_data = <? Php echo $ _POST ['my_post']?>; và sau đó truy cập dữ liệu bài đăng từ bất kỳ phạm vi nào một cách dễ dàng theo cách đó. Điều này sẽ không được khuyến nghị cho các trang web có nhiều dữ liệu bài đăng nhạy cảm liên tục xảy ra, nhưng đối với phạm vi trang / trang web của chúng tôi, nó hoạt động rất tốt.
OG Sean

2
điều này không khả thi, có thể xảy ra sự cố thoát ký tự.
MathieuAuclair

1
Đã bị tấn công, chắc chắn. Đừng sử dụng phương pháp trên mà không thoát.
reggie, 31/07/19

10

JavaScript là một ngôn ngữ kịch bản phía máy khách, có nghĩa là tất cả mã được thực thi trên máy của người dùng web. Mặt khác, các biến POST đi đến máy chủ và nằm ở đó. Các trình duyệt không cung cấp các biến đó cho môi trường JavaScript, và bất kỳ nhà phát triển nào cũng không nên mong đợi chúng ở đó một cách kỳ diệu.

Vì trình duyệt không cho phép JavaScript truy cập vào dữ liệu POST, nên hầu như không thể đọc các biến POST mà không có tác nhân bên ngoài như PHP lặp lại các giá trị POST vào một biến script hoặc một tiện ích mở rộng / addon nắm bắt các giá trị POST đang chuyển tiếp. Các biến GET có sẵn thông qua một giải pháp thay thế vì chúng nằm trong URL mà máy khách có thể phân tích cú pháp.


3
Tôi hoàn toàn không đồng ý với -1 của bạn. Không nơi nào trong OP mà câu hỏi chỉ định AJAX, do đó, mở ra khả năng nhấp vào liên kết và gửi biểu mẫu không được thực hiện bởi JavaScript. Đặc biệt, sau này là một ví dụ trong đó các biến POST tồn tại nhưng không có sẵn ở phía máy khách, trừ khi phản hồi của máy chủ được tạo bởi một tập lệnh và tập lệnh chọn lặp lại các giá trị của các biến POST vào mã JS. Nếu tôi có thể -1 nhận xét của bạn, tôi sẽ.
Platinum Azure

2
Tôi không nói về AJAX. Đối số của tôi đề cập đến bất kỳ hình thức yêu cầu ĐĂNG nào. Trình duyệt biết mọi tham số được gửi như một phần của yêu cầu HTTP, bao gồm, trong số những tham số khác, URL và tham số POST. Một số tham số được tạo sẵn cho javascript những tham số khác thì không. Nó chỉ đơn giản là một hạn chế do trình duyệt áp đặt, nó rất có thể cấp quyền truy cập vào các tham số POST từ JS, nhưng không phải vậy, đó là sự thật đơn giản.
GetFree

1
Bạn không hiểu ý tôi. Sẽ không có ai viết JavaScript mong đợi các biến POST có sẵn trừ khi máy chủ cung cấp chúng một cách rõ ràng. Nếu máy chủ không cung cấp chúng, thì theo như nhà phát triển web viết mã JavaScript, họ cũng có thể không ở phía máy khách.
Platinum Azure

1
Trong câu trả lời của bạn, bạn nói rằng nó không thể, điều đó là chính xác. Nhưng bạn cũng giải thích tại sao không thể. Lời giải thích đó là sai. Đó là lý do tại sao bạn nhận được một -1
GetFree

3
Lời giải thích của tôi không đầy đủ, không sai. Tôi đã chỉnh sửa câu trả lời của mình để ngay cả bạn cũng nên vui vẻ. Nếu bạn không, thì thay vì cho tôi -1 và nhận xét, hãy tự chỉnh sửa nó.
Platinum Azure

9

Sử dụng sessionStorage!

$(function(){
    $('form').submit{
       document.sessionStorage["form-data"] =  $('this').serialize();
       document.location.href = 'another-page.html';
    }
});

Tại trang another-page.html:

var formData = document.sessionStorage["form-data"];

Liên kết tham khảo - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


Lỗi chính tả: sumbit.
Alejandro Salamanca Mazuelo

Điều gì sẽ xảy ra nếu yêu cầu bài đăng đến từ một miền phụ hoặc một miền khác? Sự thụ thai bị phá sản.
không xác định

Nó nên đượcform.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Justin Liu

@ZefirZdravkov Bạn có thể đặt cookie bằng samesite = NoneSecuredo đó chrome cho phép sử dụng cookie .
Justin Liu

6

Tại sao không sử dụng localStorage hoặc bất kỳ cách nào khác để đặt giá trị mà bạn muốn chuyển?

Bằng cách đó, bạn có thể truy cập vào nó từ mọi nơi!

Bằng bất cứ nơi nào tôi muốn nói trong miền / bối cảnh nhất định


2
tại sao không chỉ là một cookie đơn giản?
jj_

1
Điều gì sẽ xảy ra nếu yêu cầu bài đăng đến từ một miền phụ hoặc một miền khác? Sự thụ thai bị phá sản.
không xác định

@ZefirZdravkov, trong khi tôi đồng ý với bạn về sự tồn tại của giới hạn đã cho, nó tồn tại do triển khai bảo mật dựa trên trình duyệt. Tôi chỉ có thể tưởng tượng sự kinh hoàng vô hạn nếu đó là một kịch bản 'bất kỳ trang web nào cũng có thể đọc bất kỳ nội dung nào khác'.
Ian Mbae

@Ian Bất kỳ trang web nào thực sự có thể đọc nội dung của bất kỳ trang nào khác thông qua CURL hoặc Ajax. Nếu đề cập đến 'localStorage của bất kỳ trang web nào khác', thì, vâng, điều đó thật đáng ghê tởm. Tất cả những gì tôi đang nói là câu trả lời này sẽ chỉ hoạt động nếu bạn chỉ nhận / gửi các yêu cầu POST tới miền này. Ví dụ: một yêu cầu POST từ cloudianos.comsẽ không đến được api.cloudianos.comJavaScript của vì chúng không chia sẻ cùng một thứ localStorage.
không xác định

2

Bạn có thể đọc tham số yêu cầu bài đăng bằng jQuery-PostCapture ( @ ssut / jQuery-PostCapture ).

Plugin PostCapture bao gồm một số thủ thuật.

Khi bạn nhấp vào nút gửi, onsubmitsự kiện sẽ được gửi đi.

Tại thời điểm đó, PostCapture sẽ tuần tự hóa dữ liệu biểu mẫu và lưu vào html5 localStorage (nếu có) hoặc lưu trữ cookie.


Điều này sẽ chỉ hoạt động đối với các bài đăng gửi giữa cùng một miền (miền phụ cũng không hoạt động)
không xác định

1

POST là những gì trình duyệt gửi từ máy khách (máy chủ của bạn) đến máy chủ web. Dữ liệu bài đăng được gửi đến máy chủ thông qua tiêu đề http và nó chỉ có sẵn ở cuối máy chủ hoặc ở giữa đường dẫn (ví dụ: máy chủ proxy) từ máy khách (trình duyệt của bạn) đến máy chủ web. Vì vậy, nó không thể được xử lý từ các tập lệnh phía máy khách như JavaScript. Bạn cần xử lý nó thông qua các tập lệnh phía máy chủ như CGI, PHP, Java, v.v. Nếu bạn vẫn cần viết bằng JavaScript, bạn cần có một máy chủ web hiểu và thực thi JavaScript trong máy chủ của bạn như Node.js


1

Nếu bạn đang làm việc với API Java / REST, một giải pháp dễ dàng. Trong trang JSP, bạn có thể làm như sau:

    <%
    String action = request.getParameter("action");
    String postData = request.getParameter("dataInput");
    %>
    <script>
        var doAction = "<% out.print(action); %>";
        var postData = "<% out.print(postData); %>";
        window.alert(doAction + " " + postData);
    </script>

1
<script>
<?php
if($_POST) { // Check to make sure params have been sent via POST
  foreach($_POST as $field => $value) { // Go through each POST param and output as JavaScript variable
    $val = json_encode($value); // Escape value
    $vars .= "var $field = $val;\n";
  }
  echo "<script>\n$vars</script>\n";
}
?>
</script>

Hoặc sử dụng nó để đưa chúng vào từ điển mà một hàm có thể truy xuất:

<script>
<?php
if($_POST) {
  $vars = array();
  foreach($_POST as $field => $value) {
    array_push($vars,"$field:".json_encode($value)); // Push to $vars array so we can just implode() it, escape value
  }
  echo "<script>var post = {".implode(", ",$vars)."}</script>\n"; // Implode array, javascript will interpret as dictionary
}
?>
</script>

Sau đó, trong JavaScript:

var myText = post['text'];

// Or use a function instead if you want to do stuff to it first
function Post(variable) {
  // do stuff to variable before returning...
  var thisVar = post[variable];
  return thisVar;
}

Đây chỉ là một ví dụ và không nên được sử dụng cho bất kỳ dữ liệu nhạy cảm nào như mật khẩu, v.v. Phương thức POST tồn tại là có lý do; để gửi dữ liệu một cách an toàn đến phần phụ trợ, vì vậy điều đó sẽ không đạt được mục đích.

Nhưng nếu bạn chỉ cần một loạt dữ liệu biểu mẫu không nhạy cảm để chuyển đến trang tiếp theo mà không có /page?blah=value&bleh=value&blahbleh=valuetrong url của bạn, điều này sẽ tạo ra một url rõ ràng hơn và JavaScript của bạn có thể tương tác ngay với dữ liệu POST của bạn.


1

Tôi có một mã đơn giản để tạo nó:

Trong index.php của bạn:

<input id="first_post_data" type="hidden" value="<?= $_POST['first_param']; ?>"/>

Trong main.js của bạn:

let my_first_post_param = $("#first_post_data").val();

Vì vậy, khi bạn đưa main.js vào index.php ( <script type="text/javascript" src="./main.js"></script>), bạn có thể nhận được giá trị của đầu vào ẩn chứa dữ liệu bài đăng của bạn.


0

Bạn có thể 'json_encode' để mã hóa các biến bài đăng của mình trước tiên qua PHP. Sau đó, tạo một đối tượng JS (mảng) từ các biến bài đăng được mã hóa JSON. Sau đó, sử dụng một vòng lặp JavaScript để thao tác các biến đó ... Giống như - trong ví dụ này bên dưới - để điền một biểu mẫu biểu mẫu HTML:

<script>

    <?php $post_vars_json_encode =  json_encode($this->input->post()); ?>

    // SET POST VALUES OBJECT/ARRAY
    var post_value_Arr = <?php echo $post_vars_json_encode; ?>;// creates a JS object with your post variables
    console.log(post_value_Arr);

    // POPULATE FIELDS BASED ON POST VALUES
    for(var key in post_value_Arr){// Loop post variables array

        if(document.getElementById(key)){// Field Exists
            console.log("found post_value_Arr key form field = "+key);
            document.getElementById(key).value = post_value_Arr[key];
        }
    }


</script>

0

Một tùy chọn là đặt cookie trong PHP.

Ví dụ: một cookie có tên không hợp lệ với giá trị $invalidsẽ hết hạn sau 1 ngày:

setcookie('invalid', $invalid, time() + 60 * 60 * 24);

Sau đó đọc lại nó trong JS (sử dụng plugin JS Cookie ):

var invalid = Cookies.get('invalid');

if(invalid !== undefined) {
    Cookies.remove('invalid');
}

Bây giờ bạn có thể truy cập giá trị từ invalidbiến trong JavaScript.


0

Nó phụ thuộc vào những gì bạn định nghĩa là JavaScript. Ngày nay chúng ta thực sự có JS tại các chương trình phía máy chủ như NodeJS. Nó hoàn toàn giống với JavaScript mà bạn viết mã trong trình duyệt của mình, giống như một ngôn ngữ máy chủ. Vì vậy, bạn có thể làm điều gì đó như sau: ( Mã của Casey Chu: https://stackoverflow.com/a/4310087/5698805 )

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

Và từ đó sử dụng post['key'] = newVal;vv ...


-1

Các biến POST chỉ có sẵn cho trình duyệt nếu chính trình duyệt đó đã gửi chúng ngay từ đầu. Nếu một biểu mẫu trang web khác gửi qua POST đến một URL khác, trình duyệt sẽ không thấy dữ liệu POST được đưa vào.

SITE A: có biểu mẫu gửi đến URL bên ngoài (trang B) bằng cách sử dụng POST SITE B: sẽ nhận được khách truy cập nhưng chỉ với các biến GET


-1
function getParameterByName(name, url) {
            if (!url) url = window.location.href;
            name = name.replace(/[\[\]]/g, "\\$&");
            var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
                results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, " "));
        }
var formObj = document.getElementById("pageID");
formObj.response_order_id.value = getParameterByName("name");

Đây là biến GET, OP đã hỏi cụ thể cho POST var và lưu ý rằng anh ta đã có biến GET một cách dễ dàng.
OG Sean

-3
$(function(){
    $('form').sumbit{
        $('this').serialize();
    }
});

Trong jQuery, đoạn mã trên sẽ cung cấp cho bạn chuỗi URL với các tham số POST trong URL. Không thể trích xuất các tham số POST.

Để sử dụng jQuery , bạn cần bao gồm thư viện jQuery. Sử dụng những điều sau đây cho việc đó:

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

4
Điều này sẽ chỉ nhận được các tham số POST trên trang mà biểu mẫu đang được gửi từ đó . Có vẻ như một giả định an toàn OP muốn nhận các tham số POST trên trang mà biểu mẫu đã được gửi đến . Điều đó là không thể làm được.
John Washam

-3

Chúng tôi có thể thu thập các thông số biểu mẫu được gửi bằng POST với việc sử dụng khái niệm serialize .

Thử đi:

$('form').serialize(); 

Chỉ cần kèm theo cảnh báo, nó sẽ hiển thị tất cả các thông số bao gồm cả ẩn.


-4
<head><script>var xxx = ${params.xxx}</script></head>

Sử dụng biểu thức EL $ {param.xxx} in <head>để lấy tham số từ một phương thức đăng và đảm bảo tệp js được bao gồm sau <head>đó để bạn có thể xử lý trực tiếp một tham số như 'xxx' trong tệp js của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.