วิธีการตั้งค่าฟิลด์ส่วนหัวในโพสต์แบบฟอร์ม?


99

ฉันจะตั้งค่าฟิลด์ที่กำหนดเองในส่วนหัว POST เมื่อส่งแบบฟอร์มได้อย่างไร


1
ใช้XmlHttpRequestคุณหมายถึง? หรือแค่โพสต์รูปแบบ HTML ธรรมดา?
Aliostad

ไม่ฉันกำลังใช้การกระทำแบบฟอร์ม: post
Reza Owliaei

คำตอบ:


61

ไม่สามารถทำได้ - AFAIK

อย่างไรก็ตามคุณสามารถใช้ตัวอย่างเช่น jquery (แม้ว่าคุณสามารถทำได้ด้วย javascript ธรรมดา) เพื่อจัดรูปแบบและส่ง (โดยใช้ AJAX) ในขณะที่เพิ่มส่วนหัวที่กำหนดเองของคุณ

ดู jquery serializeซึ่งเปลี่ยนรูปแบบ HTML เป็นform-url-encodedค่าพร้อมสำหรับ POST

อัปเดต

ข้อเสนอแนะของฉันคือรวมอย่างใดอย่างหนึ่ง

  • องค์ประกอบฟอร์มที่ซ่อนอยู่
  • พารามิเตอร์สตริงการสืบค้น

2
ฉันไม่สามารถใช้ ajax ในกรณีนี้ อย่างไรก็ตามฉันโพสต์และเปลี่ยนเส้นทางไปยังเพจ aspx การเปลี่ยนเส้นทางเกิดขึ้นโดย From Post
Reza Owliaei

2
ข้อเสนอแนะของฉันคือการรวม 1) องค์ประกอบฟอร์มที่ซ่อนอยู่ 2) พารามิเตอร์สตริงการสืบค้น
Aliostad

1
คุณสามารถจัดลำดับไฟล์ได้หรือไม่? ฉันคิดว่า: ไม่
Fallenreaper

ใช่คุณสามารถทำให้ไฟล์เป็นอนุกรมเป็นสตริง Base64 ได้บางทีอาจจะยุ่งยากมากสำหรับไฟล์ขนาดใหญ่เนื่องจาก Base64 อาจมีขนาดค่อนข้างใหญ่ แต่ทุกวิธีการทำให้เป็นอนุกรมก็เช่นกัน
Felype

ฉันแค่เพิ่มเป็นพารามิเตอร์สตริงการค้นหาและให้เซิร์ฟเวอร์ของคุณตรวจสอบเพื่อดูว่ามีส่วนหัวหรือสตริงการสืบค้นและมีโทเค็นหรือไม่
James111

14

ตั้งค่าคุกกี้บนเพจแล้วอ่านกลับฝั่งเซิร์ฟเวอร์

คุณจะไม่สามารถตั้งค่าส่วนหัวที่เฉพาะเจาะจงได้ แต่ค่านี้จะสามารถเข้าถึงได้ในส่วนส่วนหัวไม่ใช่เนื้อหา


4
หมายเหตุ: หากส่วนหัวที่คุณต้องการเพิ่มมีไว้สำหรับการป้องกัน CSRF ตรวจสอบให้แน่ใจว่าคุณไม่ได้เก็บโทเค็นนั้นไว้ในคุกกี้มิฉะนั้นคุณจะเอาชนะการป้องกัน CSRF
Jimothy

5

จากเอกสารFormData :

XMLHttpRequest ระดับ 2 เพิ่มการสนับสนุนสำหรับอินเทอร์เฟซ FormData ใหม่ ออบเจ็กต์ FormData จัดเตรียมวิธีการสร้างชุดของคู่คีย์ / ค่าที่เป็นตัวแทนของฟิลด์ฟอร์มและค่าได้อย่างง่ายดายซึ่งสามารถส่งได้อย่างง่ายดายโดยใช้XMLHttpRequest send()เมธอด

ด้วยXMLHttpRequestคุณสามารถตั้งค่าส่วนหัวที่กำหนดเองแล้วทำPOST.


2

ในความเป็นจริงเป็นวิธีที่ดีกว่าในการบันทึกคุกกี้ในฝั่งไคลเอ็นต์ จากนั้นคุกกี้จะถูกส่งโดยอัตโนมัติพร้อมทุกส่วนหัวของหน้าสำหรับโดเมนนั้น ๆ

