Spring boot 自定义过滤器,通过过滤器修改request中的body参数

实战:代码实战;

实现过滤器 。重新封装request

@Configuration
public class FilterConfig  {

    @Bean
    public FilterRegistrationBean registFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(userInfoFilterBean());
        registration.addUrlPatterns("/**/v1/*");
        registration.setName("UserinfoFilter");
        registration.setOrder(2);
        return registration;
    }

    @Bean
    public Filter userInfoFilterBean() {
     return new UserInfoFilter();
    }

public class UserInfoFilter implements Filter {

    private Logger logger = LoggerFactory.getLogger(UserInfoFilter.class);

    private SellerMapper sellerMapper;

    private String[] notexcludedUrlArray = { "/url/***/",
            "/url/***/"};

    /**
     * @return
     *
     */
    @Autowired
    public void setUserInfoFilter(SellerMapper sellerMapper) {
        this.sellerMapper = sellerMapper;
    }

    private final int ADMIN = 1;

    /**
     * 判断是否 是 子账号 操作。是的 话,设置成管理员账户
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        boolean notExcluded = false;
        String url = ((HttpServletRequest) request).getServletPath();
        System.out.println(url+"-----------");
        for (String page : notexcludedUrlArray) {//判断是否在过滤url之外
        if(url.equals(page)){
            notExcluded = true;
            System.out.println("______是不过滤的路径");
            break;
        }
        }
        if (!notExcluded) {
            logger.info("判断是否业务系统子账号操作:---");
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            logger.info(httpRequest.getRequestURI());
            JxddUserInfo userInfo = CheckUserInfoUtil.getUserInfo(httpRequest);
            if (Objects.nonNull(userInfo)) {
                SellerCriteria sellerCriteria = new SellerCriteria();
                SellerCriteria.Criteria criteria = sellerCriteria.createCriteria();
                if (Objects.nonNull(userInfo.getMemberId()) && Objects.nonNull(userInfo.getStoreId())) {
                    criteria.andMemberIdEqualTo(userInfo.getMemberId());
                    List<Seller> members = sellerMapper.selectByCriteria(sellerCriteria);
                    if (CollectionUtils.isNotEmpty(members)) {
                        if (members.get(0).getIsAdmin() == ADMIN) {
                            logger.info("主账号在操作:------");
                        } else {
                            logger.info("子账号在操作:切换------" + userInfo.getMemberId());
                            sellerCriteria.clear();
                            criteria = sellerCriteria.createCriteria();
                            criteria.andStoreIdEqualTo(userInfo.getStoreId());
                            List<Seller> list = sellerMapper.selectByCriteria(sellerCriteria);
                            if (CollectionUtils.isNotEmpty(list)) {
                                List<Seller> admins = list.stream().filter(s -> s.getIsAdmin() == ADMIN).collect(Collectors.toList());
                                if (CollectionUtils.isNotEmpty(admins)) {
                                    userInfo.setMemberId(admins.get(0).getMemberId());
                                }

                              //重新封装参数
                                HashMap m = new HashMap(request.getParameterMap());
                                m.put(JxddRequestConstants.USER_INFO, new String[] { JsonUtil.serialize(userInfo) });
                                HttpServletRequest req = (HttpServletRequest) request;
                                ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper(req, m);
                                request = wrapRequest;
                                userInfo = CheckUserInfoUtil.getUserInfo((HttpServletRequest)request);
                                logger.info("切换到主账号-------------" + userInfo.getMemberId());
                            }
                        }
                    }
            }
              chain.doFilter(request, response);
            }
        }else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

 

@SuppressWarnings("unchecked")
public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private Map params;

    public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
        super(request);
        this.params = newParams;
    }

    @Override
    public Map getParameterMap() {
        return params;
    }

    @Override
    public Enumeration getParameterNames() {
        Vector l = new Vector(params.keySet());
        return l.elements();
    }

    @Override
    public String[] getParameterValues(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            return (String[]) v;
        } else if (v instanceof String) {
            return new String[] { (String) v };
        } else {
            return new String[] { v.toString() };
        }
    }

    @Override
    public String getParameter(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            String[] strArr = (String[]) v;
            if (strArr.length > 0) {
                return strArr[0];
            } else {
                return null;
            }
        } else if (v instanceof String) {
            return (String) v;
        } else {
            return v.toString();
        }
    }

}

 

参考文章:https://blog.csdn.net/ldw_2012210765/article/details/79653827

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值