登录后重定向不正确-Spring Boot

时间:2018-11-09 07:23:44

标签: javascript spring-boot spring-security bootstrap-4

在我的Spring Boot应用程序中,我遇到一个奇怪的问题。

登录后,我的Web应用程序重定向到JS页面(bootstrap-table.js)。此页面并非每次都出现,而仅在第一次登录时出现,在后续登录中,我们将重定向到正确的页面“ home.html”。

在我的WebApp中,我使用:thymeleafbootstrap4

这是我的安全配置:

    @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
        .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/resetpwd/**").permitAll()
            .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .failureUrl("/?login_error")
            .defaultSuccessUrl("/home")
        .and()
        .logout()
            .logoutUrl("/logout")
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
            .permitAll()
            .logoutSuccessUrl("/")
            .invalidateHttpSession(true)
            .deleteCookies("remember-me")
        .and()
            .rememberMe()
        .and()
            .sessionManagement();

    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
           .ignoring()
           .antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**", "/webjars/**");
    }

}

我在default.html中定义了 css js 文件,登录表单位于header.html中:

        <ul class="nav navbar-nav pull-right  ml-auto " sec:authorize="isAnonymous()">

             <li class="nav-item">
                <a class="nav-link dropdown-toggle " href="#" data-toggle="dropdown" th:text="#{login}"> </a>

                <ul class="dropdown-menu form-wrapper">                 
                    <li>

                  <form th:action="@{/login}"  data-parsley-validate="" method="POST" class="form login" >
                    <div class="col-sm-12 text-center" th:text="#{login}" ></div>
                    <p th:if="${loginError}" style="color: red;" th:text="#{login_unsuccessful}"></p>

                    <br />
                    <div class="form-group">
                            <div class="input-group mb-2">
                                <div class="input-group-prepend">
                                    <div class="input-group-text"><i class="fas fa-user text-info"></i></div>
                                </div>
                                <input type="text" class="form-control" id="username" name='username' placeholder="Username" required>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="input-group mb-2">
                                <div class="input-group-prepend">
                                    <div class="input-group-text"><i class="fas fa-key text-info"></i></div>
                                </div>
                                <input type="password" class="form-control" id="password" name="password" placeholder="Password" required>
                            </div>
                        </div>
                    <input type="submit" class="btn btn-primary btn-block text-center" value="Login">
                    <div class="form-footer">
                        <a data-target="#modalPwd" data-toggle="modal" href="#modalPwd" id="pwdDmntct" th:text="#{pwdDimenticata}"></a><br/><br/>
                    </div>
                </form>
             </li>
            </ul>
        </li>
        </ul>

在默认主体中,我具有JS的定义。

<body>

    <!-- page content -->
    <div class="container-fluid">
        <nav th:replace="~{/fragments/header :: header}"></nav>
        <div class="container-fluid">           

            <div layout:fragment="content"></div>
        </div>
    </div>          
    <!-- /page content -->

    <script th:src="@{/js/parsley/parsley.js}" type="text/javascript"></script>
    <script th:src="@{/js/parsley/it.js}" type="text/javascript"></script>
    <script th:src="@{/bootstrap-table/bootstrap-table.min.js}" type="text/javascript"></script>
    <script th:src="@{/bootstrap-table/bootstrap-table-it-IT.min.js}" type="text/javascript"></script>
    <script th:src="@{/webjars/bootstrap-datepicker/js/bootstrap-datepicker.min.js}" type="text/javascript"></script>
    <script th:src="@{/webjars/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js}" type="text/javascript"></script>
    <script th:src="@{/webjars/select2/dist/js/select2.min.js}" type="text/javascript"></script>

    <script type="text/javascript" th:inline="javascript">
        $(function () {
            if($('form').length){
                $('form').parsley().on('form:validated', function(e) {
                    if (e.validationResult) {
                        $('input[type=submit]').attr('disabled', 'disabled');
                    }
                });
            }
            $('body').on('click', '[data-toggle="modal"]', function(){
                $($(this).data("target")+' .modal-content').load($(this).attr('href'));
            });
        });
    </script>

</body>

有人可以帮助我了解此问题吗? 谢谢

2 个答案:

答案 0 :(得分:1)

您可能已重定向到“ bootstrap-table.js”,因为您正试图以注销用户访问它。您将被重定向到登录页面,此后,您将被重定向回到您在登录重定向之前尝试访问的URL。

如果您希望每次用户成功登录时都重定向到“ / home”,那么无论用户登录前要访问哪个页面,都应使用.defaultSuccessUrl("/home", true),而不要使用.defaultSuccessUrl("/home")。 / p>

答案 1 :(得分:0)

除了@Sim Dim的答案之外,我还想在登录到登录之前想要的页面后保留自动重定向功能。因此,我向控制器添加了js file path并重定向到默认页面。例如

@Controller 
public HomeController {

  @GetMapping("/bootstrap.js")  //whichever file it is
  public String falseLoginRedirect(Model model) {
    return "redirect:/home"; //redirect to my preferred default
  }

}