javascript
SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例
場(chǎng)景
SpringCloud-使用路由網(wǎng)關(guān)統(tǒng)一訪問接口(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102733039
在上面已經(jīng)實(shí)現(xiàn)使用路由網(wǎng)關(guān)統(tǒng)一訪問接口后,下面使用路由網(wǎng)關(guān)的服務(wù)過濾功能。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
前面使用Zuul實(shí)現(xiàn)路由統(tǒng)一網(wǎng)管功能。啟示Zuul還有一個(gè)功能是服務(wù)過濾功能。
只需要繼承ZuulFilter類并在類上添加@Component注解就可以了。
在項(xiàng)目包下新建filter包,包下新建類LoginFilter
package com.badao.hello.spring.cloud.zuul.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import java.io.IOException;@Component public class LoginFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);/*** 配置過濾類型,有四種不同生命周期的過濾器類型* 1. pre:路由之前* 2. routing:路由之時(shí)* 3. post:路由之后* 4. error:發(fā)送錯(cuò)誤調(diào)用* @return*/@Overridepublic String filterType() {return "pre";}/*** 配置過濾的順序* @return*/@Overridepublic int filterOrder() {return 0;}/*** 配置是否需要過濾:true/需要,false/不需要* @return*/@Overridepublic boolean shouldFilter() {return true;}/*** 過濾器的具體業(yè)務(wù)代碼* @return* @throws ZuulException*/@Overridepublic Object run() throws ZuulException {//獲取HttpServletRequest對(duì)象RequestContext context = RequestContext.getCurrentContext();HttpServletRequest request = context.getRequest();logger.info("{} >>> {}", request.getMethod(), request.getRequestURL().toString());//獲取請(qǐng)求參數(shù)token--令牌String token = request.getParameter("token");if (token == null) {logger.warn("Token is empty");//s設(shè)置Zuul響應(yīng)為falsecontext.setSendZuulResponse(false);//設(shè)置響應(yīng)狀態(tài)碼為401-沒有權(quán)限context.setResponseStatusCode(401);try {//向頁(yè)面顯示內(nèi)容context.getResponse().getWriter().write("no authority");} catch (IOException e) {}} else {logger.info("OK");}return null;} }注:
需要重寫4個(gè)方法,具體作用如下。
在具體過濾方法中,這里是判斷請(qǐng)求時(shí)是否有token參數(shù),沒有則是沒有權(quán)限。
filterType
配置過濾類型,有四種不同生命周期的過濾器類型
1. pre:路由之前
2. routing:路由之時(shí)
3. post:路由之后
4. error:發(fā)送錯(cuò)誤調(diào)用
filterOrder
配置過濾的順序,數(shù)值越小越靠前。
shouldFilter
配置是否需要過濾:true/需要,false/不需要。
Object run() throws ZuulException
過濾器的具體業(yè)務(wù)代碼
至此整個(gè)服務(wù)體系的結(jié)構(gòu)如下
?
我們依次啟動(dòng)Eureka服務(wù)、服務(wù)提供者、兩個(gè)服務(wù)消費(fèi)者、zuul的Application啟動(dòng)類
?
再打開瀏覽器輸入:
http://localhost:8769/api/a/hi?message=HelloZuul
?
?此時(shí)如果帶著token參數(shù)去請(qǐng)求,再次打開瀏覽器輸入:
http://localhost:8769/api/a/hi?message=HelloZuul&token=badao
?
總結(jié)
以上是生活随笔為你收集整理的SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud-使用路由网关统一
- 下一篇: gradle idea java ssm