在做前后端分离项目中因为使用了spring security 安全框架,登录认证成功之后再调用其他接口没问题但是只调用provider这个接口中出现302重定向
上网查了很多文章,从spring security原理到302的原理应用与解决办法,我也跟着审视了一通代码
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.addFilterBefore(checkTokenFilter, UsernamePasswordAuthenticationFilter.class)//登录前进行过滤
// .httpBasic(AbstractHttpConfigurer::disable)//禁用basic明文验证
// .csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((auth) ->{
try{
auth
.requestMatchers("/sys/user/login") .permitAll()
.anyRequest()
.authenticated();
}catch (Exception e){
throw new RuntimeException(e);
}
})
.formLogin((form) -> form
.loginPage("/sys/user/login")
.successHandler(loginSuccessHandler)
.failureHandler(loginFailureHandler)
.permitAll())
.logout((logout) -> logout.permitAll())
.httpBasic(Customizer.withDefaults())
.csrf(csrf-> csrf.disable());//来关闭csrf进行测试
return http.build();
}
关于securityFilterChain的代码似乎没有什么问题,在排查后续代码中发现,我在LoginSuccessHandler和LoginFailureHandler中设置了客户端响应编码格式
response.setContentType("application/json;charset=UTF-8");
也就是说期望获取到的是json格式
但是我的后来控制器中,由于是mybatisplus代码自动生成的
@Controller
@RequestMapping("/sys/provide")
public class ProviderController {
}
@Controller并未改成 @RestController
@Controller:标识一个Spring类是Spring MVC controller处理器,
@RestController:@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
@ResponseBody注解,返回实体对象
所以302不一定是重定向目标不正确或者是循环重定向,也有可能是前端收到的格式与期待不一样而已