ไม่รองรับวิธีการร้องขอ 'POST' หลังจากใส่คำอธิบายประกอบด้านความปลอดภัยแล้ว

ฉันมีคอนโทรลเลอร์ 2 ตัว:

a)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.GET)
@Transactional
public String form(final Message message, final Model model) {
    return "portal/form";
}

b)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.POST)
@Transactional
@PreAuthorize("#message.id!=null ? hasPermission(#message, 'WRITE') : hasRole('ROLE_ADMIN')") 
public String form(@Valid final Message message, final Model model) {
    if (message.getId() == null) {
        someService.save(message);
        AclManager.create(message);
    } else {
        someService.update(message);
        AclManager.update(message);
    }
    return "redirect:result.html";
}

ก่อนที่ฉันจะใส่คำอธิบายประกอบด้านความปลอดภัยในคอนโทรลเลอร์ "b" ทุกอย่างเป็นไปด้วยดี ตอนนี้เมื่อฉันไปที่หน้าตัวควบคุม "a" และกรอกแบบฟอร์ม ให้คลิกปุ่มที่ทำให้ตัวควบคุม "b" และฉันได้รับ "สถานะ HTTP 405 - ไม่รองรับวิธีการร้องขอ 'POST'" เหตุใดสิ่งนี้จึงเกิดขึ้นและจะแก้ไขได้อย่างไร

UPD:ฉันได้ช่วยเพิ่ม RequestMethod.POST ลงในตัวควบคุมการเข้าสู่ระบบ


person Amfion    schedule 04.07.2013    source แหล่งที่มา


คำตอบ (2)


เป็นการยากที่จะแก้ไขโดยไม่มีการกำหนดค่าความปลอดภัยของ Spring แต่ฉันเดาว่าเมื่อคุณไปที่ /portal/form.html spring เปลี่ยนเส้นทางคุณไปยังหน้าเข้าสู่ระบบโดยใช้ HTTP POST ในขณะที่ตัวจัดการตัวควบคุมหน้าเข้าสู่ระบบของคุณถูกแมปกับ HTTP GET เท่านั้น ลองแมปตัวจัดการหน้าเข้าสู่ระบบกับวิธี POST

person gerrytan    schedule 05.07.2013

ฉันยังบังเอิญพบอาการที่คุณอธิบายไว้เมื่อย้ายการใช้งาน Spring Security 3.2.0.RELEASE ของแอปพลิเคชันของฉันจากการกำหนดค่าแบบ XML ไปเป็นการกำหนดค่าแบบ JavaConfig

ในกรณีเฉพาะของฉัน สาเหตุของข้อความ HTTP Status 405 - Request method 'POST' not supported คือการเปิดใช้งานการป้องกัน CSRF เริ่มต้นของ Spring Security เมื่อใช้การกำหนดค่าแบบ JavaConfig

หากต้องการลบสาเหตุนี้ คุณสามารถ:

  • อัปเดตแอปพลิเคชันให้เป็นไปตามกลไกการป้องกัน CSRF ของ Spring Security
  • หรือปิดใช้งานกลไกการป้องกัน CSRF ของ Spring Security

หากต้องการปิดใช้งานกลไกการป้องกัน CSRF ใน WebSecurityConfigurer ให้ทำดังนี้:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable() //FIXME
            .authorizeRequests() ....
    }

    // ...
}
person Abdull    schedule 21.02.2014
comment
ขอบคุณมาก. ฉันต่อสู้กับปัญหาเดียวกันนี้ในช่วงหนึ่งวันที่ผ่านมา - person sandeepsharat; 04.03.2016