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"); } }