spring security session过期 iframe嵌套解决方案

我开始的做法是,复写了org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler这个类,此类事spring security登入成功之后进行重定向的处理类,

public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
 
    
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        RequestCache requestCache = new HttpSessionRequestCache();
        
        String url = null;
        SavedRequest savedRequest = requestCache.getRequest(request,response);
        if(savedRequest != null){
            url = savedRequest.getRedirectUrl();
        }
       if(url == null){//sesion过期url就会变成null,
            getRedirectStrategy().sendRedirect(request,response,"/user/judge.shtml");
        }
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

spring security配置文件中

   
        
       
   
   
 

但是这种方式却没有解决iframe嵌套问题,只是很好处理了不同情况下的登入成功的跳转问题,扩展一下,例如根据用户权限控制登入成功访问首页


后来我想了一下,服务端是无法做到iframe跳出的,只能前端可以做,因此想到了js,在登入页面,我判断如果页面不是一级页面就让他变成一级,总而言之登入页面不能嵌套iframe

  if (window.parent != window){
   window.top.location.href = location.href;

  }

但是这样还是不能很好解决问题,又出现了新问题,spring security 会记住上次访问路径信息,如果我这样处理,假如我访问的是iframe的一个子页面,这时候让我从新登入,我登入,但是登入成功之后就直接跳到了那个子页面。对于这个问题,spring security中需要配置一下。

如果你复写了org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler这个类,你就需要如下配置

  
  
              
              
       
  
   
 

defaultTargetUrl指定默认登入页面,alwaysUseDefaultTargetUrl总是访问默认登入成功页面,设置成ture

这样就可以解决iframe嵌套问题

你可能感兴趣的:(架构)