思路:通過過濾器針對某一類接口鏈接進行攔截氮块,并調(diào)用HttpServletRequestWrapper 修改入?yún)?shù)。具體如下
1.第一步驟自定義過濾器對具體方法過濾
2.第二步驟? 自定義ChannelRequest 類?
重寫??getParameterNames 方法添加需要增加的參數(shù) 荣挨,重寫getParameterNames 方法 對增加的參數(shù)初始化賦值
/**
* 動態(tài)添加渠道信息
* @author songfz
* @date 2019/7/9 10:34
*/
public class ChannelRequest? extends HttpServletRequestWrapper {
private static final LoggerLOG = LoggerFactory.getLogger(ChannelRequest.class);
private Stringtoken ;
private StringchannelId;
private final ConsulPropsconsulProps = ApplicationContextHolder.getBean(ConsulProps.class);
public ChannelRequest(HttpServletRequest request) {
super(request);
token = request.getHeader(consulProps.getHeaderToken());
channelId = request.getParameter("channelId");
}
/**
* 重寫 getParameterNames 添加需要的變量名稱
? ? * @return
? ? */
? ? @Override
? ? public Enumeration getParameterNames() {
????????????Enumeration parameterNames =super.getParameterNames();
????????????ArrayList list = Collections.list(parameterNames);
????????????list.add("channelId");
????????????return Collections.enumeration(list);
????}
/**
* 重寫 getParameterValues 對添加的變量賦值
? ? * @param name
? ? * @return
? ? */
? ? @Override
? ? public String[] getParameterValues(String name) {
//? ? ? ? 判斷當(dāng)前用戶管理員還是渠道用戶
? ? ? ? if("channelId".equalsIgnoreCase(name) && StringUtils.isEmpty(channelId)){
????????ManagerTypeDto managerTypeDto = ????????ApplicationContextHolder.getBean(AuthService.class).getManagerChannelIdByToken(token);
????????if(managerTypeDto.getType().equals(Manager.ManagerType.CHANNEL.name())){
????????????????channelId = managerTypeDto.getCode();
????????????????LOG.info("獲取的渠道值:"+channelId);
? ??????????????return new String[]{channelId};
????????}
????}
????return super.getParameterValues(name);
????}
}