1. Обзор
Перехватчики используются все больше и больше, особенно после популярности программирования среза. Итак, что обычно может сделать перехватчик?
В нашем введении к агенту мы упомянули, что призыв статистических функций занимает время. Эта идея на самом деле совсем такая же, как у улучшения окружающей среды AOP.
Вообще говоря, сценарий заключается в следующем:
И другие и так далее.
2. Песчатый перехватчик
Будь то Springmvc или Springboot, мы должны упомянуть перехватчик:
org.springframework.web.servlet.handler.handlerinterceptorAdapter
Общественный абстрактный класс HandlerInterceptorAdapter реализует AsynchandlerInterceptor {// Execute @Override Public Boolean Prehandle (httpservletrequest, httpservletresponse response, обработчик объекта) Throws Exception {return true; } // Execute after the target method is executed, but before the request returns, we can still modify the ModelAndView @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {} // Execute @Override public void afterCompletion( HttpServletRequest request, Httpserservletresponse, обработчик объекта, Exception Ex) бросает исключение {} // используется для обработки асинхронных запросов. Этот метод будет инициирован, когда в контроллере @override public void aftercurrenthandlingStarted (httpservletrequest wut public void -recsome, обработанное обработчиком), вызывает исключение @override public void effercurrenthandlingstarted (httpserlectrequest, httpservletresponse метод в контроллере, httpservletresponse.Реализовать перехватчик для проверки простых разрешений
1. Настройте аннотацию разрешения @Auth
@Унаследован@target ({elementtype.type, elementtype.method})@haretention(retentionpolicy.runtime)@documentedpublic @Interface auth {String user () default ";}2. Добавить аннотации в метод контроллера
После добавления аннотаций на предыдущем этапе вы должны добавить соответствующие аннотации к методу, который вы используете следующим образом.
@Restcontroller @enableAutoConfigurationPublic Class DemoController {@Auth (user = "admin") @Requestmapping (value = "/hello", method = requestMethod.get) public String sayshello () {return "hello world".; }}3. Реализуйте функцию перехватчика
Требования: Когда пользователь обращается к URI через /hello, это подтверждается. Если это администратор, он будет выпущен, в противном случае он будет отклонен. Предположим, что идентичность пользователя находится в параметре URL.
Идея: Поэтому нам нужно проверить пользователя, прежде чем выполнять Sayshello (). Если его идентичность такая же, как идентичность в аннотации, она будет выпущена. Поэтому нам нужно суетиться в Prehandle ().
Сложность: Как мы можем получить аннотацию @Auth в методе контроллера? Глядя на три параметра Prehandle (), кажется, что никто не может предоставить аннотации в классе контроллера.
Фактически, третий обработчик параметров, в целом, его тип: org.springframework.web.method.handlermethod, и он содержит соответствующую информацию об аннотации.
Почему ты так говоришь?
В Springboot тип аннотации по умолчанию является уровнем функции, а в Springmvc его тип по умолчанию - уровень объекта контроллера.
Поэтому, если вам нужно настроить его в Dispatcher-servlet.xml в Springmvc:
<bean/>, чтобы его тип был ручным.
Давайте посмотрим на конкретную логику реализации:
@Override public boolean prehandle (httpservlectrequest, httpservletresponse response, обработчик объекта) Throws exection {System.out.println ("prehandle"); if (! handler.getClass (). isassignablefrom (handlermethod.class)) {System.out.println ("Cat Casterler to handlermethod.class"); вернуть истину; } // Получить аннотацию auth auth = ((handlermethod) обработчик) .getMethod (). GetAnnotation (auth.class); if (auth == null) {System.out.println ("Не могу найти @Auth в этом uri:" + request.getRequesturi ()); вернуть истину; } // Установите личность пользователя из параметров и проверить string admin = auth.user (); if (! admin.equals (request.getParameter ("user"))) {System.out.println ("разрешение отказано"); response.setStatus (403); вернуть ложь; } вернуть true; }Фактически, в логике реализации есть две точки: выберите идентичность из параметров и сравните ее с аннотацией.
4. Настройте перехватчик
Так как же перехватчик может быть эффективным?
В настоящее время нам нужно настроить: webmvcconfigureradapter
Конкретная реализация заключается в следующем:
@ConfigurationPublic Class ConfigAdapter Extends WebMVCConfigurerAdapter {@Override public void addInterceptors (реестр перехвата) {Registry.addinterceptor (new LoginInterceptor ()). AddPathPatterns («/hello»); }}Примечание. Здесь есть два момента. Одним из них является аннотация @configuration, так что служба Springboot может обнаружить эту конфигурацию; Другой - это совпадение конфигурации, которое предназначено для перехвата «/hello». ("/**" - это заблокировать все доступ)
4. Операция
Посетите http://127.0.0.1:8080/hello?user=admin, чтобы увидеть результаты.
Для получения подробной информации о коде в этой статье, пожалуйста, см.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.