From c3c8dcd217e912f7fc831728a1fd72afde62e427 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 7 Jul 2025 10:27:39 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20=E9=9D=A9=E5=91=BD=E6=80=A7?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=EF=BC=81JimuReport=20=E7=A7=AF=E6=9C=A8?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=20v2.1.0=20=E7=89=88=E6=9C=AC=E9=9C=87?= =?UTF-8?q?=E6=92=BC=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jimureport-example/Dockerfile | 4 +- jimureport-example/pom.xml | 2 +- .../jeecg/modules/JimuReportApplication.java | 9 +++- .../config/ApiSecurityConfigFilter.java | 4 +- .../config/CustomLoginSuccessHandler.java | 28 +++++++++- .../jmreport/config/SpringSecurityConfig.java | 1 + .../jmreport/config/ViewPageCustomAccess.java | 5 +- .../extend/JimuReportTokenServiceImpl.java | 52 +++++++++++-------- 8 files changed, 72 insertions(+), 33 deletions(-) diff --git a/jimureport-example/Dockerfile b/jimureport-example/Dockerfile index 2dc339e..3d4fbdc 100644 --- a/jimureport-example/Dockerfile +++ b/jimureport-example/Dockerfile @@ -10,6 +10,6 @@ WORKDIR /jimureport EXPOSE 8085 -ADD ./target/jimureport-example-2.0.jar ./ +ADD ./target/jimureport-example-2.1.jar ./ -CMD java -DMYSQL-HOST=jimureport-mysql -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jimureport-example-2.0.jar \ No newline at end of file +CMD java -DMYSQL-HOST=jimureport-mysql -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jimureport-example-2.1.jar \ No newline at end of file diff --git a/jimureport-example/pom.xml b/jimureport-example/pom.xml index 34711e3..d664803 100644 --- a/jimureport-example/pom.xml +++ b/jimureport-example/pom.xml @@ -12,7 +12,7 @@ jimureport-example org.jeecg jimureport-example - 2.0 + 2.1 http://www.jimureport.com 积木报表集成示例 diff --git a/jimureport-example/src/main/java/com/jeecg/modules/JimuReportApplication.java b/jimureport-example/src/main/java/com/jeecg/modules/JimuReportApplication.java index cfc40d6..4c5dd44 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/JimuReportApplication.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/JimuReportApplication.java @@ -11,14 +11,19 @@ import org.springframework.core.env.Environment; * 积木报表独立服务启动类 */ @SpringBootApplication(scanBasePackages = {"org.jeecg", "com.jeecg"}) -@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class}) +@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class}) public class JimuReportApplication { public static void main(String[] args) { ConfigurableApplicationContext application = SpringApplication.run(JimuReportApplication.class, args); Environment env = application.getEnvironment(); String port = env.getProperty("server.port"); - String path = env.containsProperty("server.servlet.context-path") ? env.getProperty("server.servlet.context-path") : ""; + String path = env.containsProperty("server.servlet.context-path")?env.getProperty("server.servlet.context-path"):""; + String currentEncoding = System.getProperty("file.encoding", "UTF-8"); + if(!currentEncoding.equalsIgnoreCase("UTF-8")){ + // 默认编码不是UTF-8设置为UTF-8 + System.setProperty("file.encoding", "UTF-8"); + } System.out.println("\n----------------------------------------------------------\n\t" + "JimuReport 积木报表平台 is running! Access URL:\n\t" + "报表工作台: \t\thttp://localhost:" + port + path + "/jmreport/list\n\t" + diff --git a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ApiSecurityConfigFilter.java b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ApiSecurityConfigFilter.java index b80467b..e0351de 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ApiSecurityConfigFilter.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ApiSecurityConfigFilter.java @@ -21,9 +21,9 @@ public class ApiSecurityConfigFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String loginFrom = req.getHeader("jm_login_from"); - if(OkConvertUtils.isNotEmpty(loginFrom)){ + if(null != loginFrom && !loginFrom.isEmpty()){ String springSecurityContext = req.getHeader("jm_spring_security_context"); - if(OkConvertUtils.isNotEmpty(springSecurityContext)){ + if(null != springSecurityContext && !springSecurityContext.isEmpty()){ SecurityContextImpl securityContext = JSONObject.parseObject(springSecurityContext, SecurityContextImpl.class); HttpSession session = req.getSession(); session.setAttribute("loginFrom", loginFrom); diff --git a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/CustomLoginSuccessHandler.java b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/CustomLoginSuccessHandler.java index fd19a33..47c1092 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/CustomLoginSuccessHandler.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/CustomLoginSuccessHandler.java @@ -1,13 +1,17 @@ package com.jeecg.modules.jmreport.config; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.savedrequest.SavedRequest; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; /** * 自定义springsecurity登录成功处理 @@ -15,6 +19,7 @@ import java.io.IOException; * @author chenrui * @date 2024/8/2 16:26 */ +@Slf4j public class CustomLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override @@ -22,6 +27,27 @@ public class CustomLoginSuccessHandler extends SavedRequestAwareAuthenticationSu Authentication authentication) throws IOException, ServletException { HttpSession session = request.getSession(); session.setAttribute("loginFrom", "jimu_example"); - super.onAuthenticationSuccess(request, response, authentication); + + SavedRequest savedRequest = (SavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST"); + String redirectUrl = savedRequest != null ? savedRequest.getRedirectUrl() : null; + + if (redirectUrl != null) { + try { + URI uri = new URI(redirectUrl); + String path = uri.getPath(); // 提取路径部分 + + if (path != null && path.startsWith("/jmreport")) { + // 路径符合要求,执行默认跳转 + super.onAuthenticationSuccess(request, response, authentication); + return; + } + } catch (URISyntaxException e) { + // URL解析失败,打印日志后继续执行默认跳转 + log.error(e.getMessage(), e); + } + } + + // 不符合 /jmreport 开头,或 redirectUrl 为 null 或异常 + response.sendRedirect("/"); } } \ No newline at end of file diff --git a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/SpringSecurityConfig.java b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/SpringSecurityConfig.java index 0540fc9..51a66e8 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/SpringSecurityConfig.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/SpringSecurityConfig.java @@ -60,6 +60,7 @@ public class SpringSecurityConfig { "/jmreport/show", "/jmreport/form/submit", "/jmreport/form/repeat/check/**", + "/jmreport/exportReport", "/jmreport/addViewCount/**").permitAll() // 仪表盘分享页面 .antMatchers("/jimubi/share/view/**", diff --git a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ViewPageCustomAccess.java b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ViewPageCustomAccess.java index 48f509d..3ef7ac8 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ViewPageCustomAccess.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/config/ViewPageCustomAccess.java @@ -21,7 +21,7 @@ public class ViewPageCustomAccess { public boolean check(HttpServletRequest request, Authentication authentication) { Object principal = authentication.getPrincipal(); - if (OkConvertUtils.isEmpty(principal) || "anonymousUser".equalsIgnoreCase(principal.toString())) { + if (null == principal || principal.toString().isEmpty() || "anonymousUser".equalsIgnoreCase(principal.toString())) { // 未登录 if (openViewPage) { // 配置文件设置了开放view页面 @@ -30,7 +30,8 @@ public class ViewPageCustomAccess { HttpServletRequest httpRequest = (HttpServletRequest) request; String previousPage = httpRequest.getParameter("previousPage"); String jmLink = httpRequest.getParameter("jmLink"); - if (OkConvertUtils.isNotEmpty(previousPage) && OkConvertUtils.isNotEmpty(jmLink) ) { + if (null != previousPage && !previousPage.isEmpty() + && null != jmLink && !jmLink.isEmpty()) { // 参数中有previousPage和jmLink return true; } diff --git a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/extend/JimuReportTokenServiceImpl.java b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/extend/JimuReportTokenServiceImpl.java index 19d875d..72822fb 100644 --- a/jimureport-example/src/main/java/com/jeecg/modules/jmreport/extend/JimuReportTokenServiceImpl.java +++ b/jimureport-example/src/main/java/com/jeecg/modules/jmreport/extend/JimuReportTokenServiceImpl.java @@ -1,8 +1,12 @@ package com.jeecg.modules.jmreport.extend; import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.jeecg.modules.jmreport.common.constant.JmConst; +import org.jeecg.modules.jmreport.common.util.JimuSpringContextUtils; +import org.jeecg.modules.jmreport.common.util.OkConvertUtils; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; + import javax.servlet.http.HttpServletRequest; /** @@ -20,31 +24,11 @@ public class JimuReportTokenServiceImpl implements JmReportTokenServiceI { */ @Override public String getToken(HttpServletRequest request) { - //System.out.println("---------call---------getToken-----------------------"); + //System.out.println("---------call---------getToken-----------------------"); //return TokenUtils.getTokenByRequest(request); return "123456"; } - /** - * 自定义获取租户 - * - * @return - */ - @Override - public String getTenantId() { -// String headerTenantId = null; -// HttpServletRequest request = JimuSpringContextUtils.getHttpServletRequest(); -// if (request != null) { -// headerTenantId = request.getHeader(JmConst.HEADER_TENANT_ID); -// if(OkConvertUtils.isEmpty(headerTenantId)){ -// headerTenantId = request.getParameter(JmConst.TENANT_ID); -// } -// } -// return headerTenantId; - return "1"; - } - - /** * 通过Token获取登录人用户名 * @param token @@ -58,7 +42,7 @@ public class JimuReportTokenServiceImpl implements JmReportTokenServiceI { /** * 自定义用户拥有的角色 - * + * * @param token * @return */ @@ -83,7 +67,7 @@ public class JimuReportTokenServiceImpl implements JmReportTokenServiceI { //drag:design:getTotalData 仪表盘对Online表单展示数据 return new String[]{"drag:datasource:testConnection","onl:drag:clear:recovery","drag:analysis:sql","drag:design:getTotalData"}; } - + /** * Token校验 * @param token @@ -107,4 +91,26 @@ public class JimuReportTokenServiceImpl implements JmReportTokenServiceI { header.add("token", "token value 2"); return header; } + + /** + * 自定义获取租户 + * + * @return + */ + @Override + public String getTenantId() { + String headerTenantId = null; + HttpServletRequest request = JimuSpringContextUtils.getHttpServletRequest(); + if (request != null) { + headerTenantId = request.getHeader(JmConst.HEADER_TENANT_KEY); + if(OkConvertUtils.isEmpty(headerTenantId)){ + headerTenantId = request.getHeader(JmConst.HEADER_TENANT_ID); + } + if(OkConvertUtils.isEmpty(headerTenantId)){ + headerTenantId = request.getParameter(JmConst.TENANT_ID); + } + } + //return headerTenantId; + return null; + } } \ No newline at end of file