实现接口 AuthenticationSuccessHandler
自定义认证成功处理器
/**
* 默认登录成功后,跳转到之前请求的 url , 而现在希望登录成功后,实现其他的业务逻辑。比如累计积分、
* 通过Ajax 请求响应一个JSON数据,前端接收到响应的数据进行跳转。那可以使用自定义登录成功处理逻辑。
*/
@Component
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
// 当认证成功后,响应 JSON 数据给前端
final R r = R.ok("认证成功");
final String jsonString = r.toJsonString();
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(jsonString);
}
}
successHandler(customAuthenticationSuccessHandler) //设置认证成功处理器
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
private AuthenticationSuccessHandler customAuthenticationSuccessHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login/page")
.loginProcessingUrl("/login")
.successHandler(customAuthenticationSuccessHandler) //设置认证成功处理器
.and()
.authorizeRequests()
.antMatchers("/login/page").permitAll()
.anyRequest().authenticated();
http.csrf().disable();
}
}
import com.alibaba.fastjson.JSON;
import lombok.Data;
/**
* 自定义响应结构
*/
@Data
public class R {
// 响应业务状态
private Integer code;
// 响应消息
private String message;
// 响应中的数据
private Object data;
public R() {
}
public R(Object data) {
this.code = 200;
this.message = "OK";
this.data = data;
}
public R(String message, Object data) {
this.code = 200;
this.message = message;
this.data = data;
}
public R(Integer code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public static R ok() {
return new R(null);
}
public static R ok(String message) {
return new R(message, null);
}
public static R ok(Object data) {
return new R(data);
}
public static R ok(String message, Object data) {
return new R(message, data);
}
public static R build(Integer code, String message) {
return new R(code, message, null);
}
public static R build(Integer code, String message, Object data) {
return new R(code, message, data);
}
//对象转成JSON
public String toJsonString() {
return JSON.toJSONString(this);
}
/**
* JSON字符串转成 R对象
*/
public static R format(String json) {
try {
return JSON.parseObject(json, R.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
登录成功以后的响应