SpringBoot在微服务中配置拦截器
在我们的一些业务场景中可以用到拦截器,用得好还能让代码解耦、看着舒适
举个🌰
最近做了一个商城项目,用户登录系统后会对各个业务功能作出请求,有一些业务会涉及多个微服务,用户登录后会通过网关路由到搜索微服务、搜索微服务又会进行微服务之间的访问,继续访问商品微服务查询数据。
用户登录后需要查询商品,前端点击查询按钮后会向后端发送一个请求,通过web的xml配置的dispatservlet进行拦截,随后经过一系列的过程返回一个经过渲染的视图(共12步),可移步看我的SpringMVC流程的有关博客沃。
这个都不是重点!!!
重点是我们的微服务在接受到用户的请求时候需要对其进行鉴权,倘若该用户携带的token中有对应的权限,那么微服务的前置拦截器才会 对其进行放行,并且返回结果
项目结构
直接上代码
- 拦截器
注意:这里只是在bean中注册了一个拦截器,可是还没有生效,需要额外配置一个拦截器配置类来让其生效。
package com.cheung.search.interceptor;
import com.cheung.common.auth.pojo.AppInfo;
import com.cheung.common.auth.pojo.Payload;
import com.cheung.common.auth.utils.JwtUtils;
import com.cheung.common.constants.LyConstants;
import com.cheung.search.config.JwtProperties;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 服务token验证拦截器
*/
@Component
public class AppTokenInterceptor implements HandlerInterceptor {
@Autowired
private JwtProperties jwtProps;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.获取请求的token
String appToken = request.getHeader(LyConstants.APP_TOKEN_HEADER);
if(StringUtils.isEmpty(appToken)){
//拒绝访问
return false;
}
//2.验证token的合法性
Payload<AppInfo> payload = null;
try {
payload = JwtUtils.getInfoFromToken(appToken,jwtProps.getPublicKey(),AppInfo.class);
} catch (Exception e) {
//拒绝访问
return false;
}
//3.取出token的目标服务列表
AppInfo appInfo = payload.getInfo();
List<String> targetList = appInfo.getTargetList();
//4.判断当前服务是否在目标服务列表中
if(!targetList.contains(jwtProps.getApp().getServiceName())){
//拒绝访问
return false;
}
return true;
}
}
- 拦截器配置类
spring boot抛弃了复杂的xml配置,我们可以自定义配置类(标注@Configuration注解的类)来实现WebMvcConfigurer接口,并重写addInterceptors()方法来配置拦截器:
package com.cheung.search.config;
import com.cheung.search.interceptor.AppTokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 把拦截器放入环境中
*/
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private AppTokenInterceptor appTokenInterceptor;
/**
* 用于添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* addpathPatterns():给拦截器添加拦截路径(默认值:/或/**)
* excludePathPatterns():给拦截器添加放行路径
*/
registry.addInterceptor(appTokenInterceptor);
}
}
Memorial Day is 537 days |