Backend Frühling @ExceptionHandler
.
- 400 und Fehlerstring für geschäftsbezogene Ausnahmen (wird im Pop-up-Fenster angezeigt)
- 302- und Location-Header auf Fehler-/Anmeldeseite für Anwendungsausnahmen bei Browseranfragen (zur automatischen Weiterleitung durch den Browser)
- 500/400 und Location-Header auf Fehler-/Anmeldeseite für Ajax-Anfragen zur Umleitung durch Ajax-Callback
Über die Benutzersitzung an die Fehlerseite übergebene Ausnahmedetails
@Order(HIGHEST_PRECEDENCE)
public class ExceptionHandlerAdvise {
private static Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvise.class);
@Autowired
private UserInfo userInfo;
@ExceptionHandler(value = Exception.class)
protected ResponseEntity<Object> handleException(Exception ex, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
if (isBusinessException(ex)) {
logger.warn(getRequestURL(request), ex);
return new ResponseEntity<>(getUserFriendlyErrorMessage(ex), headers, BAD_REQUEST);
} else {
logger.error(getRequestURL(request), ex);
userInfo.setLastError(ex);
headers.add("Location", "/euc-portal/fault");
return new ResponseEntity<>(null, headers, isAjaxRequest(request) ? INTERNAL_SERVER_ERROR : FOUND);
}
}
}
private boolean isAjaxRequest(WebRequest request) {
return request.getHeader("x-requested-with") != null;
}
private String getRequestURL(WebRequest request) {
if (request instanceof ServletWebRequest) {
HttpServletRequest servletRequest = ((ServletWebRequest) request).getRequest();
StringBuilder uri = new StringBuilder(servletRequest.getRequestURI());
if (servletRequest.getQueryString() != null) {
uri.append("?");
uri.append(servletRequest.getQueryString());
}
return uri.toString();
}
return request.getContextPath();
}
LoginHandlerInterceptor
@Service
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Autowired
private UserInfo userInfo;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (userInfo.getPrincipal() == null && !(request.getRequestURI().contains(LOGIN_URL) || request.getRequestURI().contains(FAULT_URL) || request.getRequestURI().startsWith("/app/css"))) {
response.addHeader("Location", LOGIN_URL);
response.setStatus(isAjaxRequest(request) ? BAD_REQUEST.value() : FOUND.value());
return false;
}
return true;
}
}
Kundencode
$.post('/app/request', params).done(function(response) {
...
}).fail(function(response) {
if (response.getResponseHeader('Location')) {
window.top.location.href = response.getResponseHeader('Location');
return;
}
alert(response);
});
1 Stimmen
(nicht eine Antwort als solche) - Ich habe dies in der Vergangenheit durch Bearbeiten der Jquery-Bibliothek und Hinzufügen einer Prüfung für die Login-Seite auf jedem XHR abgeschlossen getan. Nicht die beste Lösung, weil es jedes Mal getan werden müsste, wenn Sie aktualisieren, aber es löst das Problem.
1 Stimmen
Siehe dazugehörige Frage: stackoverflow.com/questions/5941933/
0 Stimmen
El
HttpContext.Response.AddHeader
und prüfen Sie den Erfolg von ajaxsetup6 Stimmen
Warum kann der Server nicht 401 zurückgeben? In diesem Fall können Sie ein globales $.ajaxSetup haben und den Statuscode verwenden, um die Seite umzuleiten.
1 Stimmen
Dieser Link doanduyhai.wordpress.com/2012/04/21/ gibt mir die richtige Lösung
0 Stimmen
Schauen Sie sich bitte an diese Antwort .