JavaScript를 사용하여 게시 요청 매개 변수를 읽는 방법


92

내 HTML에서 게시 요청 매개 변수를 읽으려고합니다. JavaScript에서 다음 코드를 사용하여 get 요청 매개 변수를 읽을 수 있습니다.

$wnd.location.search

그러나 포스트 요청에는 작동하지 않습니다. 누구든지 JavaScript를 사용하여 HTML에서 게시 요청 매개 변수 값을 읽는 방법을 알려줄 수 있습니까?

답변:


184

POST 데이터는 서버 측에서 처리되는 데이터입니다 . 그리고 Javascript는 클라이언트 측에 있습니다. 따라서 JavaScript를 사용하여 게시물 데이터를 읽을 수있는 방법이 없습니다.


69
결론은 정확하지만 (자바 스크립트에서 해당 데이터를 얻을 수 없음) 추론은 잘못되었습니다. 클라이언트 (브라우저)는 처음에 POST 데이터를 서버에 보내는 것입니다. 그래서 클라이언트는 그 데이터가 무엇인지 잘 알고 있습니다. 실제 이유는 브라우저가 해당 데이터를 자바 스크립트에서 사용할 수 있도록하지 않기 때문입니다 (하지만 완벽하게 가능합니다).
GetFree

@GetFree : 웹 개발자에게 POST 변수에 대한 소위 지식이 무슨 소용이 있습니까? 웹 개발자는 브라우저에서 클라이언트 측 스크립트를 작성하여 JavaScript에서 게시물 데이터를 사용할 수 있도록 만들지 않습니다. 지적했듯이 실제로는 발생하지 않기 때문 입니다. 따라서 실제 세계 에서 여기에 제시된 대답은 내 대답과 마찬가지로 정확합니다.
Platinum Azure

34
@PlatinumAzure, 나는 당신이 요점을 이해하는지 잘 모르겠습니다. POST 데이터가 서버에 있고 javascript가 클라이언트에서 실행되기 때문에 JS가 해당 데이터에 액세스 할 수있는 방법이 없다고 말합니다. 그것은 잘못된 것입니다. POST 데이터는 클라이언트와 서버 모두에 존재하며 JS가 해당 데이터에 액세스 할 수없는 이유는 단순히 클라이언트 (브라우저)가 JS에서 데이터를 사용할 수 없기 때문입니다. 저것과 같이 쉬운.
GetFree

13
@PlatinumAzure, 예, 어떤 이유로 든 할 수 없습니다. 그러나 그 이유가 무엇인지 설명하려면 올바른 이유인지 확인하십시오. 그것이 불가능한 이유에 대한 설명은 잘못된 것입니다.
GetFree

10
브라우저는 웹 앱, 브라우저에서 100 % 실행되는 (종종) 앱 (호스팅 파일 외에 서버 없음)과 같은 것을 가져 오기 때문에 더 많은 양의 데이터를 수신 할 수 있어야하는 당연한 요구가 될 것입니다. 쿼리 문자열 (GET 메서드)의 크기에 제한이 있으므로 (4K를 생각하면) 자바 스크립트에서 POSTED 데이터의 더 큰 청크를 읽을 수있는 기능은 IMHO 좋은 생각입니다.
Netsi1964 2014

26

서버가 JavaScript 변수를 채우도록하는 PHP의 작은 부분은 빠르고 쉽습니다.

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

그런 다음 일반적인 방법으로 JavaScript 변수에 액세스하십시오.

선택하지 않는 한 특정 데이터 또는 데이터 종류가 게시된다는 보장은 없습니다. 모든 입력 필드는 제안이 아니라 보장이 아닙니다.


12
이스케이프 / 따옴표 추가 등에주의하십시오. 이 경로로 이동하면 POST 데이터에. 대안은 거의 모든 데이터 유형에 대해 작동하는 json_encode ()를 사용하는 것입니다. 예 : abeautifulsite.net/passing-data-from-php-to-javascript
claviska