ในโหนด js คุณสามารถตั้งค่าและใช้คุกกี้กับคุกกี้ parser

ตัวอย่าง:

res.cookie('token', "xyz....", { httpOnly: true });

ตอนนี้คุณสามารถเข้าถึงสิ่งนี้:

app.get('/',function(req, res){
 var token = req.cookies.token
});

โปรดทราบว่าhttpOnly:trueตรวจสอบให้แน่ใจว่าโดยปกติคุกกี้ไม่สามารถเข้าถึงได้ด้วยตนเองหรือผ่านทางจาวาสคริปต์และมีเพียงเบราว์เซอร์เท่านั้นที่สามารถเข้าถึงได้ หากคุณต้องการส่งส่วนหัวหรือโทเค็นการรักษาความปลอดภัยบางส่วนด้วยการโพสต์แบบฟอร์มและไม่ต้องผ่าน ajax ในสถานการณ์ส่วนใหญ่วิธีนี้ถือเป็นวิธีที่ปลอดภัย แม้ว่าตรวจสอบให้แน่ใจว่าข้อมูลถูกส่งผ่านโปรโตคอล / ssl ที่ปลอดภัยหากคุณกำลังจัดเก็บข้อมูลที่เกี่ยวข้องกับผู้ใช้ที่ละเอียดอ่อนซึ่งมักจะเป็นเช่นนั้น


1

นี่คือสิ่งที่ฉันทำในผับ / หยก

extends layout
block content
    script(src="/jquery/dist/jquery.js")
    script.
      function doThePost() {
        var jqXHR = $.ajax({ 
            type:'post'
            , url:<blabla>
            , headers: { 
                'x-custom1': 'blabla'
                , 'x-custom2': 'blabla'
                , 'content-type': 'application/json'
            }
            , data: {
                'id': 123456, blabla
            }
        })
        .done(function(data, status, req) { console.log("done", data, status, req); })
        .fail(function(req, status, err) { console.log("fail", req, status, err); });
      }
    h1= title
    button(onclick='doThePost()') Click


0

คุณสามารถใช้ $ .ajax เพื่อหลีกเลี่ยงพฤติกรรมตามธรรมชาติของ<form method="POST">. ตัวอย่างเช่นคุณสามารถเพิ่มเหตุการณ์ในปุ่มส่งและปฏิบัติต่อคำขอ POST เป็น AJAX


2
ฉันใช้แบบฟอร์มนี้ส่งเพื่อเปลี่ยนเส้นทางไปยังเพจ aspx และโพสต์ข้อมูลบางอย่าง
Reza Owliaei

ทำให้ฉันเข้าใจดีขึ้น: 1) โพสต์ของผู้ใช้ 2) การบันทึกข้อมูล 3) การเปลี่ยนเส้นทาง เป็นสิ่งที่คุณทำหรือไม่?
Fabio Buda

ฉันมี iFrame ในเพจ Html (ที่มา) ชี้ไปที่หน้า html อื่น (พร็อกซี) หน้าพร็อกซีโพสต์พารามิเตอร์ (ไม่รับ) ผ่านองค์ประกอบแบบฟอร์ม การเปลี่ยนเส้นทางและการโพสต์เกิดขึ้นเมื่อส่งแบบฟอร์ม ฉันดึงพารามิเตอร์ที่โพสต์ในหน้า aspx เป็นปลายทาง
Reza Owliaei

0

ในการเพิ่มคำขอของ ajax ทุกรายการฉันได้ตอบไว้ที่นี่: https://stackoverflow.com/a/58964440/1909708


หากต้องการเพิ่มลงในคำขอของ ajax โดยเฉพาะนี่ 'ฉันดำเนินการอย่างไร:

var token_value = $("meta[name='_csrf']").attr("content");
var token_header = $("meta[name='_csrf_header']").attr("content");
$.ajax("some-endpoint.do", {
 method: "POST",
 beforeSend: function(xhr) {
  xhr.setRequestHeader(token_header, token_value);
 },
 data: {form_field: $("#form_field").val()},
 success: doSomethingFunction,
 dataType: "json"
});

คุณต้องเพิ่มmetaองค์ประกอบใน JSP เช่น

<html>
<head>        
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <meta name="_csrf" content="${_csrf.token}"/>

ในการเพิ่มคำขอการส่งแบบฟอร์ม (ซิงโครนัส) ฉันได้ตอบที่นี่: https://stackoverflow.com/a/58965526/1909708

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.