rsbi il y a 4 ans
Parent
commit
cc5db54350

+ 6 - 0
pom.xml

@@ -127,6 +127,12 @@
             <artifactId>org.mozilla.javascript</artifactId>
             <version>1.7.2</version>
         </dependency>
+        <!-- 二维码生成 -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.3.0</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet.jsp</groupId>
             <artifactId>jsp-api</artifactId>

+ 59 - 0
src/main/java/com/ruisitech/bi/service/frame/ShareAuthcFilter.java

@@ -0,0 +1,59 @@
+package com.ruisitech.bi.service.frame;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruisitech.bi.entity.common.RequestStatus;
+import com.ruisitech.bi.entity.common.Result;
+import com.ruisitech.bi.entity.frame.User;
+import com.ruisitech.bi.entity.portal.ShareUrl;
+import com.ruisitech.bi.service.portal.ShareUrlService;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.servlet.AdviceFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.util.Date;
+
+/**
+ * 用户登录验证的拦截器
+ */
+public class ShareAuthcFilter extends AdviceFilter {
+
+	public ShareAuthcFilter(ShareUrlService shareUrlService){
+		this.urlService = shareUrlService;
+	}
+
+	private ShareUrlService urlService;
+
+	@Override
+	protected boolean preHandle(ServletRequest request, ServletResponse response)
+			throws Exception {
+		Subject us = SecurityUtils.getSubject(); 
+		Session session = us.getSession();
+
+		String token = request.getParameter("token");
+		ShareUrl shareUrl = urlService.getByToken(token);
+		if(shareUrl == null){
+			response.setContentType("application/json; charset=utf-8");
+			response.setCharacterEncoding("utf-8");
+			Result r = new Result(RequestStatus.FAIL_FIELD.getStatus(), "报表不存在", null);
+			response.getWriter().print(JSONObject.toJSONString(r));
+			return false;
+		}
+		//判断是否过期
+		Date crtdate = shareUrl.getCrtdate();
+		Date now = new Date();
+		long between = (now.getTime() - crtdate.getTime()) / (1000 * 60 * 60);  //相差小时
+		if(shareUrl.getYxq() != - 1 && between  > shareUrl.getYxq()){
+			response.setContentType("application/json; charset=utf-8");
+			response.setCharacterEncoding("utf-8");
+			Result r = new Result(RequestStatus.FAIL_FIELD.getStatus(), "报表已过期", null);
+			response.getWriter().print(JSONObject.toJSONString(r));
+			return false;
+		}
+		return true;
+	}
+
+}

+ 8 - 0
src/main/java/com/ruisitech/bi/service/frame/ShiroConfig.java

@@ -5,6 +5,7 @@
  */
 package com.ruisitech.bi.service.frame;
 