이제 이것이 바로 제가 생각하는 것입니다.
I.Am.A.Guy

이것은 확실히 이것을하는 가장 간단한 방법입니다. 이것은 새 테마 페이지를 만들고 window.my_prefix_post_data = <? php echo $ _POST [ 'my_post']?>와 같은 창 수준에서 게시물 데이터를 노출함으로써 워드 프레스에서 저에게 효과적이었습니다. 그런 다음 모든 범위에서 게시물 데이터에 쉽게 액세스 할 수 있습니다. 민감한 게시물 데이터가 항상 많은 사이트에는 권장되지 않지만 페이지 / 사이트의 범위에서는 훌륭하게 작동합니다.
OG Sean

2
이것은 실행 가능하지 않으며 문자 이스케이프 문제가있을 수 있습니다.
MathieuAuclair

1
확실히 해킹당했습니다. 이스케이프하지 않고 위의 방법을 사용하지 마십시오.
reggie 19

10

JavaScript는 클라이언트 측 스크립팅 언어로, 모든 코드가 웹 사용자의 컴퓨터에서 실행됩니다. 반면에 POST 변수는 서버로 이동하여 거기에 상주합니다. 브라우저는 이러한 변수를 JavaScript 환경에 제공하지 않으며 개발자는 이러한 변수가 마술처럼 거기에있을 것이라고 기 대해서는 안됩니다.

브라우저는 JavaScript가 POST 데이터에 액세스하는 것을 허용하지 않기 때문에 PHP와 같은 외부 행위자가 POST 값을 스크립트 변수 또는 전송중인 POST 값을 캡처하는 확장 / addon으로 에코하지 않고 POST 변수를 읽는 것은 거의 불가능합니다. GET 변수는 클라이언트 컴퓨터에서 구문 분석 할 수있는 URL에 있으므로 해결 방법을 통해 사용할 수 있습니다.


3
나는 당신의 -1에 단호하게 동의하지 않습니다. OP에서 질문이 AJAX를 지정하지 않았으므로 JavaScript에서 수행하지 않는 링크 클릭 및 양식 제출 가능성이 열립니다. 특히 후자는 서버 응답이 스크립트에 의해 생성되고 스크립트가 POST 변수의 값을 JS 코드로 에코하도록 선택하지 않는 한 POST 변수가 존재하지만 클라이언트 측에서 사용할 수없는 예입니다. 내가 당신의 코멘트를 -1 할 수 있다면, 나는 할 것입니다.
Platinum Azure

2
나는 AJAX에 대해 말하는 것이 아닙니다. 내 주장은 모든 형태의 POST 요청을 나타냅니다. 브라우저는 특히 URL 및 POST 매개 변수를 포함하여 HTTP 요청의 일부로 전송 된 모든 매개 변수를 알고 있습니다. 이러한 매개 변수 중 일부는 자바 스크립트에서 사용할 수 있으며 다른 매개 변수는 사용할 수 없습니다. 이것은 단순히 브라우저에 의해 부과 된 제한 일 뿐이며 JS에서 POST 매개 변수에 대한 액세스를 매우 잘 제공 할 수 있지만 그렇지 않습니다. 이것은 단순한 진실입니다.
GetFree

1
당신은 내 요점을 이해하지 못합니다. 서버가 명시 적으로 제공하지 않는 한 아무도 POST 변수를 사용할 수있을 것으로 기대하는 JavaScript를 작성하지 않습니다. 서버가 그것들을 제공하지 않는다면, 자바 스크립트 코드를 작성하는 웹 개발자에 관한 한 그들은 클라이언트쪽에 있지 않을 수도 있습니다.
Platinum Azure

1
당신의 대답에서 당신은 그것이 가능하지 않다고 말합니다. 그러나 그것이 불가능한 이유도 설명합니다. 그 설명은 잘못되었습니다. 그의 왜 당신은 -1 얻을
GetFree

