package com.aperture_software.glados_wiki.webmvc.controllers;
import com.aperture_software.glados_wiki.exceptions.PageAclException;
import com.aperture_software.glados_wiki.servlets.WebappPath;
import com.aperture_software.glados_wiki.support.BootstrapAlertTypes;
import com.aperture_software.glados_wiki.support.FlashAlerts;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.shiro.ShiroException;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import org.springframework.web.servlet.view.RedirectView;
/**
* Created by jhyun on 13. 12. 21.
*/
@RequestMapping(value = "/error")
@ControllerAdvice
public class ErrorController {
private static Logger LOG = LoggerFactory.getLogger(ErrorController.class);
@Autowired
private FlashAlerts flashAlerts;
@ExceptionHandler(value = {UnauthenticatedException.class})
public RedirectView unauthenticated(WebRequest request) {
// @RequiresUser등으로 로그인으로 강제 전환이 이루어질때, 다시 돌아올 위치를 저장.
if (request instanceof ServletWebRequest) {
ServletWebRequest swr = (ServletWebRequest) request;
if (swr.getRequest() != null) {
// NOTE: ...이거 이외에도 ㅎㅎㅎ 페이지들 jsp으로 그대로 redirect해버림.
final String s = ObjectUtils.toString(swr.getRequest().getRequestURL());
if (false == (s.startsWith("/WEB-INF/") && s.endsWith(".jsp"))) {
LOG.debug(String.format("SAVE REQUEST FOR LOGIN-SUCCESS-REDIRECT = [%s]", swr.getRequest().getRequestURL()));
WebUtils.saveRequest(swr.getRequest());
}
}
}
return new RedirectView(String.format("%s/a/error/unauthenticated", WebappPath.getWebappPath()));
}
@RequestMapping(value = "/unauthenticated")
public RedirectView unauthenticated(RedirectAttributesModelMap redirectAttributesModelMap) {
flashAlerts.add(redirectAttributesModelMap, new FlashAlerts.FlashAlert(BootstrapAlertTypes.DANGER, "Unauthenticated!"));
return new RedirectView(String.format("%s/a/user/loginForm", WebappPath.getWebappPath()));
}
@ExceptionHandler(value = {ShiroException.class})
@RequestMapping(value = "/unauthorized")
public ModelAndView unauthorized() {
return new ModelAndView("error/unauthorized");
}
@ExceptionHandler(value = {PageAclException.class})
@RequestMapping(value = "/pageAclRequired")
public ModelAndView pageAclRequired() {
return new ModelAndView("error/pageAclRequired");
}
}