defaultSuccessUrl和successForwardUrl与failureForwardUrl和failureUrl跳转遇到的错误总结

一、错误代码

1.首先我的结构很简单

首先实现登录处理逻辑UserDetailServiceImpl ,设置用户名为admin ,固定密码为123

@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,或再次进行映射

参考:

(3条消息) SpringSecurity中successForWardUrl路径跳转405_staybug的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值