package security.filter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.springframework.security.Authentication; import org.springframework.security.AuthenticationException; import org.springframework.security.ui.webapp.AuthenticationProcessingFilter; import org.springframework.security.util.RedirectUtils; import com.alibaba.fastjson.JSON; import kernel.web.ResultObject; public class AjaxableAuthenticationProcessingFilter extends AuthenticationProcessingFilter { /** * If true, causes any redirection URLs to be calculated minus the protocol and * context path (defaults to false). */ private boolean useRelativeContext = false; public void setUseRelativeContext(boolean useRelativeContext) { this.useRelativeContext = useRelativeContext; } protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException { super.onSuccessfulAuthentication(request, response, authResult); if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { ResultObject resultObject = new ResultObject(); sendResponse(response, JSON.toJSONString(resultObject)); } } private void sendResponse(HttpServletResponse response, String jsonStr) throws UnsupportedEncodingException, IOException { response.setContentType("application/json"); response.setHeader("Access-Control-Allow-Origin", "*"); ByteArrayInputStream input = new ByteArrayInputStream(jsonStr.getBytes("UTF-8")); ServletOutputStream output = response.getOutputStream(); IOUtils.copy(input, output); IOUtils.closeQuietly(input); } protected void onUnsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException { super.onUnsuccessfulAuthentication(request, response, failed); if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { ResultObject resultObject = new ResultObject(); resultObject.setCode("1"); resultObject.setMsg(failed.getMessage()); sendResponse(response, JSON.toJSONString(resultObject)); } } protected void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException { // ignore redirect when request via ajax if (!"XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { RedirectUtils.sendRedirect(request, response, url, useRelativeContext); } } }