Spring Boot พร้อมแอพ Spring Security เรียกตัวควบคุมการเข้าสู่ระบบเมื่อโหลดโฮมเพจ

ฉันมีแอปพลิเคชัน Spring Boot พร้อม Spring Security ในระดับพื้นฐาน มันค่อนข้างจะเข้ากันกับอันจากบทช่วยสอนของ Spring คำถามของฉันคือ เมื่อฉันไปที่หน้าแรก มันจะเรียกตัวควบคุมการเข้าสู่ระบบ (สองครั้ง) ทำไม ไม่ชัดเจนว่าจะดำเนินการดังกล่าวด้วยการตั้งค่าพื้นฐาน เนื่องจากเป็นเพียงการแสดงหน้าแรกเท่านั้น แต่ถ้าฉันเพิ่มคลาส LoginController มันจะถูกเรียก (สองครั้ง) เมื่อโหลดหน้าแรก อีกวิธีในการดูสิ่งนี้คือการเพิ่มแท็ก thymeleaf ที่ไม่ถูกต้องลงในเทมเพลต login.html ซึ่งจะทำให้เกิดข้อผิดพลาด แม้ว่าหน้าแรกจะไม่ได้รับการตรวจสอบสิทธิ์ก็ตาม คำอธิบายใด ๆ ที่จะช่วยได้

รหัสของฉัน:

แอปพลิเคชัน:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

การกำหนดค่าความปลอดภัยบนเว็บ:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

ตัวควบคุมหน้าแรก:

@Controller
public class HomeController {
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String getHomePage(Model model) {
        return "home";
    }
}

ตัวเลือก LoginController จะถูกเรียกเมื่อกดที่หน้าแรก:

@Controller
public class LoginController {
    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String getLoginPage(Model model) {
        return "login";
    }
}

person ikcodez    schedule 23.08.2016    source แหล่งที่มา
comment
คุณยืนยันได้อย่างไรว่าตัวควบคุมการเข้าสู่ระบบถูกเรียกสองครั้งเมื่อคุณโหลดหน้าแรก จากบันทึกเหรอ? (หากเป็นเช่นนั้น คุณสามารถแบ่งปันบันทึกได้หรือไม่)   -  person rhinds    schedule 24.08.2016
comment
ใส่เบรกพอยต์หรือแค่พิมพ์คำสั่ง...จริง ๆ แล้วมันถูกเรียกครั้งเดียว ต้องมีอะไรบางอย่างใน html ของฉันที่ทำให้มันถูกเรียกสองครั้ง แต่ตอนนี้มันถูกเรียกครั้งเดียว   -  person ikcodez    schedule 24.08.2016


คำตอบ (1)


คุณควรเพิ่ม RequestMapping ใน LoginController

แต่ทำไมคุณถึงมี HomeController และ LoginController ในเมื่อคุณมีการแมปเหล่านั้นใน addViewControllers แล้ว

person storm_buster    schedule 23.08.2016
comment
ขออภัย รูปแบบไม่ถูกต้อง... แก้ไขให้ถูกต้องแล้ว ถึงกระนั้น คำถามก็คือ เหตุใดตัวควบคุมการเข้าสู่ระบบจึงถูกเรียก และที่สำคัญกว่านั้น เหตุใดจึงแสดงเทมเพลต Login.html (หรือดูเหมือนว่าจะทำเช่นนั้น และสองครั้ง) - person ikcodez; 23.08.2016
comment
อาจเกี่ยวข้องกับลิงก์ใดก็ตามที่คุณมีในการเข้าสู่ระบบ/เทมเพลตหน้าแรกของคุณ ตัวอย่างเช่น คุณอาจมีลิงก์ไปยังไฟล์รูปภาพ/js/css ที่ถูกบล็อกโดยการกำหนดค่าความปลอดภัยของคุณ - person storm_buster; 23.08.2016
comment
สำหรับการทดสอบ เทมเพลตหน้าแรกของฉันเป็นเพียง ‹html›‹/html› - person ikcodez; 23.08.2016
comment
แต่แม้ว่าโฮมเพจจะมีลิงก์ไปยังเพจที่ถูกจำกัด ทำไมสปริงคอลโทรลล็อกอินคอนโทรลเลอร์ก่อนที่ลิงก์เหล่านั้นจะถูกคลิก? - person ikcodez; 23.08.2016
comment
หากเป็นลิงก์ css/image/js หน้า html ของคุณจะเรียกโดยอัตโนมัติ แต่เนื่องจากถูกจำกัด จึงเรียกตัวควบคุมการเข้าสู่ระบบ หากคุณมีลิงก์ไปยังหน้าอื่น (ไม่มีหน้าคงที่) คุณก็ควรจะสบายดี - person storm_buster; 25.08.2016