likes
comments
collection
share

基于拦截器实现线上演示站点只能查看不可操作得要求

作者站长头像
站长
· 阅读数 13

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

在博主 newbee-mall-pro 这个项目中提供了线上演示站点,演示用户按照提供的后台用户账号/密码可以登录到管理后台,用户登录后台可以查看后台数据,但是不能让用户可以修改、删除、新增数据。为了在已有项目基础上达到这个要求而不失简洁,博主决定基于 Spring 得拦截器实现了的线上演示站点得只能查看不可操作得要求,当前环境说明如下:

一、 新建演示站点拦截器

新建一个 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 权限管理的后台项目中我们只需要配置用户对菜单按钮访问权限也能达到这个要求。