3
내 설명은 불완전하고 잘못이 아닙니다. 나는 당신도 행복 할 수 있도록 내 대답을 편집했습니다. 그렇지 않다면 나에게 -1을주고 코멘트를 무시하는 대신 직접 편집하십시오.
Platinum Azure

9

sessionStorage를 사용하십시오!

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

another-page.html에서 :

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

참조 링크-https: //developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


오타 : sumbit.
Alejandro Salamanca Mazuelo

게시 요청이 하위 도메인이나 다른 도메인에서 온다면 어떻게 되나요? 개념이 깨졌습니다.
정의되지 않음

그것은해야합니다form.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
저스틴 리우

@ZefirZdravkov 당신과 함께 쿠키를 설정할 수 있습니다 samesite = NoneSecure그래서 크롬은 그것의 사용을 할 수 있습니다.
Justin Liu

6

전달하려는 값을 설정하기 위해 localStorage 또는 다른 방법을 사용하지 않는 이유는 무엇입니까?

그렇게하면 어디서든 액세스 할 수 있습니다!

하여 어디서든 내 말은 주어진 도메인 / 컨텍스트 내에서


2
왜 단순한 쿠키가 아닌가?
jj_

1
게시 요청이 하위 도메인이나 다른 도메인에서 온다면 어떻게 되나요? 개념이 깨졌습니다.
정의되지 않음

@ZefirZdravkov, 주어진 제한의 존재에 동의하지만 브라우저 기반 보안 구현으로 인해 존재합니다. '어떤 사이트라도 다른 콘텐츠를 읽을 수있다'는 시나리오라면 무한한 공포를 상상할 수 있습니다.
Ian Mbae 19

@Ian 모든 사이트는 실제로 CURL 또는 Ajax를 통해 다른 사람의 콘텐츠를 읽을 수 있습니다. '다른 사이트의 localStorage'를 언급한다면 그렇습니다. 내가 말하는 것은이 답변 이이 도메인에만 POST 요청을 수신 / 보내는 경우에만 작동한다는 것입니다. 예를 들어에서 POST 요청 은 동일한 .NET을 공유하지 않기 때문에의 JavaScript에 cloudianos.com도달 api.cloudianos.com하지 않습니다 localStorage.
정의되지 않음

2

jQuery-PostCapture ( @ ssut / jQuery-PostCapture )를 사용 하여 게시 요청 매개 변수를 읽을 수 있습니다 .

PostCapture 플러그인은 몇 가지 트릭으로 구성됩니다.

제출 버튼을 클릭하면 onsubmit이벤트가 전달됩니다.

이때 PostCapture는 양식 데이터를 직렬화하고 html5 localStorage (사용 가능한 경우) 또는 쿠키 저장소에 저장합니다.


이는 동일한 도메인 간의 게시물 제출에만 작동합니다 (하위 도메인도 작동하지 않음)
정의되지 않음

1

POST는 브라우저가 클라이언트 (브라우저)에서 웹 서버로 보내는 것입니다. 게시 데이터는 http 헤더를 통해 서버로 전송되며 서버 끝 또는 클라이언트 (브라우저)에서 웹 서버로의 경로 (예 : 프록시 서버) 사이에서만 사용할 수 있습니다. 따라서 JavaScript와 같은 클라이언트 측 스크립트에서 처리 할 수 ​​없습니다. CGI, PHP, Java 등과 같은 서버 측 스크립트를 통해 처리해야합니다. 여전히 JavaScript로 작성해야하는 경우 Node.js와 같은 서버에서 JavaScript를 이해하고 실행하는 웹 서버가 있어야합니다.


1

Java / REST API로 작업하는 경우 해결 방법은 간단합니다. JSP 페이지에서 다음을 수행 할 수 있습니다.

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

또는이를 사용하여 함수가 검색 할 수있는 사전에 넣습니다.

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

