Java 表格';s post方法没有';t在Spring安全登录验证中返回控制器

Java 表格';s post方法没有';t在Spring安全登录验证中返回控制器,java,spring,spring-security,Java,Spring,Spring Security,我正在关注杰罗姆·贾格莱尔的《春季食谱》。在spring安全部分中,我创建了一个小的登录示例,以根据数据库对用户进行身份验证 login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <body> <c:url var="loginUrl" value="/login" /> &l


我正在关注杰罗姆·贾格莱尔的《春季食谱》。在spring安全部分中,我创建了一个小的登录示例,以根据数据库对用户进行身份验证


login.jsp

<%@ page language="java" contentType="text/html;  charset=UTF-8" pageEncoding="UTF-8"%>

    <body>
        <c:url var="loginUrl" value="/login" />
        <form action="${loginUrl}" method="post" >
            <input type="hidden" name="${_csrf.parameterName}"
                   value="${_csrf.token}"/>
            <c:if test="${param.error != null}">
                <p>
                    Invalid username and password.
                </p>
            </c:if>
            <p>
                <label for="username">Username</label>
                <input type="text" id="username" name="username"/>
            </p>
            <p>
                <label for="password">Password</label>
                <input type="password" id="password"
                       name="password"/>
            </p>
            <button type="submit">Log in</button>

        </form>
        <c:url var="logout" value="/logout" /> 
        <a href="${logout}">logout</a>
    </body>
SecurityConfig.java

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public void login() {
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String processLogin() {
        return "homepage";
    }

    @RequestMapping(value = "/logout")
    public String logout() {
        return "out"; 
    }
}
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureUser(AuthenticationManagerBuilder auth) throws Exception {
      auth.jdbcAuthentication()
                .dataSource(dataSource())
                .usersByUsernameQuery("select username,password,enabled from users where username =  ?")
                .authoritiesByUsernameQuery("select username,authority from authorities where username =  ? ");
    }

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
        http.formLogin().loginPage("/login").permitAll();
        AntPathRequestMatcher pathRequestMatcher = new AntPathRequestMatcher("/logout");
        http.logout().logoutRequestMatcher(pathRequestMatcher);
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/customer");
        dataSource.setUsername("root");
        dataSource.setPassword("123");
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource());
        return transactionManager;
    }
}
最后是我的项目的文件夹结构。

数据库登录验证部分工作正常。
问题是表单的post请求没有返回到
LoginController
。此外,注销操作不会返回到
LoginConroller
中的
/logout
映射方法


请帮助我找出这个例子中的错误所在?

谢谢

一切都符合Spring Security的要求。您不需要执行
登录
注销
操作,Spring Security正在代替您执行这些操作(您只需要通过
http.formLogin()
http.httpBasic()
http.logout()
,默认情况下
注销
操作处于打开状态)

Spring Security有一些过滤器,它们在点击控制器之前/之后根据请求执行/检查一些操作。根据,每个这样的过滤器可以检查、阻塞、处理。。。你的要求。通过
http.formLogin()
http.logout()
您告诉spring security打开过滤器,该过滤器负责
登录
注销
用户-因此spring security将打开相应的过滤器,如果有人点击
POST/login
spring的安全过滤器将拦截此类请求,登录用户并将其重定向到主页(或受保护的请求页面),这样的过滤器将不会通过
注销
操作将您的请求传递给链中的父亲(到控制器)


Spring Security为您提供了配置过滤器行为的选项,例如http.formLogin().loginPage(“/logpage”).usernamepartment(“自定义用户名参数名称”)。当然,您可以关闭此类过滤器,请求
POST/login
POST/logout
将击中您的控制器,但这不是一个好方法,因为它实现了与spring security中相同的逻辑,当然还有新的bug。要禁用过滤器,只需执行http.formLogin().disable();http.logout().disable()

谢谢。我能知道如何在登录后返回到另一个页面(比如
homepage.jsp
)吗?请。
http.formLogin().defaultSuccessUrl(“/wanter page”,true)