+import com.ruisitech.bi.service.portal.ShareUrlService;
 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +32,9 @@ public class ShiroConfig {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private ShareUrlService shareUrlService;
+
     @Bean
     public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
@@ -38,12 +42,16 @@ public class ShiroConfig {
         //拦截器
         Map<String, Filter> filters = new LinkedHashMap<>();
         filters.put("authc", new SessionAuthcFilter(userService));
+        filters.put("shareAuthc", new ShareAuthcFilter(shareUrlService));
         shiroFilterFactoryBean.setFilters(filters);
         //注销
         shiroFilterFactoryBean.setLoginUrl("/frame/Logout.action");
         //过滤的URL
         Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
         filterChainDefinitionMap.put("/doLogin.action", "anon");
+        filterChainDefinitionMap.put("/control/extControl", "anon");
+        filterChainDefinitionMap.put("/portal/share/**", "shareAuthc");  //报表分享后的URL不用登录
+        filterChainDefinitionMap.put("/control/extShare", "shareAuthc");
         filterChainDefinitionMap.put("/**", "authc");
         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
         return shiroFilterFactoryBean;

+ 16 - 0
src/main/java/com/ruisitech/bi/web/portal/PortalIndexController.java

@@ -6,7 +6,9 @@ import com.github.pagehelper.PageInfo;
 import com.ruisitech.bi.entity.common.PageParam;
 import com.ruisitech.bi.entity.frame.User;
 import com.ruisitech.bi.entity.portal.Portal;
+import com.ruisitech.bi.entity.portal.ShareUrl;
 import com.ruisitech.bi.service.portal.PortalService;
+import com.ruisitech.bi.service.portal.ShareUrlService;
 import com.ruisitech.bi.util.BaseController;
 import com.ruisitech.bi.util.RSBIUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +26,9 @@ public class PortalIndexController extends BaseController {
 	
 	@Autowired
 	private PortalService portalService;
+
+	@Autowired
+	private ShareUrlService urlService;
 	
 	@RequestMapping(value="/delete.action")
 	public @ResponseBody
@@ -42,6 +47,17 @@ public class PortalIndexController extends BaseController {
 		return this.buildSucces(str);
 	}
 
+	@RequestMapping(value="/share/get.action")
+	public @ResponseBody
+	Object shareGet(String token) {
+		ShareUrl url = urlService.getByToken(token);
+		String str = portalService.getPortalCfg(url.getReportId());
+		if(str == null){
+			return this.buildError("报表不存在");
+		}
+		return this.buildSucces(str);
+	}
+
 	@RequestMapping(value="/list.action")
 	public @ResponseBody
 	Object list(PageParam page) {

+ 13 - 1
src/main/java/com/ruisitech/bi/web/portal/PortalViewController.java

@@ -10,8 +10,10 @@ import com.rsbi.ext.engine.view.emitter.excel.ExcelEmitter;
 import com.rsbi.ext.engine.view.emitter.pdf.PdfEmitter;
 import com.rsbi.ext.engine.view.emitter.text.TextEmitter;
 import com.rsbi.ext.engine.view.emitter.word.WordEmitter;
+import com.ruisitech.bi.entity.portal.ShareUrl;
 import com.ruisitech.bi.service.portal.PortalPageService;
 import com.ruisitech.bi.service.portal.PortalService;
+import com.ruisitech.bi.service.portal.ShareUrlService;
 import com.ruisitech.bi.util.BaseController;
 import com.ruisitech.bi.util.CompPreviewService;
 import com.ruisitech.bi.util.RSBIUtils;
@@ -40,9 +42,12 @@ public class PortalViewController extends BaseController {
 	@Autowired
 	private PortalPageService pageService;
 
+	@Autowired
+	private ShareUrlService urlService;
+
 	@RequestMapping(value="/view.action")
 	public @ResponseBody
-    Object view(String pageId, HttpServletRequest req, HttpServletResponse res) throws Exception {
+    Object view(String pageId, HttpServletRequest req, HttpServletResponse res) {
 		String cfg = portalService.getPortalCfg(pageId);
 		if(cfg == null){
 			return super.buildError("找不到报表文件。");
@@ -67,6 +72,13 @@ public class PortalViewController extends BaseController {
 			return super.buildError(ex.getMessage());
 		}
 	}
+
+	@RequestMapping(value="/share/view.action")
+	public @ResponseBody
+	Object shareView(String token, HttpServletRequest req, HttpServletResponse res) {
+		ShareUrl url = urlService.getByToken(token);
+		return this.view(url.getReportId(), req, res);
+	}
 	
 	@RequestMapping(value="/export.action")
 	public void export(String type, String pageId, String json, String picinfo, HttpServletRequest req, HttpServletResponse res) throws Exception {

+ 62 - 0
src/main/java/com/ruisitech/bi/web/portal/QRCodeController.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright 2018 本系统版权归成都睿思商智科技有限公司所有 
+ * 用户不能删除系统源码上的版权信息, 使用许可证地址:
+ * https://www.ruisitech.com/licenses/index.html
+ */
+package com.ruisitech.bi.web.portal;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.ruisitech.bi.util.RSBIUtils;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 二维码生成工具
+ * @author zxd
+ * @Date 2019年8月23日
+ */
+@Controller
+@RequestMapping(value = "/portal")
+public class QRCodeController {
+	
+	private static Logger log = Logger.getLogger(QRCodeController.class);
+
+	@RequestMapping(value = "/generateqrcode.action", method = RequestMethod.GET)
+	public @ResponseBody
+    void generateQRCode4Product(String url, HttpServletRequest request, HttpServletResponse response) {
+		try {
+			String longUrl = RSBIUtils.unescape(url);
+			// 生成二维码
+			response.setHeader("Cache-Control", "no-store");
+	        // 不设置缓存
+	        response.setHeader("Pragma", "no-cache");
+	        response.setDateHeader("Expires", 0);
+	        response.setContentType("image/png");
+	        //设置图片的文字编码以及内边框
+	        Map<EncodeHintType, Object> hints = new HashMap<>();
+	        //编码
+	        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+	        //边框距
+	        hints.put(EncodeHintType.MARGIN, 0);
+	        BitMatrix bitMatrix;
+            //参数分别为:编码内容、编码类型、图片宽度、图片高度,设置参数
+            bitMatrix = new MultiFormatWriter().encode(longUrl, BarcodeFormat.QR_CODE, 130, 130, hints);
+			// 将二维码输出到页面中
+			MatrixToImageWriter.writeToStream(bitMatrix, "png", response.getOutputStream());
+		} catch (Exception e) {
+			log.error("生成二维码异常。", e);
+		}
+	}
+}

+ 1 - 1
src/main/java/com/ruisitech/bi/web/portal/ShareController.java

@@ -38,7 +38,7 @@ public class ShareController extends BaseController {
     Object copyUrl(ShareUrl dto) {
 		dto.setrType(1);
 		urlService.saveShareUrl(dto);
-		return super.buildSucces();
+		return super.buildSucces(dto.getToken());
 	}
 
 }