在整个学习过程中,我最关心的内容有号几点,其中一点是【前后端分离的情况下如何不跳转页面而是返回需要的返回值】。
下面就说一下学习结果,以xml配置位李。
登录成功,不跳转页面,返回自定义返回值
在spring官方文档5.0.12.RELEASE第6.2.3节,有这么一段描述:
要进一步控制目标,可以使用authentication-success-handler-ref属性作为default-target-url的替代。 引用的bean应该是AuthenticationSuccessHandler的一个实例。 您可以在Core Filters一章以及命名空间附录中找到更多相关信息,以及有关如何在身份验证失败时自定义流的信息。
刚开始的时候我没有注意到这个内容,后来看了spring-security-5.0.xsd文件才找到这个配置。
在xsd文件中,对这个属性是这样描述的:
引用应该用于处理a的AuthenticationSuccessHandler bean成功的认证请求。 不应与之配合使用default-target-url(或always-use-default-target-url)应始终作为实现处理导航到后续目的地
所以实现一个AuthenticationSuccessHandler的实现类:
public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("===========登陆成功================");
PrintWriter printWriter = response.getWriter();
Map msgMap = new HashMap<>();
msgMap.put("result", "0");
msgMap.put("msg", "登录成功");
printWriter.write(new Gson().toJson(msgMap));
printWriter.flush();
printWriter.close();
}
}
配置xml:
......
测试结果:
登出成功,不跳转页面,返回自定义返回值
在spring官方文档5.0.12.RELEASE第6.2.4 logout handling节,提到这个内容:
logout元素通过导航到特定URL添加了对注销的支持。 默认的注销URL是/logout,但您可以使用logout-url属性将其设置为其他内容。 有关其他可用属性的更多信息,请参见命名空间附录。
查找到对应的命名空间章节43.1.26
//这个说明 success-handler-ref
success-handler-ref May be used to supply an instance of LogoutSuccessHandler which will be invoked to control the navigation after logging out.
根据说明需要实现LogoutSuccessHandler接口。
实现一个LogoutSuccessHandler的实现类:
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("===========登出成功================");
PrintWriter printWriter = response.getWriter();
response.setHeader("Content-Type", "application/json;charset=utf8");
Map msgMap = new HashMap<>();
msgMap.put("result", "0");
msgMap.put("msg", "退出成功");
printWriter.write(new Gson().toJson(msgMap));
printWriter.flush();
printWriter.close();
}
}
配置xml:
测试:
未登录时,如果调用接口,不报403或401错,返回自定义结果
在43.1.21
authentication-failure-handler-ref 可用作authentication-failure-url的替代方法,使您可以在身份验证失败后完全控制导航流。 该值应该是应用程序上下文中AuthenticationFailureHandler bean的名称。
xsd中的说明:
引用应该用于处理失败的AuthenticationFailureHandler bean验证请求。 不应与authentication-failure-url结合使用, 因为实现应始终处理导航到后续目的地
测试配置基本和登录成功一致,不啰嗦了。
总结
这样就实现了基本的前后端调用要求,避免了路径跳转。