Как добавить метод Precall в Spring MVC Controller - PullRequest
3 голосов
/ 05 января 2012

У меня есть одно требование для выполнения.

На самом деле, когда пользователь войдет в мое приложение, я сохраню имя пользователя, вошедшего в систему, в атрибуте сессии, например.

session.setAttribute("LOGIN_USER", userName);

Так что, если пользователь пытается получить прямой доступ к ссылкам на мой метод без исходящих со страницы входа в систему, я могу проверить в методе контроллера, имеет ли этот сеанс определенное атрибутивное значение, как показано ниже, и я могу ограничить доступ пользователя к этой странице и перенаправить его страница входа.

if(request.getSession(false).getAttribute("LOGIN_USER")==null)
 //redirect to login page

Теперь, мое требование - если у меня есть 50 методов в контроллере, я не могу добавить это условие в каждый метод. Я думаю, что есть способ, которым мы можем добавить какие-то фильтры или любой метод в классе контроллера, например ex @preExecuteMethod для сначала выполните этот метод и продолжите для фактического вызова в случае успеха.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Да, вы можете использовать HandlerInterceptor для этого.См. Документы здесь и здесь .

1 голос
/ 13 марта 2014

Перехватчик является решением. У него есть методы preHandler, которые будут вызываться перед каждым запросом. Вы можете подключиться к каждому объекту HTTPServletRequest и выполнить необходимые действия.

вот пример кода:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
        if(request.getSession(false).getAttribute("LOGIN_USER")==null) {
            //redirect to login page
        }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}
0 голосов
/ 05 января 2012

Может быть, вы могли бы использовать аспект AOP @Before, дающий pointcut методам в вашем классе обработчика?См. Ссылку здесь , или вы можете создать обычный фильтр через DelegatingFilterProxy , объясненный здесь .Я думаю, что в целом @skaffman дает лучшую идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...