Spring Boot dengan aplikasi Spring Security memanggil pengontrol login saat memuat halaman beranda

Saya memiliki aplikasi Spring Boot dengan Spring Security. Pada tingkat dasar, ini cukup cocok dengan yang ada di tutorial Spring. Pertanyaan saya adalah, ketika saya membuka halaman beranda, ia memanggil pengontrol login (dua kali). Mengapa? Tidak terlihat jelas bahwa ia melakukan hal tersebut dengan pengaturan dasar, karena ia hanya menampilkan halaman beranda. Tetapi jika saya menambahkan kelas LoginController, kelas itu akan dipanggil (dua kali) saat memuat halaman beranda. Cara lain untuk melihatnya adalah dengan menambahkan tag thymeleaf yang tidak valid ke template login.html, ini akan menimbulkan kesalahan, meskipun halaman beranda tidak seharusnya diautentikasi. Penjelasan apa pun akan sangat membantu.

Kode saya:

Aplikasi:

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

Konfigurasi Keamanan Web:

@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");
    }
}

Pengontrol Rumah:

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

LoginController opsional, akan dipanggil ketika membuka halaman beranda:

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

person ikcodez    schedule 23.08.2016    source sumber
comment
Bagaimana Anda mengonfirmasi bahwa pengontrol login dipanggil dua kali saat Anda memuat halaman beranda? Dari log? (jika demikian, bisakah Anda membagikan lognya).   -  person rhinds    schedule 24.08.2016
comment
letakkan breakpoint, atau hanya pernyataan cetak... sebenarnya dipanggil sekali, pasti ada sesuatu di html saya yang menyebabkannya dipanggil dua kali, tapi sekarang dipanggil sekali.   -  person ikcodez    schedule 24.08.2016


Jawaban (1)


Anda mungkin harus menambahkan RequestMapping di LoginController.

Namun mengapa Anda memiliki HomeController dan LoginController padahal Anda sudah memiliki pemetaan tersebut di addViewControllers ?

person storm_buster    schedule 23.08.2016
comment
maaf, formatnya buruk... perbaiki. tetap saja, pertanyaannya adalah, mengapa pengontrol login dipanggil, dan yang lebih penting lagi, mengapa ia merender template login.html (atau sepertinya melakukannya, dan dua kali)? - person ikcodez; 23.08.2016
comment
mungkin itu ada hubungannya dengan tautan apa pun yang Anda miliki di template login/beranda Anda. misalnya Anda dapat memiliki tautan ke file gambar/js/css yang diblokir oleh konfigurasi keamanan Anda. - person storm_buster; 23.08.2016
comment
untuk pengujian, template rumah saya hanya ‹html›‹/html› - person ikcodez; 23.08.2016
comment
tetapi meskipun laman beranda memiliki tautan ke laman yang dibatasi, mengapa pegas memanggil pengontrol masuk sebelum tautan tersebut diklik? - person ikcodez; 23.08.2016
comment
jika itu adalah tautan css/image/js, itu secara otomatis dipanggil oleh halaman html Anda. tetapi karena dibatasi maka disebut pengontrol login. jika Anda memiliki link ke halaman lain (tidak ada halaman statis), Anda akan baik-baik saja - person storm_buster; 25.08.2016