集成积木报表主要有两个接口需要进行权限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},否则访问不成功