mvc example ajax model-view-controller spring-mvc spring-security

example - spring mvc crud ajax



Inicio de sesiĆ³n en Ajax con Spring WebMVC y Spring Security. (2)

He estado utilizando Spring Security 3.0 para el mecanismo de inicio de sesión de nuestro sitio web utilizando una página web de inicio de sesión dedicada. Ahora necesito que la página web de inicio de sesión sea una ventana de lightbox / popup en cada página web de nuestro sitio donde, al iniciar sesión, obtengo un resultado AJAX, ya sea que haya tenido éxito o no. ¿Cuál es la mejor manera de hacer esto con Spring Security y Spring webmvc 3.0?


En el lado del cliente, puede simular un envío de formulario normal a su url de inicio de sesión a través de ajax. Por ejemplo, en jQuery:

$.ajax({ url: "${pageContext.request.contextPath}/j_spring_security_check", type: "POST", data: $("#loginFormName").serialize(), beforeSend: function (xhr) { xhr.setRequestHeader("X-Ajax-call", "true"); }, success: function(result) { if (result == "ok") { ... } else if (result == "error") { ... } } });

En el lado del servidor, puede personalizar AuthenticationSuccessHandler y AuthenticationFailureHandler para devolver un valor en lugar de redirigir. Debido a que probablemente también necesite una página de inicio de sesión normal (para intentar acceder a una página segura a través de url directo), debe informar a las llamadas ajax de las llamadas normales, por ejemplo, usando el encabezado:

public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler { private AuthenticationSuccessHandler defaultHandler; public AjaxAuthenticationSuccessHandler() { } public AjaxAuthenticationSuccessHandler(AuthenticationSuccessHandler defaultHandler) { this.defaultHandler = defaultHandler; } public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { if ("true".equals(request.getHeader("X-Ajax-call"))) { response.getWriter().print("ok"); response.getWriter().flush(); } else { defaultHandler.onAuthenticationSuccess(request, response, auth); } } }


Hice algo similar (gracias axtavt):

public class AjaxAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { response.getWriter().print( "{success:true, targetUrl : /'" + this.getTargetUrlParameter() + "/'}"); response.getWriter().flush(); } else { super.onAuthenticationSuccess(request, response, auth); } }}

Elegí extender el controlador de éxito simple para el comportamiento predeterminado en solicitudes que no son Ajax. Aquí está el XML para que funcione:

<http auto-config="false" use-expressions="true" entry-point-ref="authenticationProcessingFilterEntryPoint"> <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" /> ... ... </http> <beans:bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> <beans:property name="loginFormUrl" value="/index.do" /> <beans:property name="forceHttps" value="false" /> </beans:bean> <beans:bean id="authenticationFilter" class= "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> <beans:property name="authenticationManager" ref="authenticationManager"/> <beans:property name="filterProcessesUrl" value="/j_spring_security_check"/> <beans:property name="sessionAuthenticationStrategy" ref="sas" /> <beans:property name="authenticationFailureHandler" ref="failureHandler"/> <beans:property name="authenticationSuccessHandler" ref="successHandler"/> </beans:bean> <beans:bean id="successHandler" class="foo.AjaxAuthenticationSuccessHandler"> <beans:property name="defaultTargetUrl" value="/login.html"/> </beans:bean> <beans:bean id="failureHandler" class="foo.AjaxAuthenticationFailureHandler" />