Recientemente he implementado una solución para varias pestañas/ventanas usando Spring Security. Para iniciar sesión con éxito utilizo `LoginSucessHandler`` y establezco un nombre de ventana único en la sesión. En la página de la plantilla principal, configuré un nombre de ventana y en cada página cargué el nombre de la ventana de verificación con el nombre de la ventana de la sesión, si no es el mismo, entonces redirija a la página de error.
A continuación se presentan configuraciones y código:
@Service
public class LoginSucessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
User user = (User) authentication.getPrincipal();
String windowName = user.getUsername() + new Date().getTime();
HttpSession session = request.getSession();
session.setAttribute("windowName", windowName);
session.setAttribute("windowNameToSet", windowName);
super.onAuthenticationSuccess(request, response, authentication);
}
}
plantilla o encabezado principal página:
<script>
<%if (session.getAttribute("windowNameToSet") != null) {
out.write("window.name = '"
+ session.getAttribute("windowNameToSet") + "';");
session.removeAttribute("windowNameToSet");
}%>
if (window.name != "<%=session.getAttribute("windowName")%>") {
window.location = "<%=request.getContextPath()%>/forms/multiwindowerror.jsp";
}
</script>
Para contexto de seguridad:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
<intercept-url pattern="/**/*.hst" access="authenticated" />
<form-login login-page="/login.hst"
authentication-failure-url="/login.hst?error=true"
authentication-success-handler-ref="loginSucessHandler" />
<logout invalidate-session="true" logout-success-url="/home.hst"
logout-url="/logout.hst" />
<remember-me key="jbcp" authentication-success-handler-ref="loginSucessHandler"/>
</http>
Sólo asegúrese de que el anterior login.jsp JavaScript no está incluido.
hmm, entonces, ¿puedo abrir dos pestañas con el mismo JSESSIONID? que apesta. Me gustaría bloquear 2 pestañas. 2 navegadores no son un problema. ¿Alguien sabe de otra manera/framework/algo para hacer eso? aplausos – caarlos0