若依分离版集成积木报表-权限token传递(二)

集成积木报表主要有两个接口需要进行权限token传递

        查看积木报表列表:/jmreport/list

        查看积木报表详情:/jmreport/view/*

后端处理

1.自定义Token鉴权,需要实现下接口 JmReportTokenServiceI , 不实现则报表默认不做权限控制

代码实现

package com.hotspot.framework.web.service;

import com.hotspot.common.core.domain.model.LoginUser;
import com.hotspot.common.utils.StringUtils;
import com.hotspot.common.utils.TokenUtils;
import lombok.AllArgsConstructor;
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @belongsProject: 
 * @belongsPackage: com.hotspot.framework.web.service
 * @author:
 * @createTime:
 * @description: TODO
 */
@Component
@AllArgsConstructor
public class JimuReportTokenService implements JmReportTokenServiceI {

    private final TokenService tokenService;

    @Override
    public String getUsername(String token) {
        LoginUser loginUser = tokenService.getLoginUser(token);
        return loginUser.getUsername();
    }

    @Override
    public Boolean verifyToken(String token) {
        LoginUser loginUser = tokenService.getLoginUser(token);
        if(StringUtils.isNotNull(loginUser)){
            tokenService.verifyToken(loginUser);
            return true;
        }
        return false;
    }

    @Override
    public String getToken(HttpServletRequest request) {
        return TokenUtils.getTokenByRequest(request);
    }

    @Override
    public Map<String, Object> getUserInfo(String token) {
        return null;
    }
}

2.创建一个工具类TokenUtils

代码实现

package com.hotspot.common.utils;

import javax.servlet.http.HttpServletRequest;

/**
 * @belongsProject:
 * @belongsPackage: com.hotspot.common.utils
 * @author:
 * @createTime:
 * @description: TODO
 */
public class TokenUtils {

    /**
     * 获取 request 里传递的 token
     *
     * @param request
     * @return
     */
    public static String getTokenByRequest(HttpServletRequest request) {
        String parameter = request.getParameter("token");
        String header = request.getHeader("token");
        if (parameter == null && header == null) {
            parameter = request.getHeader("Authorization");
        }
        return parameter != null ? parameter : header;
    }
}

3.TokenService类中重载getLoginUser方法

代码实现

/**
 * 获取用户身份信息
 *
 * @return 用户信息
 */
public LoginUser getLoginUser(String token)
{
    if(StringUtils.isNull(token)){
        return null;
    }
    token = token.replace(Constants.TOKEN_PREFIX, "");

    if (StringUtils.isNotEmpty(token))
    {
        try
        {
            Claims claims = parseToken(token);
            // 解析对应的权限以及用户信息
            String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
            String userKey = getTokenKey(uuid);
            LoginUser user = redisCache.getCacheObject(userKey);
            return user;
        }
        catch (Exception e)
        {
        }
    }
    return null;
}

至此再访问积木报表列表:/jmreport/list就需要带上token验证了

4.针对报表预览查看请求地址进行权限控制,写spring拦截器

代码实现

package com.hotspot.framework.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.hotspot.common.core.domain.model.LoginUser;
import com.hotspot.framework.web.service.TokenService;
import lombok.AllArgsConstructor;
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;

/**
 * @author
 * @version
 * @date
 */
@Component
@AllArgsConstructor
public class JimuInterceptor implements HandlerInterceptor {

    private final TokenService tokenService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        response.setContentType("text/html; charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        String token = request.getParameter("token");
        LoginUser loginUser = tokenService.getLoginUser(token);

        if (loginUser != null) {
            return true;
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", 200);
        jsonObject.put("msg", "参数错误或无权访问数据");
        response.getWriter().println(jsonObject);
        return false;
    }
}

访问积木报表列表:/jmreport/list?token=#{token}

5.添加到自定义拦截规则中

代码实现

@Override
public void addInterceptors(InterceptorRegistry registry)
{
    registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
    registry.addInterceptor(jimuInterceptor).addPathPatterns("/jmreport/view/*");
}

前端处理

1.创建前端页面

vue页面

<template>
  <div class="app-container">
    <div v-loading="loading" :style="'height:'+ height" class="app-container">
      <iframe :src="src" id="reportView" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
    </div>
  </div>
</template>

<script>
import { getReportbb} from '@/api/ncp/cityenterprise'
import { getToken } from '@/utils/auth'

export default {
  name: "CityEnterpriseReportbb",
  data() {
    return {
      height: document.documentElement.clientHeight - 94.5 + "px;",
      // 遮罩层
      loading: true,
      // 显示搜索条件
      showSearch: true,
      src: "",
      views: "",
    };
  },
  created() {
    getReportbb().then(res => {
      this.views = res
      this.src =this.global.baseURL + this.views + "?token=Bearer " + getToken();
    })
  },
  mounted: function () {
    setTimeout(() => {
      this.loading = false;
    }, 300);
    const that = this;
    window.onresize = function temp() {
      that.height = document.documentElement.clientHeight - 94.5 + "px;";
    };
  },
};
</script>

js方法

export function getReportbb() {
  return request({
    url: '/gsjgx/cityenterprise/reportbb',
    method: 'get'
  })
}

注:this.global.baseURL是访问路径,配置在了前端

代码实现

const baseURL = 'http://localhost:9007/ncx';  //静态文件域名  开发时使用
export default {
   baseURL
}

注:9007是后台端口,ncx是后台访问路径

2.后台接口

@PreAuthorize("@ss.hasPermi('ncp:cityenterprise:reportbb')")
@GetMapping("/reportbb")
public String reportbb()
{
    SysDictData dictData = ncpCityEnterpriseService.reportbb();
    return "/jmreport/view/"+Long.parseLong(dictData.getDictValue());
}

注:后台接口主要查询返回创建报表生成的唯一id,我这里因为很多报表,用字典项查询方式处理的

3.后台配置菜单项,进行访问就可以了

注:记得链接要拼接?token=#{token},否则访问不成功

参考链接:若依集成JimuReport积木报表进行token传递_jmreport_灰色银幕的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值