也许你应该检查referer头文件提交,看看它是否能满足你的需求:成功登录过程后使用它重定向回来。检查this answer使用SimpleUrlAuthenticationSuccessHandler
@Bean
public AuthenticationSuccessHandler successHandler() {
SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
handler.setUseReferer(true);
return handler;
}
或者,如果你在手动配置春季多件 - 您可以使用this answer 用于获取引用者URL过滤器相并将其保存在会话中。 一个修饰,其答案可能是:延长OAuth2ClientAuthenticationProcessingFilter和的doFilter得到引荐值
public class MyOAuth2ClientAuthenticationProcessingFilter extends OAuth2ClientAuthenticationProcessingFilter {
...
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String referrer = request.getHeader("Referer");
if (null != referrer)
request.getSession().setAttribute("url_prior_login", referrer);
super.doFilter(req, res, chain);
}
}
这样你就可以处理。第您的“...处理成功的认证”后重定向 - 但我看到这个重定向是开销,尽量把这种逻辑在其他地方
successHandler()看起来是这样的(如successHandler()或pricipalExtractor()在UserInfoTokenServices如果你需要从社会的OAuth提供更多用户详细信息。):
@Bean
public AuthenticationSuccessHandler successHandler() {
AuthenticationSuccessHandler rst = new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
...
HttpSession session = request.getSession();
String redirectUrl = null;
if (session != null) {
redirectUrl = (String) session
.getAttribute("url_prior_login");
if (null == redirectUrl || redirectUrl.trim().length() <= 0)
redirectUrl = "http://your_default_redirect_url";
response.sendRedirect(redirectUrl);
};
return rst;
}
无论如何,支票弹簧docs
前端永远不会将控制权交给后端。后端永远不需要手动控制。前端向后端发出请求:它仍然在控制之中,它可以继续工作,或者可以选择等到后端完成构建并发送响应。一旦您的后端控制器返回,这是您的后端交互的结束。 –
你是如何解决它的? – kevcodez
@kevcodez我添加了一个自定义控制器来覆盖重定向调用,如本文中所建议的:http://www.littlebigextra.com/how-to-change-the-default-spring-social-redirect-flow/。 – alphathesis