В качестве услуги шлюза Zuul является внешней транзитной станцией для других услуг, а запросы пересылаются через Zuul. Это включает в себя, что некоторые данные не могут быть возвращены неповрежденными, например, учетные данные для связи между услугами, информацией о шифровании пользователей и т. Д.
Например, пользовательская служба предоставляет интерфейс входа в систему. После того, как имя пользователя и пароль верны, возвращается токен. Этот токен используется в качестве передачи пользовательской службе. Затем токен возвращается после успешного входа в систему пользователя, его необходимо зашифровать или не допустить. Прежде чем прибыть в другие интерфейсы пользовательской службы, токен необходимо проверить. Нелегальные жетоны не должны быть перенаправлены в службу пользователя, и информацию можно вернуть непосредственно на уровне шлюза.
Чтобы изменить информацию, возвращаемую службой, вам необходимо использовать фильтр Zuul. При его использовании вам нужно только унаследовать Zuulfilter и реализовать необходимые методы.
Zuul предоставляет четыре типа фильтра по умолчанию, которые идентифицируются методом фильтров.
Порядок выполняется фильтры, отсортируется методом фильма -заказов, и чем меньше значение, тем предпочтительнее он. FilterConstants определяет порядок выполнения и тип маршрутизации некоторых столбцов фильтров по умолчанию, и здесь есть большинство константов, которые необходимо использовать.
Как показано в примере, необходимо перехватить только интерфейс входа в систему, поэтому необходим только запрос для входа (/пользователь/вход). Вы можете использовать метод фильтра Shopfilter, чтобы определить, требуется ли перехват.
Поскольку модификация данных сделана после успеха пользовательской службы, тип перехвата является типом пост. Реализация всего класса следующая:
открытый класс AuthresponseFilter Extress AbstractZuulfilter {private Static Final String response_key_token = "token"; @Value ("$ {System.Config.Authfilter.Authurl}") private String Authurl; @Value ("$ {System.Config.authfilter.tokenkey}") частная строка tokenkey = response_key_token; @Autowired Private Authapi Authapi; @Override public boolean supfilter () {requestContext context = getCurrentContext (); return stringUtils.equals (context.getRequest (). getRequesturi (). ToString (), Authurl); } @Override public Object run () {try {requestContext context = getCurrentContext (); InputStream stream = context.getResponsedAtaReam (); String body = streamutils.copytostring (stream, charset.forname ("utf-8")); if (stringutils.isnotblank (body)) {gson gson = new gson (); @Suppresswarnings ("unchecked") map <string, string> result = gson.fromjson (body, map.class); if (stringutils.isnotblank (result.get (tokenkey))) {authmodel autresult = authapi.encodetoken (result.get (tokenkey)); if (autresult.getStatus ()! = httpservletresponse.sc_ok) {бросить new allogalargumentexception (autresult.geterrmsg ()); } String accessToken = autresult.getToken (); result.put (tokenkey, AccessToken); } body = gson.tojson (результат); } context.setResponsebody (body); } catch (ioException e) {rethrowruntimeexception (e); } return null; } @Override public String filterType () {return filterConstants.post_type; } @Override public int filterorder () {return filterConstants.send_response_filter_order - 2; }} В файле конфигурации добавьте URL -адрес авторизации и верните токен ключа:
System.config.authfilter.authurl =/user/login
System.config.authfilter.tokenkey = token
Context.SetResponseBody (Body); Этот код является основным, и возвращаемые данные изменяются с помощью этого метода.
Когда пользователь успешно входит в систему, шифрование токена выполняется через авторизованные службы на основе возвращенного токена. Метод шифрования здесь использует JWT. Чтобы пользователи не могли вмешиваться в информацию, незаконные запросы могут быть напрямую перехвачены на уровне шлюза.
Что касается процесса выполнения фильтра Zuul, здесь нет необходимости объяснять это здесь. Вы можете сразу сказать исходный код. Zuulservletfilter:
@Override public void dofilter (ServletRequest ServletRequest, Servletresponse Servletresponse, FilterChain FilterChain) бросает ioException, servletexception {try {init ((httpservletrequest) servletrequest, (httpservlecesonse) servletresponse); try {prerouting (); } catch (zuulexception e) {error (e); postrouting (); возвращаться; } // Переверните только в цепочку, если ответ Zuul не отправляется if (! RequestContext.getCurrentContext (). SendzUulResponse ()) {filterChain.dofilter (servletRequest, servletresponse); возвращаться; } try {routing (); } catch (zuulexception e) {error (e); postrouting (); возвращаться; } try {postrouting (); } catch (zuulexception e) {error (new zuulexception (e, 500, "uncaught_exception_from_filter_" + e.getClass (). getName ())); } наконец {requestContext.getCurrentContext (). unset (); }}Метод Описание:
Запрашиваемая пересылка может быть прекращена через Context.Setsendzuulresponse (false), но ее можно установить только в фильтрах предварительного типа.
О том, как прекратить фильтр:
Только предварительные фильтры поддерживают завершение прекращения завершения, а другие фильтры выполняются в последовательности. Более того, фильтры предварительного типа могут прекращать перенаправление только после того, как будут выполнены все фильтры предварительного типа. Фильтр не может быть прекращен и продолжить выполнение. Посмотрите на исходный код zuulservletfilter:
// Переверните только в цепочку, если ответ Zuul не отправляется if (! RequestContext.getCurrentContext (). SendzUulResponse ()) {filterChain.dofilter (servletRequest, servletresponse); возвращаться; } Код в этой статье был отправлен на: https://gitee.com/cmlbeliev/springcloud Добро пожаловать в звезду
Реализация класса в: com.cml.springcloud.api.filter.authresponsefilter в рамках проекта Api-Getway
Локальный адрес: http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.