그런 다음 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;
}

이는 단지 예시이며, 사용하지 않아야 어떤 암호 등 POST 메소드가 존재 이유와 같은 민감한 데이터; 백엔드로 안전하게 데이터를 보내면 목적이 무산됩니다.

그러나 /page?blah=value&bleh=value&blahbleh=valueURL 없이 다음 페이지로 이동하기 위해 민감하지 않은 양식 데이터가 필요한 경우 더 깔끔한 URL이되고 JavaScript는 POST 데이터와 즉시 상호 작용할 수 있습니다.


1

그것을 만드는 간단한 코드가 있습니다.

index.php에서 :

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

main.js에서 :

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

따라서 index.php ( <script type="text/javascript" src="./main.js"></script>)에 main.js를 포함 하면 게시물 데이터가 포함 된 숨겨진 입력 값을 얻을 수 있습니다.


0

먼저 PHP를 통해 게시물 변수를 인코딩하기 위해 'json_encode'를 사용할 수 있습니다. 그런 다음 JSON 인코딩 된 포스트 변수에서 JS 객체 (배열)를 생성합니다. 그런 다음 JavaScript 루프를 사용하여 해당 변수를 조작합니다. 다음과 같이-아래 예제에서-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

한 가지 옵션은 PHP에서 쿠키를 설정하는 것입니다.

예 : 1 일 후 만료 값이있는 유효하지 않은 이름의 쿠키 $invalid:

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

그런 다음 JS에서 다시 읽습니다 ( JS 쿠키 플러그인 사용).

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

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

이제 invalidJavaScript 의 변수에서 값에 액세스 할 수 있습니다 .


0

JavaScript로 정의한 내용에 따라 다릅니다. 요즘 우리는 실제로 NodeJS와 같은 서버 측 프로그램에 JS가 있습니다. 서버 언어를 제외하고는 브라우저에서 코딩하는 것과 정확히 동일한 JavaScript입니다. 따라서 다음과 같이 할 수 있습니다. ( 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.
        });
    }
}

그리고 그로부터 사용 post['key'] = newVal;등 ...


-1

POST 변수는 동일한 브라우저가 처음에 보낸 경우에만 브라우저에서 사용할 수 있습니다. 다른 웹 사이트 양식이 POST를 통해 다른 URL로 제출되는 경우 브라우저는 POST 데이터가 들어오는 것을 볼 수 없습니다.

사이트 A : POST 사이트 B를 사용하여 외부 URL (사이트 B)에 제출하는 양식이 있습니다. 방문자를 수신하지만 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");

이것은 GET 변수이며 OP는 특별히 POST var를 요청했으며 이미 GET 변수를 쉽게 가지고 있다고 언급했습니다.
OG Sean

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

jQuery에서 위 코드는 URL에 POST 매개 변수가있는 URL 문자열을 제공합니다. POST 매개 변수를 추출하는 것은 불가능하지 않습니다.

jQuery 를 사용하려면 jQuery 라이브러리를 포함해야합니다. 이를 위해 다음을 사용하십시오.

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

4
이는 양식이 제출되는 페이지의 POST 매개 변수 만 가져 옵니다 . 그것은 영업 이익은 양식이 제출 한 페이지에 POST 매개 변수를하고 싶어 안전한 가정 보인다 에을 . 그것은 불가능합니다.
존 와샴

-3

직렬화 개념 을 사용하여 POST를 사용하여 제출 된 양식 매개 변수를 수집 할 수 있습니다 .

이 시도:

$('form').serialize(); 

경고를 동봉하면 숨김을 포함한 모든 매개 변수가 표시됩니다.


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

EL 표현식 $ {param.xxx} <head>를 사용하여 post 메소드에서 매개 변수를 가져 오고 js 파일이 js 파일 <head>에서 직접 'xxx'와 같은 매개 변수를 처리 할 수 ​​있도록 뒤에 포함되어 있는지 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.