开启成长之旅!这是我参与「日新计划 2 月更文应战」的第 2 天,点击检查活动概况

在博主 newbee-mall-pro 这个项目中供给了线上演示站点,演示用户依照供给的后台用户账号/暗码能够登录到办理后台,用户登录后台能够检查后台数据,可是不能让用户能够修正、删去、新增数据。为了在已有项目基础上到达这个要求而不失简洁,博主决议根据 Spring 得阻拦器完成了的线上演示站点得只能检查不行操作得要求,当前环境说明如下:

  • Spring boot版别 3.0.2
  • 演示项目地址:github.com/wayn111/new…
  • github地址:github.com/wayn111欢迎咱们关注,点个star

一、 新建演示站点阻拦器

新建一个 AdminViewModelInterceptor 类完成 HandlerInterceptor 接口,并重写 preHandle 方法,判别 viewModeltrue 就运用 ajax 返回 请下载项目源代码,演示形式无法修正! 得响应信息。

/**
 * 演示形式阻拦器
 */
public class AdminViewModelInterceptor implements HandlerInterceptor {
    private final boolean viewModel;
    public AdminViewModelInterceptor(boolean viewModel) {
        this.viewModel = viewModel;
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        if (viewModel) {
            ServletUtil.renderString(response, JSONObject.toJSONString(R.error("请下载项目源代码,演示形式无法修正!")));
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
}

二、增加WebConfig装备类

新建一个 WebConfig 类完成 WebMvcConfigurer 接口,重写 addInterceptors() 方法将咱们自己得AdminViewModelInterceptor 阻拦器注册到 Spring 中,运用 addPathPatterns() 指定阻拦途径,运用 excludePathPatterns() 指定哪些途径不需要阻拦。

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Value("${wayn.viewModel}")
    private boolean viewModel;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 后台演示形式阻拦器
        registry.addInterceptor(new AdminViewModelInterceptor(viewModel))
                .addPathPatterns("/admin/**")
                .excludePathPatterns("/admin/login").excludePathPatterns("/admin")
                .excludePathPatterns("/admin/statistics").excludePathPatterns("/admin/goods")
                .excludePathPatterns("/admin/goods/add").excludePathPatterns("/admin/goods/edit/*")
                .excludePathPatterns("/admin/goods/list").excludePathPatterns("/admin/users")
                .excludePathPatterns("/admin/users/list").excludePathPatterns("/admin/carousels")
                .excludePathPatterns("/admin/carousels/list").excludePathPatterns("/admin/indexConfigs")
                .excludePathPatterns("/admin/indexConfigs/list").excludePathPatterns("/admin/categories")
                .excludePathPatterns("/admin/categories/list").excludePathPatterns("/admin/orders")
                .excludePathPatterns("/admin/categories/listForSelect").excludePathPatterns("/admin/orders")
                .excludePathPatterns("/admin/orders/list").excludePathPatterns("/admin/coupon")
                .excludePathPatterns("/admin/coupon/list").excludePathPatterns("/admin/seckill")
                .excludePathPatterns("/admin/seckill/list").excludePathPatterns("/admin/profile")
                .excludePathPatterns("/admin/logout").excludePathPatterns("/admin/dist/**")
                .excludePathPatterns("/admin/plugins/**");
    }
}

如上代码展示,咱们指定了办理后台请求途径中一定包含得 /admin 前缀作为指定阻拦途径,这样就会阻拦后台全部请求,然后再扫除途径中,扫除掉咱们期望用户能够看到的列表数据请求途径,这样就完成了线上演示站点只能检查不能操作得需求。

三、装备文件运用环境变量

第二步中,咱们将 viewModel 传给了 AdminViewModelInterceptor 内部,为 true 就不让用户进行操作,为 false 则放过请求。咱们在本地开发时,会将 viewModel 设置为 true 方便开发,再布置到演示站点上时,会将 viewModel 设置 false,不让用户进行操作。再实际开发中,博主是不期望在布置到演示站点上时还需要修正装备文件的,假如因为人为忘掉修正会导致演示站点被人修正,那会形成脏数据问题,所以博主决议在装备文件中运用环境变量来到达不修正装备文件的要求。 装备如下:

# wayn装备
wayn:
  # 读取环境变量WAYN_VIEW_MODEL作为viewModel的成果,假如没有这个变量默以为false
  viewModel: ${WAYN_VIEW_MODEL:false} 

四、总结

其实为了完成线上演示站点只能检查不行操作得要求,还有许多其他方法,比如在一个包含 rbac 权限办理的后台项目中咱们只需要装备用户对菜单按钮访问权限也能到达这个要求。