一、错误代码
1.首先我的结构很简单
首先实现登录处理逻辑UserDetailServiceImpl ,设置用户名为admin ,固定密码为123
`java`
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1.根据用户名去数据库查询,如果不存在抛出UsernameNotFoundException异常
if (!"admin".equals(username)){
throw new UsernameNotFoundException("用户名不存在");
}
//2.比较密码(注册时已经加密过),若匹配成功返回UserDetails
//User类是UserDetailServiceImpl的实现类,其需要在表单中输入的用户名,密码,和权限
String password = passwordEncoder.encode("123");
return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal"));
}
}
在进行Security配置 SecurityConfig 时,设置登录成功跳转页面和登录失败跳转页面报错
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login")
//tologin和toError都做了跳转
.loginProcessingUrl("/tologin")
//.defaultSuccessUrl("/main")
.successForwardUrl("/main")
.failureForwardUrl("/toError");
//.failureUrl("/error.html");
http.csrf().disable();
//设置放行
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/error.html").permitAll()
.antMatchers("/toError").permitAll()
.anyRequest().authenticated();
}
@Bean
public PasswordEncoder getPw(){
return new BCryptPasswordEncoder();
}
}
二、错误展示
1.设置登录成功跳转页面:
.loginProcessingUrl("/tologin")
2.在LoginControoler设置相应的跳转配置(后缀已经配置为.html)
@RequestMapping("/login")
public String login()
{
return "login";
}
3.贴一个表单代码
<form action="/tologin" method="post">
<!--//本来在表单的用户名和密码的name属性都是固定的username和password,但可以自定义入参
.usernameParameter("username123")
.passwordParameter("password123")-->
用户名:<input type="text" name="username123"/> <br/>
密码:<input type="password" name="password123"/><br/>
<input type="submit" value="登录"/>
</form>
到这里本来表单提交/tologin路径,交给loginProcessingUrl中转后判断是否成功,若成功就进入/toMain,再进控制器跳转。本应该寻到main.html之后显示登陆成功。
结果
并且报错
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
大概意思就是不支持post请求。
我很疑惑,去查验资料
1.loginProcessingUrl 与 successForwardUrl 使用post请求
2.registry.addViewController("/success").setViewName(“success”);这种路径映射方式不支持post请求
3.重定向和转发的区别:其中之一的区别是,重定向浏览器地址栏会发生变化,为重定向路径(/seccess),请求类型相应的为/seccess的类型为get;转发浏览器地址栏不会发生变化,还是登录处理请求路径(/doLogin),所以相应的请求类型为post,所以就产生了异常。
并进行了试错
可知若想使用loginProcessingUrl 与 successForwardUrl
1.则表单提交必须为post请求
2.不用addViewController的方式,而是写一个controller,在控制器里进行路径映射
3.在映射时使用redirect:/xxx ,进行重定向,且直接指定到资源.html,或再次进行映射
csdn链接:https://blog.csdn.net/qq_48826531/article/details/119278065