实现:自定义处理器返回JSON数据,不进行页面跳转
一、自定义返回JSON数据类
自定义返回结果类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
/**
* 状态码
*/
private String code;
/**
* 状态信息
*/
private String message;
/**
* 数据
*/
private T data;
public static <T> Result<T> of(ResultStatus status, T data){
return new Result<T>(status.getCode(),status.getMessage(),data);
}
}
自定义状态码和状态信息类
public enum ResultStatus {
/**
* 响应状态
*/
SUCCESS("200","操作成功"),
UNSUCCESS("500","操作失败");
/**
*状态码
*/
private final String code;
/**
*状态信息
*/
private final String message;
ResultStatus(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
二、自定义登录成功处理器
@Component
public class MyLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
//设置返回JSON数据
response.setContentType("application/json;charset=UTF-8");
//响应JSON数据
response.getWriter().write(new ObjectMapper().writeValueAsString(Result.of(ResultStatus.SUCCESS,null)));
}
}
三、自定义登录失败处理器
@Component
public class MyLoginFaultHandler extends SimpleUrlAuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
//设置返回JSON数据
response.setContentType("application/json;charset=UTF-8");
//响应JSON数据
response.getWriter().write(new ObjectMapper().writeValueAsString(Result.of(ResultStatus.UNSUCCESS,null)));
}
}
四、配置自定义的处理器
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyLoginFaultHandler myLoginFaultHandler;
@Autowired
MyLoginSuccessHandler myLoginSuccessHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin() //自定义登录页面
.loginPage("/login.html") //登录页面设置
.successHandler(myLoginSuccessHandler) //设置登录成功处理器
.failureHandler(myLoginFaultHandler) //设置登录失败处理器
.and().csrf().disable(); //关闭csrf保护
}
}
五、测试
登录成功
登录失败