完成自动关联应用、自动关联服务包、自动上线功能
0 parents
Showing
21 changed files
with
1935 additions
and
0 deletions
.gitignore
0 → 100644
| 1 | HELP.md | ||
| 2 | target/ | ||
| 3 | !.mvn/wrapper/maven-wrapper.jar | ||
| 4 | !**/src/main/**/target/ | ||
| 5 | !**/src/test/**/target/ | ||
| 6 | |||
| 7 | ### STS ### | ||
| 8 | .apt_generated | ||
| 9 | .classpath | ||
| 10 | .factorypath | ||
| 11 | .project | ||
| 12 | .settings | ||
| 13 | .springBeans | ||
| 14 | .sts4-cache | ||
| 15 | |||
| 16 | ### IntelliJ IDEA ### | ||
| 17 | .idea | ||
| 18 | *.iws | ||
| 19 | *.iml | ||
| 20 | *.ipr | ||
| 21 | |||
| 22 | ### NetBeans ### | ||
| 23 | /nbproject/private/ | ||
| 24 | /nbbuild/ | ||
| 25 | /dist/ | ||
| 26 | /nbdist/ | ||
| 27 | /.nb-gradle/ | ||
| 28 | build/ | ||
| 29 | !**/src/main/**/build/ | ||
| 30 | !**/src/test/**/build/ | ||
| 31 | |||
| 32 | ### VS Code ### | ||
| 33 | .vscode/ | ||
| 34 | |||
| 35 | logs/* | ||
| 36 |
pom.xml
0 → 100644
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 3 | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 4 | <modelVersion>4.0.0</modelVersion> | ||
| 5 | <parent> | ||
| 6 | <groupId>org.springframework.boot</groupId> | ||
| 7 | <artifactId>spring-boot-starter-parent</artifactId> | ||
| 8 | <version>2.3.4.RELEASE</version> | ||
| 9 | <relativePath/> <!-- lookup parent from repository --> | ||
| 10 | </parent> | ||
| 11 | <groupId>com.topdraw.platform</groupId> | ||
| 12 | <artifactId>cms-scheduler</artifactId> | ||
| 13 | <version>1.0</version> | ||
| 14 | <name>cms-scheduler</name> | ||
| 15 | <description>cms系统部分定时任务</description> | ||
| 16 | |||
| 17 | <properties> | ||
| 18 | <java.version>1.8</java.version> | ||
| 19 | </properties> | ||
| 20 | |||
| 21 | <dependencies> | ||
| 22 | <dependency> | ||
| 23 | <groupId>org.springframework.boot</groupId> | ||
| 24 | <artifactId>spring-boot-starter-web</artifactId> | ||
| 25 | </dependency> | ||
| 26 | <dependency> | ||
| 27 | <groupId>org.springframework.boot</groupId> | ||
| 28 | <artifactId>spring-boot-devtools</artifactId> | ||
| 29 | <scope>runtime</scope> | ||
| 30 | <optional>true</optional> | ||
| 31 | </dependency> | ||
| 32 | <dependency> | ||
| 33 | <groupId>org.projectlombok</groupId> | ||
| 34 | <artifactId>lombok</artifactId> | ||
| 35 | <optional>true</optional> | ||
| 36 | </dependency> | ||
| 37 | <dependency> | ||
| 38 | <groupId>org.springframework.boot</groupId> | ||
| 39 | <artifactId>spring-boot-starter-test</artifactId> | ||
| 40 | <scope>test</scope> | ||
| 41 | </dependency> | ||
| 42 | <dependency> | ||
| 43 | <groupId>org.springframework.boot</groupId> | ||
| 44 | <artifactId>spring-boot-starter-mail</artifactId> | ||
| 45 | </dependency> | ||
| 46 | <dependency> | ||
| 47 | <groupId>org.springframework.boot</groupId> | ||
| 48 | <artifactId>spring-boot-starter-jdbc</artifactId> | ||
| 49 | </dependency> | ||
| 50 | <dependency> | ||
| 51 | <groupId>com.alibaba</groupId> | ||
| 52 | <artifactId>fastjson</artifactId> | ||
| 53 | <version>1.2.73</version> | ||
| 54 | </dependency> | ||
| 55 | <dependency> | ||
| 56 | <groupId>mysql</groupId> | ||
| 57 | <artifactId>mysql-connector-java</artifactId> | ||
| 58 | <version>5.1.40</version> | ||
| 59 | </dependency> | ||
| 60 | <dependency> | ||
| 61 | <groupId>commons-dbutils</groupId> | ||
| 62 | <artifactId>commons-dbutils</artifactId> | ||
| 63 | <version>1.7</version> | ||
| 64 | </dependency> | ||
| 65 | <dependency> | ||
| 66 | <groupId>commons-codec</groupId> | ||
| 67 | <artifactId>commons-codec</artifactId> | ||
| 68 | <version>1.15</version> | ||
| 69 | </dependency> | ||
| 70 | <dependency> | ||
| 71 | <groupId>cn.hutool</groupId> | ||
| 72 | <artifactId>hutool-all</artifactId> | ||
| 73 | <version>5.5.2</version> | ||
| 74 | </dependency> | ||
| 75 | </dependencies> | ||
| 76 | |||
| 77 | <profiles> | ||
| 78 | <!-- 本地开发环境 --> | ||
| 79 | <profile> | ||
| 80 | <id>dev</id> | ||
| 81 | <properties> | ||
| 82 | <profiles.active>dev</profiles.active> | ||
| 83 | </properties> | ||
| 84 | <activation> | ||
| 85 | <!-- 默认的,不加参数时执行这个profile --> | ||
| 86 | <activeByDefault>true</activeByDefault> | ||
| 87 | </activation> | ||
| 88 | </profile> | ||
| 89 | <!-- 生产环境 --> | ||
| 90 | <profile> | ||
| 91 | <id>prod</id> | ||
| 92 | <properties> | ||
| 93 | <profiles.active>prod</profiles.active> | ||
| 94 | <modifier>-prod</modifier> | ||
| 95 | </properties> | ||
| 96 | </profile> | ||
| 97 | </profiles> | ||
| 98 | |||
| 99 | <build> | ||
| 100 | <plugins> | ||
| 101 | <plugin> | ||
| 102 | <groupId>org.springframework.boot</groupId> | ||
| 103 | <artifactId>spring-boot-maven-plugin</artifactId> | ||
| 104 | </plugin> | ||
| 105 | <plugin> | ||
| 106 | <groupId>org.apache.maven.plugins</groupId> | ||
| 107 | <artifactId>maven-surefire-plugin</artifactId> | ||
| 108 | <configuration> | ||
| 109 | <skip>true</skip> | ||
| 110 | </configuration> | ||
| 111 | </plugin> | ||
| 112 | <plugin> | ||
| 113 | <artifactId>maven-resources-plugin</artifactId> | ||
| 114 | <executions> | ||
| 115 | <execution> | ||
| 116 | <id>copy-resources</id> | ||
| 117 | <phase>package</phase> | ||
| 118 | <goals> | ||
| 119 | <goal>copy-resources</goal> | ||
| 120 | </goals> | ||
| 121 | <configuration> | ||
| 122 | <resources> | ||
| 123 | <resource> | ||
| 124 | <directory>src/main/resources/config</directory> | ||
| 125 | <includes> | ||
| 126 | <include>application.yml</include> | ||
| 127 | <include>application-${profiles.active}.yml</include> | ||
| 128 | </includes> | ||
| 129 | </resource> | ||
| 130 | </resources> | ||
| 131 | <outputDirectory>${project.build.directory}/config</outputDirectory> | ||
| 132 | </configuration> | ||
| 133 | </execution> | ||
| 134 | </executions> | ||
| 135 | </plugin> | ||
| 136 | <!-- jar包内剔除所有配置文件 --> | ||
| 137 | <plugin> | ||
| 138 | <artifactId>maven-jar-plugin</artifactId> | ||
| 139 | <configuration> | ||
| 140 | <!--不打入jar包的文件类型或者路径--> | ||
| 141 | <excludes> | ||
| 142 | <exclude>config/**</exclude> | ||
| 143 | </excludes> | ||
| 144 | </configuration> | ||
| 145 | </plugin> | ||
| 146 | </plugins> | ||
| 147 | </build> | ||
| 148 | |||
| 149 | </project> |
script/restart.sh
0 → 100644
script/shutdown.sh
0 → 100644
script/start.sh
0 → 100644
| 1 | package com.topdraw.platform; | ||
| 2 | |||
| 3 | import org.springframework.boot.SpringApplication; | ||
| 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
| 5 | import org.springframework.scheduling.annotation.EnableScheduling; | ||
| 6 | |||
| 7 | @SpringBootApplication | ||
| 8 | @EnableScheduling | ||
| 9 | public class CmsSchedulerApplication { | ||
| 10 | |||
| 11 | public static void main(String[] args) { | ||
| 12 | SpringApplication.run(CmsSchedulerApplication.class, args); | ||
| 13 | } | ||
| 14 | |||
| 15 | } |
| 1 | package com.topdraw.platform.executor; | ||
| 2 | |||
| 3 | import cn.hutool.core.util.StrUtil; | ||
| 4 | import com.topdraw.platform.util.DbUtil; | ||
| 5 | import lombok.extern.slf4j.Slf4j; | ||
| 6 | import lombok.var; | ||
| 7 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | import org.springframework.beans.factory.annotation.Value; | ||
| 9 | import org.springframework.stereotype.Component; | ||
| 10 | import org.springframework.transaction.annotation.Transactional; | ||
| 11 | |||
| 12 | import java.sql.Connection; | ||
| 13 | import java.util.HashMap; | ||
| 14 | import java.util.List; | ||
| 15 | import java.util.Map; | ||
| 16 | |||
| 17 | @Component | ||
| 18 | @Slf4j | ||
| 19 | public class AutoBindAppProcessor { | ||
| 20 | @Autowired | ||
| 21 | DbUtil dbUtil; | ||
| 22 | |||
| 23 | @Value("${entity.appId}") | ||
| 24 | private Long APP_ID; | ||
| 25 | |||
| 26 | @Transactional(rollbackFor = Exception.class) | ||
| 27 | public void execute() { | ||
| 28 | Connection connection = null; | ||
| 29 | try { | ||
| 30 | connection = dbUtil.getConnection(); | ||
| 31 | // 查询未绑定 | ||
| 32 | String sql = StrUtil.format(" select xm.id,xm.name from x_media xm LEFT JOIN x_media__app xma on xm.id = xma.media_id and xma.app_id = {} where xma.id is null limit 100 ", APP_ID); | ||
| 33 | List<Map<String, Object>> list = dbUtil.queryList(connection, sql); | ||
| 34 | // 开启事务 | ||
| 35 | dbUtil.beginTransaction(connection); | ||
| 36 | for (Map<String, Object> map : list) { | ||
| 37 | var mediaId = (Long) map.get("id"); | ||
| 38 | var mapData = new HashMap<String, Object>(); | ||
| 39 | mapData.put("media_id", mediaId); | ||
| 40 | mapData.put("app_id", APP_ID); | ||
| 41 | String objectName = "x_media__app"; | ||
| 42 | // 添加关联关系 | ||
| 43 | dbUtil.save(connection, mapData, objectName); | ||
| 44 | } | ||
| 45 | // 提交事务 | ||
| 46 | dbUtil.commitTransaction(connection); | ||
| 47 | |||
| 48 | } catch (Exception ex) { | ||
| 49 | ex.printStackTrace(); | ||
| 50 | } finally { | ||
| 51 | dbUtil.close(connection); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } |
| 1 | package com.topdraw.platform.executor; | ||
| 2 | |||
| 3 | import cn.hutool.core.util.StrUtil; | ||
| 4 | import com.topdraw.platform.util.DbUtil; | ||
| 5 | import lombok.extern.slf4j.Slf4j; | ||
| 6 | import lombok.var; | ||
| 7 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | import org.springframework.beans.factory.annotation.Value; | ||
| 9 | import org.springframework.stereotype.Component; | ||
| 10 | import org.springframework.transaction.annotation.Transactional; | ||
| 11 | |||
| 12 | import java.sql.Connection; | ||
| 13 | import java.util.HashMap; | ||
| 14 | import java.util.List; | ||
| 15 | import java.util.Map; | ||
| 16 | |||
| 17 | @Component | ||
| 18 | @Slf4j | ||
| 19 | public class AutoBindServiceProcessor { | ||
| 20 | @Autowired | ||
| 21 | DbUtil dbUtil; | ||
| 22 | |||
| 23 | @Value("${entity.serviceId}") | ||
| 24 | private Long SERVICE_ID; | ||
| 25 | |||
| 26 | @Transactional(rollbackFor = Exception.class) | ||
| 27 | public void execute() { | ||
| 28 | Connection connection = null; | ||
| 29 | try { | ||
| 30 | connection = dbUtil.getConnection(); | ||
| 31 | // 查询未绑定 | ||
| 32 | String sql = StrUtil.format(" select xm.id,xm.name from x_media xm LEFT JOIN x_service__media xsm on xm.id = xsm.media_id and xsm.service_id = {} where xsm.id is null limit 100 ", SERVICE_ID); | ||
| 33 | List<Map<String, Object>> list = dbUtil.queryList(connection, sql); | ||
| 34 | // 开启事务 | ||
| 35 | dbUtil.beginTransaction(connection); | ||
| 36 | for (Map<String, Object> map : list) { | ||
| 37 | var mediaId = (Long) map.get("id"); | ||
| 38 | var mapData = new HashMap<String, Object>(); | ||
| 39 | mapData.put("media_id", mediaId); | ||
| 40 | mapData.put("service_id", SERVICE_ID); | ||
| 41 | String objectName = "x_service__media"; | ||
| 42 | // 添加关联关系 | ||
| 43 | dbUtil.save(connection, mapData, objectName); | ||
| 44 | } | ||
| 45 | // 提交事务 | ||
| 46 | dbUtil.commitTransaction(connection); | ||
| 47 | |||
| 48 | } catch (Exception ex) { | ||
| 49 | ex.printStackTrace(); | ||
| 50 | } finally { | ||
| 51 | dbUtil.close(connection); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } |
| 1 | package com.topdraw.platform.executor; | ||
| 2 | |||
| 3 | import cn.hutool.core.date.DateUtil; | ||
| 4 | import cn.hutool.core.util.StrUtil; | ||
| 5 | import com.topdraw.platform.util.DbUtil; | ||
| 6 | import lombok.extern.slf4j.Slf4j; | ||
| 7 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | import org.springframework.stereotype.Component; | ||
| 9 | import org.springframework.transaction.annotation.Transactional; | ||
| 10 | |||
| 11 | import java.sql.Connection; | ||
| 12 | |||
| 13 | @Component | ||
| 14 | @Slf4j | ||
| 15 | public class AutoOnlineProcessor { | ||
| 16 | @Autowired | ||
| 17 | DbUtil dbUtil; | ||
| 18 | |||
| 19 | @Transactional(rollbackFor = Exception.class) | ||
| 20 | public void execute() { | ||
| 21 | Connection connection = null; | ||
| 22 | String today = DateUtil.today(); | ||
| 23 | try { | ||
| 24 | connection = dbUtil.getConnection(); | ||
| 25 | // 查询未绑定 | ||
| 26 | String sql = " update `x_media` set `status` = '001' where `status` = '000' and file_status = '001' and create_time >= ? "; | ||
| 27 | dbUtil.doExecute(connection, sql, today); | ||
| 28 | // 提交事务 | ||
| 29 | dbUtil.commitTransaction(connection); | ||
| 30 | |||
| 31 | } catch (Exception ex) { | ||
| 32 | ex.printStackTrace(); | ||
| 33 | } finally { | ||
| 34 | dbUtil.close(connection); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | } |
| 1 | package com.topdraw.platform.scheduler; | ||
| 2 | |||
| 3 | import com.topdraw.platform.executor.AutoBindAppProcessor; | ||
| 4 | import lombok.extern.slf4j.Slf4j; | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
| 7 | import org.springframework.scheduling.annotation.Scheduled; | ||
| 8 | import org.springframework.stereotype.Component; | ||
| 9 | |||
| 10 | @Component | ||
| 11 | @Slf4j | ||
| 12 | @ConditionalOnProperty(prefix = "scheduler", name = "auto-bind.app-enabled", havingValue = "true") | ||
| 13 | public class AutoBindAppScheduler { | ||
| 14 | |||
| 15 | @Autowired | ||
| 16 | private AutoBindAppProcessor autoBindAppProcessor; | ||
| 17 | |||
| 18 | @Scheduled(cron = "${cron.auto-bind.app}") | ||
| 19 | public void execute() { | ||
| 20 | log.info("schedule [自动绑定应用] start >>>>>>>>>>"); | ||
| 21 | autoBindAppProcessor.execute(); | ||
| 22 | log.info("schedule [自动绑定应用] end <<<<<<<<<<"); | ||
| 23 | } | ||
| 24 | } |
| 1 | package com.topdraw.platform.scheduler; | ||
| 2 | |||
| 3 | import com.topdraw.platform.executor.AutoBindServiceProcessor; | ||
| 4 | import lombok.extern.slf4j.Slf4j; | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
| 7 | import org.springframework.scheduling.annotation.Scheduled; | ||
| 8 | import org.springframework.stereotype.Component; | ||
| 9 | |||
| 10 | @Component | ||
| 11 | @Slf4j | ||
| 12 | @ConditionalOnProperty(prefix = "scheduler", name = "auto-bind.service-enabled", havingValue = "true") | ||
| 13 | public class AutoBindServiceScheduler { | ||
| 14 | |||
| 15 | @Autowired | ||
| 16 | private AutoBindServiceProcessor autoBindServiceProcessor; | ||
| 17 | |||
| 18 | @Scheduled(cron = "${cron.auto-bind.service}") | ||
| 19 | public void execute() { | ||
| 20 | log.info("schedule [自动绑定服务包] start >>>>>>>>>>"); | ||
| 21 | autoBindServiceProcessor.execute(); | ||
| 22 | log.info("schedule [自动绑定服务包] end <<<<<<<<<<"); | ||
| 23 | } | ||
| 24 | } |
| 1 | package com.topdraw.platform.scheduler; | ||
| 2 | |||
| 3 | import com.topdraw.platform.executor.AutoOnlineProcessor; | ||
| 4 | import lombok.extern.slf4j.Slf4j; | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
| 7 | import org.springframework.scheduling.annotation.Scheduled; | ||
| 8 | import org.springframework.stereotype.Component; | ||
| 9 | |||
| 10 | @Component | ||
| 11 | @Slf4j | ||
| 12 | @ConditionalOnProperty(prefix = "scheduler", name = "media-online-enabled", havingValue = "true") | ||
| 13 | public class AutoOnlineScheduler { | ||
| 14 | |||
| 15 | @Autowired | ||
| 16 | private AutoOnlineProcessor autoOnlineProcessor; | ||
| 17 | |||
| 18 | @Scheduled(cron = "${cron.media-online}") | ||
| 19 | public void execute() { | ||
| 20 | log.info("schedule [内容自动上线] start >>>>>>>>>>"); | ||
| 21 | autoOnlineProcessor.execute(); | ||
| 22 | log.info("schedule [内容自动上线] end <<<<<<<<<<"); | ||
| 23 | } | ||
| 24 | } |
| 1 | package com.topdraw.platform.util; | ||
| 2 | |||
| 3 | import lombok.extern.slf4j.Slf4j; | ||
| 4 | import org.apache.commons.dbutils.QueryRunner; | ||
| 5 | import org.apache.commons.dbutils.ResultSetHandler; | ||
| 6 | import org.apache.commons.dbutils.handlers.MapHandler; | ||
| 7 | import org.apache.commons.dbutils.handlers.MapListHandler; | ||
| 8 | import org.springframework.stereotype.Component; | ||
| 9 | import org.springframework.util.StringUtils; | ||
| 10 | |||
| 11 | import javax.annotation.Resource; | ||
| 12 | import javax.sql.DataSource; | ||
| 13 | import java.sql.Connection; | ||
| 14 | import java.sql.ResultSet; | ||
| 15 | import java.sql.SQLException; | ||
| 16 | import java.util.*; | ||
| 17 | |||
| 18 | @Component | ||
| 19 | @Slf4j | ||
| 20 | public class DbUtil { | ||
| 21 | @Resource | ||
| 22 | DataSource dataSource; | ||
| 23 | |||
| 24 | public Connection getConnection() throws SQLException { | ||
| 25 | Connection connection = null; | ||
| 26 | if (dataSource != null) { | ||
| 27 | connection = dataSource.getConnection(); | ||
| 28 | connection.setAutoCommit(true); | ||
| 29 | } | ||
| 30 | return connection; | ||
| 31 | } | ||
| 32 | |||
| 33 | public void close(Connection conn) { | ||
| 34 | if (conn != null) { | ||
| 35 | try { | ||
| 36 | if (!conn.isClosed()) { | ||
| 37 | conn.close(); | ||
| 38 | } | ||
| 39 | } catch (SQLException e) { | ||
| 40 | e.printStackTrace(); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | /** | ||
| 46 | * 查询唯一结果集 | ||
| 47 | * | ||
| 48 | * @param conn | ||
| 49 | * @param strSqlCommand | ||
| 50 | * @param parameters | ||
| 51 | * @return | ||
| 52 | * @throws SQLException | ||
| 53 | */ | ||
| 54 | public Map<String, Object> queryUniqueResult(Connection conn, String strSqlCommand, Object... parameters) | ||
| 55 | throws SQLException { | ||
| 56 | QueryRunner runner = new QueryRunner(); | ||
| 57 | MapHandler handler = new MapHandler(); | ||
| 58 | return runner.query(conn, strSqlCommand, handler, parameters); | ||
| 59 | } | ||
| 60 | |||
| 61 | /** | ||
| 62 | * 列表查询 | ||
| 63 | * | ||
| 64 | * @param conn | ||
| 65 | * @param strSqlCommand | ||
| 66 | * @param parameters | ||
| 67 | * @return | ||
| 68 | * @throws Exception | ||
| 69 | */ | ||
| 70 | public List<Map<String, Object>> queryList(Connection conn, String strSqlCommand, Object... parameters) | ||
| 71 | throws SQLException { | ||
| 72 | QueryRunner runner = new QueryRunner(); | ||
| 73 | MapListHandler handler = new MapListHandler(); | ||
| 74 | return runner.query(conn, strSqlCommand, handler, parameters); | ||
| 75 | } | ||
| 76 | |||
| 77 | /*** | ||
| 78 | * 记录保存 | ||
| 79 | * | ||
| 80 | * @param conn | ||
| 81 | * @param mapData | ||
| 82 | * @param objectName | ||
| 83 | * @return | ||
| 84 | * @throws SQLException | ||
| 85 | */ | ||
| 86 | public <T> T save(Connection conn, Map<String, Object> mapData, String objectName) throws SQLException { | ||
| 87 | if (!mapData.containsKey("update_time") || mapData.get("update_time") == null) { | ||
| 88 | mapData.put("update_time", new Date()); | ||
| 89 | } | ||
| 90 | if (!mapData.containsKey("create_time") || mapData.get("create_time") == null) { | ||
| 91 | mapData.put("create_time", new Date()); | ||
| 92 | } | ||
| 93 | Iterator<String> it = mapData.keySet().iterator(); | ||
| 94 | |||
| 95 | String key; | ||
| 96 | StringBuilder sbInsert = new StringBuilder(); | ||
| 97 | sbInsert.append("INSERT INTO ").append(objectName); | ||
| 98 | |||
| 99 | List<Object> valueList = new ArrayList<>(); | ||
| 100 | List<String> filedNameList = new ArrayList<>(); | ||
| 101 | List<String> preValueList = new ArrayList<>(); | ||
| 102 | |||
| 103 | while (it.hasNext()) { | ||
| 104 | key = it.next(); | ||
| 105 | filedNameList.add(key); | ||
| 106 | preValueList.add("?"); | ||
| 107 | valueList.add(mapData.get(key)); | ||
| 108 | } | ||
| 109 | sbInsert.append(" ( `").append(StringUtils.collectionToDelimitedString(filedNameList, "`,`")) | ||
| 110 | .append("` ) VALUES ( ").append(StringUtils.collectionToDelimitedString(preValueList, ",")).append(")"); | ||
| 111 | QueryRunner run = new QueryRunner(); | ||
| 112 | |||
| 113 | return run.insert(conn, sbInsert.toString(), new InsertResultHandler<T>(), valueList.toArray()); | ||
| 114 | } | ||
| 115 | |||
| 116 | private class InsertResultHandler<T> implements ResultSetHandler<T> { | ||
| 117 | @SuppressWarnings("unchecked") | ||
| 118 | @Override | ||
| 119 | public T handle(ResultSet rs) throws SQLException { | ||
| 120 | T t; | ||
| 121 | if (rs.next()) { | ||
| 122 | t = (T) rs.getObject(1); | ||
| 123 | } else { | ||
| 124 | // throw new NoIdGeneratedException("No id generated from database..."); | ||
| 125 | return null; | ||
| 126 | } | ||
| 127 | return t; | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | /** | ||
| 132 | * 记录更新 | ||
| 133 | * | ||
| 134 | * @param conn | ||
| 135 | * @param mapData | ||
| 136 | * @param objectName | ||
| 137 | * @param strPrimaryKey | ||
| 138 | * @return | ||
| 139 | * @throws SQLException | ||
| 140 | */ | ||
| 141 | public long update(Connection conn, Map<String, Object> mapData, String objectName, String strPrimaryKey) | ||
| 142 | throws SQLException { | ||
| 143 | if (!mapData.containsKey("update_time") || mapData.get("update_time") == null) { | ||
| 144 | mapData.put("update_time", new Date()); | ||
| 145 | } | ||
| 146 | |||
| 147 | Iterator<String> it = mapData.keySet().iterator(); | ||
| 148 | String key; | ||
| 149 | List<Object> valList = new ArrayList<>(); | ||
| 150 | StringBuffer updateSql = new StringBuffer(128); | ||
| 151 | updateSql.append("UPDATE ").append(objectName).append(" SET "); | ||
| 152 | while (it.hasNext()) { | ||
| 153 | key = it.next(); | ||
| 154 | if (key.equalsIgnoreCase(strPrimaryKey)) { | ||
| 155 | continue; | ||
| 156 | } | ||
| 157 | updateSql.append("`" + key + "`").append("=?,"); | ||
| 158 | valList.add(mapData.get(key)); | ||
| 159 | } | ||
| 160 | updateSql.deleteCharAt(updateSql.length() - 1); | ||
| 161 | updateSql.append(" WHERE `" + strPrimaryKey + "`= ? "); | ||
| 162 | valList.add(mapData.get(strPrimaryKey)); | ||
| 163 | return doExecute(conn, updateSql.toString(), valList.toArray()); | ||
| 164 | } | ||
| 165 | |||
| 166 | /** | ||
| 167 | * sql执行 | ||
| 168 | * | ||
| 169 | * @param conn | ||
| 170 | * @param sql | ||
| 171 | * @param parameters | ||
| 172 | * @return | ||
| 173 | * @throws SQLException | ||
| 174 | */ | ||
| 175 | public long doExecute(Connection conn, String sql, Object... parameters) throws SQLException { | ||
| 176 | QueryRunner runner = new QueryRunner(); | ||
| 177 | return runner.update(conn, sql, parameters); | ||
| 178 | } | ||
| 179 | |||
| 180 | /** | ||
| 181 | * 按主键删除记录 | ||
| 182 | * | ||
| 183 | * @param conn | ||
| 184 | * @param objectName | ||
| 185 | * @param id | ||
| 186 | * @return | ||
| 187 | */ | ||
| 188 | public int deleteById(Connection conn, String objectName, String id) throws SQLException { | ||
| 189 | String sql = "DELETE FROM " + objectName + " WHERE id = ? "; | ||
| 190 | QueryRunner runner = new QueryRunner(); | ||
| 191 | return runner.update(conn, sql, id); | ||
| 192 | } | ||
| 193 | |||
| 194 | public void beginTransaction(Connection connection) throws Exception { | ||
| 195 | connection.setAutoCommit(false); | ||
| 196 | connection.setReadOnly(false); | ||
| 197 | } | ||
| 198 | |||
| 199 | public void commitTransaction(Connection connection) throws SQLException { | ||
| 200 | if (!connection.getAutoCommit()) { | ||
| 201 | connection.commit(); | ||
| 202 | } | ||
| 203 | } | ||
| 204 | |||
| 205 | public void rollbackTransaction(Connection connection) throws SQLException { | ||
| 206 | if (!connection.getAutoCommit()) { | ||
| 207 | connection.rollback(); | ||
| 208 | } | ||
| 209 | } | ||
| 210 | } |
| 1 | package com.topdraw.platform.util; | ||
| 2 | |||
| 3 | /* | ||
| 4 | MessageDigest md = MessageDigest.getInstance("SHA"); | ||
| 5 | |||
| 6 | try { | ||
| 7 | md.update(toChapter1); | ||
| 8 | MessageDigest tc1 = md.clone(); | ||
| 9 | byte[] toChapter1Digest = tc1.digest(); | ||
| 10 | md.update(toChapter2); | ||
| 11 | ...etc. | ||
| 12 | } catch (CloneNotSupportedException cnse) { | ||
| 13 | throw new DigestException("couldn't make digest of partial content"); | ||
| 14 | } | ||
| 15 | */ | ||
| 16 | |||
| 17 | import org.apache.commons.codec.binary.Hex; | ||
| 18 | import org.apache.tomcat.util.codec.binary.Base64; | ||
| 19 | |||
| 20 | import java.io.UnsupportedEncodingException; | ||
| 21 | import java.security.MessageDigest; | ||
| 22 | import java.security.NoSuchAlgorithmException; | ||
| 23 | |||
| 24 | /** | ||
| 25 | * @author zehui.zeng | ||
| 26 | * @date 13-3-17 下午9:23 | ||
| 27 | */ | ||
| 28 | public class MD5Util { | ||
| 29 | private final String algorithm; | ||
| 30 | private boolean encodeHashAsBase64 = false; | ||
| 31 | private static MD5Util md5 = null; | ||
| 32 | |||
| 33 | /** | ||
| 34 | * The digest algorithm to use | ||
| 35 | * Supports the named <a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppA"> | ||
| 36 | * Message Digest Algorithms</a> in the Java environment. | ||
| 37 | * | ||
| 38 | * @param algorithm | ||
| 39 | */ | ||
| 40 | public MD5Util(String algorithm) { | ||
| 41 | this(algorithm, false); | ||
| 42 | } | ||
| 43 | |||
| 44 | public MD5Util(){ | ||
| 45 | this.algorithm = "MD5"; | ||
| 46 | } | ||
| 47 | |||
| 48 | /** | ||
| 49 | * Convenience constructor for specifying the algorithm and whether or not to enable base64 encoding | ||
| 50 | * | ||
| 51 | * @param algorithm | ||
| 52 | * @param encodeHashAsBase64 | ||
| 53 | * @throws IllegalArgumentException if an unknown | ||
| 54 | */ | ||
| 55 | public MD5Util(String algorithm, boolean encodeHashAsBase64) throws IllegalArgumentException { | ||
| 56 | this.algorithm = algorithm; | ||
| 57 | setEncodeHashAsBase64(encodeHashAsBase64); | ||
| 58 | //Validity Check | ||
| 59 | getMessageDigest(); | ||
| 60 | } | ||
| 61 | |||
| 62 | public static String encodePassword(String passwd){ | ||
| 63 | if(md5 == null){ | ||
| 64 | md5 = new MD5Util(); | ||
| 65 | } | ||
| 66 | return md5.encodePassword(passwd, ""); | ||
| 67 | } | ||
| 68 | |||
| 69 | |||
| 70 | |||
| 71 | /** | ||
| 72 | * Encodes the rawPass using a MessageDigest. | ||
| 73 | * If a salt is specified it will be merged with the password before encoding. | ||
| 74 | * | ||
| 75 | * @param rawPass The plain text password | ||
| 76 | * @param salt The salt to sprinkle | ||
| 77 | * @return Hex string of password digest (or base64 encoded string if encodeHashAsBase64 is enabled. | ||
| 78 | */ | ||
| 79 | public String encodePassword(String rawPass, Object salt) { | ||
| 80 | String saltedPass = mergePasswordAndSalt(rawPass, salt, false); | ||
| 81 | |||
| 82 | MessageDigest messageDigest = getMessageDigest(); | ||
| 83 | |||
| 84 | byte[] digest; | ||
| 85 | |||
| 86 | try { | ||
| 87 | digest = messageDigest.digest(saltedPass.getBytes("UTF-8")); | ||
| 88 | } catch (UnsupportedEncodingException e) { | ||
| 89 | throw new IllegalStateException("UTF-8 not supported!"); | ||
| 90 | } | ||
| 91 | |||
| 92 | if (getEncodeHashAsBase64()) { | ||
| 93 | return new String(Base64.encodeBase64(digest)); | ||
| 94 | } else { | ||
| 95 | return new String(Hex.encodeHex(digest)); | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | /** | ||
| 100 | * Get a MessageDigest instance for the given algorithm. | ||
| 101 | * Throws an IllegalArgumentException if <i>algorithm</i> is unknown | ||
| 102 | * | ||
| 103 | * @return MessageDigest instance | ||
| 104 | * @throws IllegalArgumentException if NoSuchAlgorithmException is thrown | ||
| 105 | */ | ||
| 106 | protected final MessageDigest getMessageDigest() throws IllegalArgumentException { | ||
| 107 | try { | ||
| 108 | return MessageDigest.getInstance(algorithm); | ||
| 109 | } catch (NoSuchAlgorithmException e) { | ||
| 110 | throw new IllegalArgumentException("No such algorithm [" + algorithm + "]"); | ||
| 111 | } | ||
| 112 | } | ||
| 113 | |||
| 114 | /** | ||
| 115 | * Takes a previously encoded password and compares it with a rawpassword after mixing in the salt and | ||
| 116 | * encoding that value | ||
| 117 | * | ||
| 118 | * @param encPass previously encoded password | ||
| 119 | * @param rawPass plain text password | ||
| 120 | * @param salt salt to mix into password | ||
| 121 | * @return true or false | ||
| 122 | */ | ||
| 123 | public boolean isPasswordValid(String encPass, String rawPass, Object salt) { | ||
| 124 | String pass1 = "" + encPass; | ||
| 125 | String pass2 = encodePassword(rawPass, salt); | ||
| 126 | |||
| 127 | return pass1.equals(pass2); | ||
| 128 | } | ||
| 129 | |||
| 130 | |||
| 131 | /** | ||
| 132 | * Used by subclasses to extract the password and salt from a merged <code>String</code> created using | ||
| 133 | * {@link #mergePasswordAndSalt(String,Object,boolean)}.<p>The first element in the returned array is the | ||
| 134 | * password. The second element is the salt. The salt array element will always be present, even if no salt was | ||
| 135 | * found in the <code>mergedPasswordSalt</code> argument.</p> | ||
| 136 | * | ||
| 137 | * @param mergedPasswordSalt as generated by <code>mergePasswordAndSalt</code> | ||
| 138 | * | ||
| 139 | * @return an array, in which the first element is the password and the second the salt | ||
| 140 | * | ||
| 141 | * @throws IllegalArgumentException if mergedPasswordSalt is null or empty. | ||
| 142 | */ | ||
| 143 | protected String[] demergePasswordAndSalt(String mergedPasswordSalt) { | ||
| 144 | if ((mergedPasswordSalt == null) || "".equals(mergedPasswordSalt)) { | ||
| 145 | throw new IllegalArgumentException("Cannot pass a null or empty String"); | ||
| 146 | } | ||
| 147 | |||
| 148 | String password = mergedPasswordSalt; | ||
| 149 | String salt = ""; | ||
| 150 | |||
| 151 | int saltBegins = mergedPasswordSalt.lastIndexOf("{"); | ||
| 152 | |||
| 153 | if ((saltBegins != -1) && ((saltBegins + 1) < mergedPasswordSalt.length())) { | ||
| 154 | salt = mergedPasswordSalt.substring(saltBegins + 1, mergedPasswordSalt.length() - 1); | ||
| 155 | password = mergedPasswordSalt.substring(0, saltBegins); | ||
| 156 | } | ||
| 157 | |||
| 158 | return new String[] {password, salt}; | ||
| 159 | } | ||
| 160 | |||
| 161 | /** | ||
| 162 | * Used by subclasses to generate a merged password and salt <code>String</code>.<P>The generated password | ||
| 163 | * will be in the form of <code>password{salt}</code>.</p> | ||
| 164 | * <p>A <code>null</code> can be passed to either method, and will be handled correctly. If the | ||
| 165 | * <code>salt</code> is <code>null</code> or empty, the resulting generated password will simply be the passed | ||
| 166 | * <code>password</code>. The <code>toString</code> method of the <code>salt</code> will be used to represent the | ||
| 167 | * salt.</p> | ||
| 168 | * | ||
| 169 | * @param password the password to be used (can be <code>null</code>) | ||
| 170 | * @param salt the salt to be used (can be <code>null</code>) | ||
| 171 | * @param strict ensures salt doesn't contain the delimiters | ||
| 172 | * | ||
| 173 | * @return a merged password and salt <code>String</code> | ||
| 174 | * | ||
| 175 | * @throws IllegalArgumentException if the salt contains '{' or '}' characters. | ||
| 176 | */ | ||
| 177 | protected String mergePasswordAndSalt(String password, Object salt, boolean strict) { | ||
| 178 | if (password == null) { | ||
| 179 | password = ""; | ||
| 180 | } | ||
| 181 | |||
| 182 | if (strict && (salt != null)) { | ||
| 183 | if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) { | ||
| 184 | throw new IllegalArgumentException("Cannot use { or } in salt.toString()"); | ||
| 185 | } | ||
| 186 | } | ||
| 187 | |||
| 188 | if ((salt == null) || "".equals(salt)) { | ||
| 189 | return password; | ||
| 190 | } else { | ||
| 191 | return password + "{" + salt.toString() + "}"; | ||
| 192 | } | ||
| 193 | } | ||
| 194 | |||
| 195 | public String getAlgorithm() { | ||
| 196 | return algorithm; | ||
| 197 | } | ||
| 198 | |||
| 199 | public boolean getEncodeHashAsBase64() { | ||
| 200 | return encodeHashAsBase64; | ||
| 201 | } | ||
| 202 | |||
| 203 | /** | ||
| 204 | * The encoded password is normally returned as Hex (32 char) version of the hash bytes. Setting this | ||
| 205 | * property to true will cause the encoded pass to be returned as Base64 text, which will consume 24 characters. | ||
| 206 | * | ||
| 207 | * @param encodeHashAsBase64 set to true for Base64 output | ||
| 208 | */ | ||
| 209 | public void setEncodeHashAsBase64(boolean encodeHashAsBase64) { | ||
| 210 | this.encodeHashAsBase64 = encodeHashAsBase64; | ||
| 211 | } | ||
| 212 | |||
| 213 | public static void main(String[] args){ | ||
| 214 | System.out.println(MD5Util.encodePassword("system1")); | ||
| 215 | } | ||
| 216 | |||
| 217 | |||
| 218 | } |
| 1 | package com.topdraw.platform.util; | ||
| 2 | |||
| 3 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 4 | import org.springframework.beans.factory.annotation.Value; | ||
| 5 | import org.springframework.mail.SimpleMailMessage; | ||
| 6 | import org.springframework.mail.javamail.JavaMailSender; | ||
| 7 | import org.springframework.stereotype.Component; | ||
| 8 | |||
| 9 | @Component | ||
| 10 | public class MailUtil { | ||
| 11 | |||
| 12 | @Autowired | ||
| 13 | private JavaMailSender javaMailSender; | ||
| 14 | |||
| 15 | @Value("${spring.mail.username}") | ||
| 16 | private String from; | ||
| 17 | |||
| 18 | @Value("${spring.mail.developer-mail-address}") | ||
| 19 | private String to; | ||
| 20 | |||
| 21 | public void sendSimpleMail(String subject, String text) { | ||
| 22 | SimpleMailMessage message = new SimpleMailMessage(); | ||
| 23 | message.setFrom(from); | ||
| 24 | message.setTo(to); | ||
| 25 | message.setSubject(subject); | ||
| 26 | message.setText(text); | ||
| 27 | javaMailSender.send(message); | ||
| 28 | } | ||
| 29 | } |
| 1 | package com.topdraw.platform.util; | ||
| 2 | |||
| 3 | |||
| 4 | import lombok.extern.slf4j.Slf4j; | ||
| 5 | |||
| 6 | import javax.net.ssl.HttpsURLConnection; | ||
| 7 | import javax.net.ssl.SSLContext; | ||
| 8 | import javax.net.ssl.SSLSocketFactory; | ||
| 9 | import javax.net.ssl.TrustManager; | ||
| 10 | import javax.servlet.http.HttpServletRequest; | ||
| 11 | import javax.servlet.http.HttpServletResponse; | ||
| 12 | import java.io.*; | ||
| 13 | import java.net.HttpURLConnection; | ||
| 14 | import java.net.URL; | ||
| 15 | import java.net.URLConnection; | ||
| 16 | import java.util.List; | ||
| 17 | import java.util.Map; | ||
| 18 | import java.util.Set; | ||
| 19 | |||
| 20 | |||
| 21 | /** | ||
| 22 | * 通过HTTP协议 访问服务器 | ||
| 23 | * | ||
| 24 | * @author LucaMa | ||
| 25 | * | ||
| 26 | */ | ||
| 27 | @Slf4j | ||
| 28 | public class WebUtil { | ||
| 29 | public static boolean LOG = false; | ||
| 30 | |||
| 31 | /** | ||
| 32 | * 向指定URL发送GET方法的请求 | ||
| 33 | * | ||
| 34 | * @param url | ||
| 35 | * 发送请求的URL | ||
| 36 | * @param param | ||
| 37 | * 请求参数,请求参数应该是name1=value1&name2=value2的形式。 | ||
| 38 | * @return URL所代表远程资源的响应 | ||
| 39 | */ | ||
| 40 | public static String sendGet(String url, boolean needRedirect) { | ||
| 41 | return sendGet(url, null, "UTF-8", null, needRedirect); | ||
| 42 | } | ||
| 43 | |||
| 44 | public static String sendGet(String url, String param, String charset) { | ||
| 45 | return sendGet(url, param, charset, null, true); | ||
| 46 | } | ||
| 47 | |||
| 48 | public static String sendGet(String url, String param, String charset, Integer timeout) { | ||
| 49 | return sendGet(url, param, charset, timeout, timeout, true); | ||
| 50 | } | ||
| 51 | |||
| 52 | public static String sendGet(String url, String param, String charset, Integer timeout, boolean needRedirect) { | ||
| 53 | return sendGet(url, param, charset, timeout, timeout, needRedirect); | ||
| 54 | } | ||
| 55 | |||
| 56 | public static String sendGet(String url, String param, String charset, Integer connectTimeout, | ||
| 57 | Integer readTimeout) { | ||
| 58 | return sendGet(url, param, charset, connectTimeout, readTimeout, true); | ||
| 59 | } | ||
| 60 | |||
| 61 | public static String sendGet(String url, String param, String charset, Integer connectTimeout,Integer readTimeout,boolean needRedirect) { | ||
| 62 | String result = ""; | ||
| 63 | StringBuilder sbResult = new StringBuilder(); | ||
| 64 | BufferedReader in = null; | ||
| 65 | try { | ||
| 66 | String urlName = url + ((null != param && !"".equals(param)) ? ("?" + param) : ""); | ||
| 67 | URL realUrl = new URL(urlName); | ||
| 68 | // 打开和URL之间的连接 | ||
| 69 | HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection(); | ||
| 70 | // 设置通用的请求属性 | ||
| 71 | conn.setInstanceFollowRedirects(needRedirect); | ||
| 72 | conn.setRequestProperty("accept", "*/*"); | ||
| 73 | conn.setRequestProperty("charset", charset); | ||
| 74 | if (null != connectTimeout && connectTimeout > 0) { | ||
| 75 | conn.setConnectTimeout(connectTimeout); | ||
| 76 | } | ||
| 77 | if (null != readTimeout && readTimeout > 0) { | ||
| 78 | conn.setReadTimeout(readTimeout); | ||
| 79 | } | ||
| 80 | //conn.setRequestProperty("charset", conn.setRequestProperty("charset", charset);;); | ||
| 81 | conn.setRequestProperty("connection", "Keep-Alive"); | ||
| 82 | conn.setRequestProperty("user-agent", | ||
| 83 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); | ||
| 84 | // 建立实际的连接 | ||
| 85 | conn.connect(); | ||
| 86 | // 获取所有响应头字段 | ||
| 87 | Map<String, List<String>> map = conn.getHeaderFields(); | ||
| 88 | // 遍历所有的响应头字段 | ||
| 89 | for (String key : map.keySet()) { | ||
| 90 | if(LOG){ | ||
| 91 | log.info(key + "--->" + map.get(key)); | ||
| 92 | } | ||
| 93 | } | ||
| 94 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 95 | in = new BufferedReader( | ||
| 96 | new InputStreamReader(conn.getInputStream(),charset)); | ||
| 97 | String line; | ||
| 98 | while ((line = in.readLine()) != null) { | ||
| 99 | sbResult.append(line).append("\n"); | ||
| 100 | } | ||
| 101 | if (null != sbResult && sbResult.length() > 0) { | ||
| 102 | sbResult.setLength(sbResult.length() - 1); | ||
| 103 | } | ||
| 104 | result = sbResult.toString(); | ||
| 105 | } catch (Exception e) { | ||
| 106 | //System.out.println("发送GET请求出现异常!" + e); | ||
| 107 | e.printStackTrace(); | ||
| 108 | //throw e; | ||
| 109 | } | ||
| 110 | // 使用finally块来关闭输入流 | ||
| 111 | finally { | ||
| 112 | try { | ||
| 113 | if (in != null) { | ||
| 114 | in.close(); | ||
| 115 | } | ||
| 116 | } catch (IOException ex) { | ||
| 117 | ex.printStackTrace(); | ||
| 118 | } | ||
| 119 | } | ||
| 120 | return result; | ||
| 121 | } | ||
| 122 | |||
| 123 | |||
| 124 | public static String sendGet(String url, Map<String,String> mapParam , String charset) { | ||
| 125 | StringBuilder sbParam=new StringBuilder(""); | ||
| 126 | int i1=0; | ||
| 127 | Set<String> setKey=mapParam.keySet(); | ||
| 128 | for (String strKey : setKey ) { | ||
| 129 | |||
| 130 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 131 | if (i1<setKey.size()-1){ | ||
| 132 | sbParam.append("&"); | ||
| 133 | } | ||
| 134 | i1++; | ||
| 135 | } | ||
| 136 | return sendGet(url, sbParam.toString(), charset); | ||
| 137 | } | ||
| 138 | |||
| 139 | |||
| 140 | /** | ||
| 141 | * 向指定URL发送POST方法的请求 | ||
| 142 | * | ||
| 143 | * @param url | ||
| 144 | * 发送请求的URL | ||
| 145 | * @param param | ||
| 146 | * 请求参数,请求参数应该是name1=value1&name2=value2的形式。 | ||
| 147 | * @return URL所代表远程资源的响应 | ||
| 148 | */ | ||
| 149 | public static String sendPost(String url, String param , String charset, String contentType) { | ||
| 150 | PrintWriter out = null; | ||
| 151 | BufferedReader in = null; | ||
| 152 | String result = ""; | ||
| 153 | StringBuilder sbResult = new StringBuilder(); | ||
| 154 | try { | ||
| 155 | URL realUrl = new URL(url); | ||
| 156 | // 打开和URL之间的连接 | ||
| 157 | URLConnection conn = realUrl.openConnection(); | ||
| 158 | // 设置通用的请求属性 | ||
| 159 | conn.setRequestProperty("accept", "*/*"); | ||
| 160 | conn.setRequestProperty("charset", charset); | ||
| 161 | |||
| 162 | if (null!=contentType && !contentType.isEmpty()){ | ||
| 163 | conn.setRequestProperty("Content-Type",contentType); | ||
| 164 | } | ||
| 165 | conn.setRequestProperty("connection", "Keep-Alive"); | ||
| 166 | conn.setRequestProperty("user-agent", | ||
| 167 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); | ||
| 168 | // 发送POST请求必须设置如下两行 | ||
| 169 | conn.setDoOutput(true); | ||
| 170 | conn.setDoInput(true); | ||
| 171 | // 获取URLConnection对象对应的输出流 | ||
| 172 | out = new PrintWriter(conn.getOutputStream()); | ||
| 173 | |||
| 174 | |||
| 175 | // 发送请求参数 | ||
| 176 | out.print(new String(param.getBytes(charset))); | ||
| 177 | // flush 输出流的缓冲 | ||
| 178 | out.flush(); | ||
| 179 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 180 | in = new BufferedReader( | ||
| 181 | new InputStreamReader(conn.getInputStream(),charset)); | ||
| 182 | String line; | ||
| 183 | while ((line = in.readLine()) != null) { | ||
| 184 | sbResult.append(line).append("\n"); | ||
| 185 | } | ||
| 186 | if (null != sbResult && sbResult.length() > 0) { | ||
| 187 | sbResult.setLength(sbResult.length() - 1); | ||
| 188 | } | ||
| 189 | result = sbResult.toString(); | ||
| 190 | } catch (Exception e) { | ||
| 191 | //System.out.println("发送POST 请求出现异常!" + e); | ||
| 192 | e.printStackTrace(); | ||
| 193 | |||
| 194 | } | ||
| 195 | // 使用finally块来关闭输出流、输入流. | ||
| 196 | finally { | ||
| 197 | |||
| 198 | try { | ||
| 199 | if (out != null) { | ||
| 200 | out.close(); | ||
| 201 | } | ||
| 202 | if (in != null) { | ||
| 203 | in.close(); | ||
| 204 | } | ||
| 205 | } catch (IOException ex) { | ||
| 206 | ex.printStackTrace(); | ||
| 207 | } | ||
| 208 | } | ||
| 209 | return result; | ||
| 210 | } | ||
| 211 | |||
| 212 | public static String sendPost(String url, Map<String,String> mapParam , String charset,String contentType) { | ||
| 213 | |||
| 214 | StringBuilder sbParam=new StringBuilder(""); | ||
| 215 | int i1=0; | ||
| 216 | Set<String> setKey=mapParam.keySet(); | ||
| 217 | for (String strKey : setKey ) { | ||
| 218 | |||
| 219 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 220 | if (i1<setKey.size()-1){ | ||
| 221 | sbParam.append("&"); | ||
| 222 | } | ||
| 223 | i1++; | ||
| 224 | } | ||
| 225 | |||
| 226 | return sendPost(url, sbParam.toString(), charset,contentType); | ||
| 227 | } | ||
| 228 | |||
| 229 | |||
| 230 | |||
| 231 | |||
| 232 | |||
| 233 | |||
| 234 | //////////////////////////////////////////////////以下新版//////////////////////////////////////////// | ||
| 235 | |||
| 236 | |||
| 237 | |||
| 238 | |||
| 239 | |||
| 240 | /** | ||
| 241 | * 新版本的 GET请求 | ||
| 242 | * | ||
| 243 | * @param strURL | ||
| 244 | * 发送请求的URL | ||
| 245 | * @param strParam | ||
| 246 | * 请求参数,应该是name1=value1&name2=value2的形式。 | ||
| 247 | * @thows Exception | ||
| 248 | * | ||
| 249 | * @return URL所代表远程资源的响应 | ||
| 250 | */ | ||
| 251 | public static String sendGet(String strURL, String strParam, Map<String,String> mapHeader ) throws Exception { | ||
| 252 | |||
| 253 | String strResult = ""; | ||
| 254 | BufferedReader brIn = null; | ||
| 255 | try { | ||
| 256 | String strFullURL = strURL + (null != strParam ? ("?" + strParam) : ""); | ||
| 257 | URL url = new URL(strFullURL); | ||
| 258 | // 打开和URL之间的连接 | ||
| 259 | //URLConnection conn = urlReal.openConnection(); | ||
| 260 | HttpURLConnection connHttps = (HttpURLConnection)url.openConnection(); | ||
| 261 | |||
| 262 | connHttps.setRequestMethod("GET"); | ||
| 263 | |||
| 264 | connHttps.setUseCaches(false); | ||
| 265 | |||
| 266 | // 设置通用的请求属性 | ||
| 267 | connHttps.setRequestProperty("Accept", "*/*"); | ||
| 268 | connHttps.setRequestProperty("Charset", "UTF-8"); | ||
| 269 | connHttps.setRequestProperty("Connection", "Keep-Alive"); | ||
| 270 | connHttps.setRequestProperty("User-Agent", "Server(Java) WebUtil"); | ||
| 271 | |||
| 272 | if (null!=mapHeader && !mapHeader.isEmpty()){ | ||
| 273 | for(String strKey:mapHeader.keySet()){ | ||
| 274 | String strValue=mapHeader.get(strKey); | ||
| 275 | |||
| 276 | char cFirst = strKey.charAt(0); | ||
| 277 | if(cFirst < 65 || cFirst > 90){ //不是大写开头 | ||
| 278 | //System.out.println( new StringBuilder("A http header parameter '").append(strKey).append("' isn't start with capital letter..")); | ||
| 279 | } | ||
| 280 | if (null!=strValue && !strValue.isEmpty()){ | ||
| 281 | connHttps.setRequestProperty(strKey, strValue); | ||
| 282 | |||
| 283 | } | ||
| 284 | } | ||
| 285 | } | ||
| 286 | |||
| 287 | |||
| 288 | //得到实际使用的Charset | ||
| 289 | String strCharset=mapHeader.get("Charset"); | ||
| 290 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 291 | strCharset=mapHeader.get("charset"); | ||
| 292 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 293 | strCharset="UTF-8"; | ||
| 294 | } | ||
| 295 | } | ||
| 296 | |||
| 297 | |||
| 298 | // 建立实际的连接 | ||
| 299 | connHttps.connect(); | ||
| 300 | |||
| 301 | |||
| 302 | brIn = new BufferedReader( | ||
| 303 | new InputStreamReader(connHttps.getInputStream(),strCharset)); | ||
| 304 | String strLine; | ||
| 305 | |||
| 306 | StringBuilder sbResult=new StringBuilder(); | ||
| 307 | |||
| 308 | while ((strLine = brIn.readLine()) != null) { | ||
| 309 | sbResult.append("\n").append(strLine); //readLine不包含换行符 | ||
| 310 | } | ||
| 311 | connHttps.disconnect(); | ||
| 312 | strResult=sbResult.toString(); | ||
| 313 | |||
| 314 | |||
| 315 | } catch (Exception e) { | ||
| 316 | //System.out.println("发送GET请求出现异常!" + e); | ||
| 317 | throw new IOException("WebUtil发送GET请求异常",e); | ||
| 318 | //e.printStackTrace(); | ||
| 319 | //throw e; | ||
| 320 | } finally {// 使用finally块来关闭输入流 | ||
| 321 | try { | ||
| 322 | if (brIn != null) { | ||
| 323 | brIn.close(); | ||
| 324 | brIn=null; | ||
| 325 | } | ||
| 326 | } catch (IOException ex) { | ||
| 327 | ex.printStackTrace(); | ||
| 328 | } | ||
| 329 | } | ||
| 330 | return strResult; | ||
| 331 | } | ||
| 332 | |||
| 333 | public static String sendGet(String strUrl, Map<String,String> mapParam, Map<String,String> mapHeader) throws Exception { | ||
| 334 | StringBuilder sbParam=new StringBuilder(""); | ||
| 335 | int i1=0; | ||
| 336 | Set<String> setKey=mapParam.keySet(); | ||
| 337 | for (String strKey : setKey ) { | ||
| 338 | |||
| 339 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 340 | if (i1<setKey.size()-1){ | ||
| 341 | sbParam.append("&"); | ||
| 342 | } | ||
| 343 | i1++; | ||
| 344 | } | ||
| 345 | return sendGet(strUrl, sbParam.toString(), mapHeader); | ||
| 346 | } | ||
| 347 | |||
| 348 | public static String sendPost(String strUrl, Map<String, String> mapParam, Map<String, String> mapHeader) | ||
| 349 | throws Exception { | ||
| 350 | return sendPost(strUrl, mapParam, mapHeader, 5000); | ||
| 351 | } | ||
| 352 | |||
| 353 | public static String sendPost(String strUrl, String strParam, Map<String, String> mapHeader) throws Exception { | ||
| 354 | return sendPost(strUrl, strParam, mapHeader, 5000); | ||
| 355 | } | ||
| 356 | |||
| 357 | /** | ||
| 358 | * 新版的 POST请求 | ||
| 359 | * | ||
| 360 | * @param url | ||
| 361 | * 发送请求的URL | ||
| 362 | * @param param | ||
| 363 | * 请求参数,请求参数应该是name1=value1&name2=value2的形式。 | ||
| 364 | * @return URL所代表远程资源的响应 | ||
| 365 | */ | ||
| 366 | public static String sendPost(String strUrl, String strParam , Map<String,String> mapHeader, Integer timeout) throws Exception { | ||
| 367 | PrintWriter brOut = null; | ||
| 368 | BufferedReader brIn = null; | ||
| 369 | String strResult = ""; | ||
| 370 | try { | ||
| 371 | System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); | ||
| 372 | URL realUrl = new URL(strUrl); | ||
| 373 | // 打开和URL之间的连接 | ||
| 374 | //URLConnection conn = realUrl.openConnection(); | ||
| 375 | HttpURLConnection connHttps = (HttpURLConnection)realUrl.openConnection(); | ||
| 376 | if (null != timeout) { | ||
| 377 | connHttps.setConnectTimeout(timeout); | ||
| 378 | connHttps.setReadTimeout(timeout); | ||
| 379 | } | ||
| 380 | connHttps.setRequestMethod("POST"); | ||
| 381 | connHttps.setUseCaches(false); | ||
| 382 | |||
| 383 | // 设置默认通用的请求属性 | ||
| 384 | connHttps.setRequestProperty("Accept", "*/*"); | ||
| 385 | connHttps.setRequestProperty("Charset", "UTF-8"); | ||
| 386 | connHttps.setRequestProperty("Connection", "Keep-Alive"); | ||
| 387 | connHttps.setRequestProperty("User-Agent", "Server(Java) WebUtil"); | ||
| 388 | |||
| 389 | if (null!=mapHeader && !mapHeader.isEmpty()){ | ||
| 390 | for(String strKey:mapHeader.keySet()){ | ||
| 391 | String strValue=mapHeader.get(strKey); | ||
| 392 | |||
| 393 | char cFirst = strKey.charAt(0); | ||
| 394 | if(cFirst < 65 || cFirst > 90){ //不是大写开头 | ||
| 395 | //System.out.println( new StringBuilder("A http header parameter '").append(strKey).append("' isn't start with capital letter..")); | ||
| 396 | } | ||
| 397 | if (null!=strValue && !strValue.isEmpty()){ | ||
| 398 | connHttps.setRequestProperty(strKey, strValue); | ||
| 399 | |||
| 400 | } | ||
| 401 | } | ||
| 402 | } | ||
| 403 | |||
| 404 | /* | ||
| 405 | if (null!=contentType && !contentType.isEmpty()){ | ||
| 406 | conn.setRequestProperty("Content-Type",contentType); | ||
| 407 | }*/ | ||
| 408 | |||
| 409 | // 发送POST请求必须设置如下两行 | ||
| 410 | connHttps.setDoOutput(true); | ||
| 411 | connHttps.setDoInput(true); | ||
| 412 | // 获取URLConnection对象对应的输出流 | ||
| 413 | brOut = new PrintWriter(connHttps.getOutputStream()); | ||
| 414 | |||
| 415 | |||
| 416 | //得到实际使用的Charset | ||
| 417 | String strCharset=mapHeader.get("Charset"); | ||
| 418 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 419 | strCharset=mapHeader.get("charset"); | ||
| 420 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 421 | strCharset="UTF-8"; | ||
| 422 | } | ||
| 423 | } | ||
| 424 | |||
| 425 | // 发送请求参数 | ||
| 426 | brOut.print(new String(strParam.getBytes(strCharset))); | ||
| 427 | // flush 输出流的缓冲 | ||
| 428 | brOut.flush(); | ||
| 429 | |||
| 430 | //System.out.println(connHttps.getResponseCode()); | ||
| 431 | |||
| 432 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 433 | brIn = new BufferedReader( | ||
| 434 | new InputStreamReader(connHttps.getInputStream(),strCharset)); | ||
| 435 | String strLine; | ||
| 436 | |||
| 437 | StringBuilder sbResult=new StringBuilder(); | ||
| 438 | |||
| 439 | while ((strLine = brIn.readLine()) != null) { | ||
| 440 | sbResult.append(strLine).append("\n"); //readLine不包含换行符 | ||
| 441 | } | ||
| 442 | if (null != sbResult && sbResult.length() > 0) { | ||
| 443 | sbResult.setLength(sbResult.length() - 1); | ||
| 444 | } | ||
| 445 | connHttps.disconnect(); | ||
| 446 | strResult=sbResult.toString(); | ||
| 447 | |||
| 448 | |||
| 449 | } catch (Exception e) { | ||
| 450 | e.printStackTrace(); | ||
| 451 | throw e; | ||
| 452 | }finally {// 使用finally块来关闭输出流、输入流. | ||
| 453 | |||
| 454 | try { | ||
| 455 | if (brOut != null) { | ||
| 456 | brOut.close(); | ||
| 457 | brOut=null; | ||
| 458 | } | ||
| 459 | if (brIn != null) { | ||
| 460 | brIn.close(); | ||
| 461 | brIn=null; | ||
| 462 | } | ||
| 463 | } catch (IOException ex) { | ||
| 464 | ex.printStackTrace(); | ||
| 465 | } | ||
| 466 | } | ||
| 467 | return strResult; | ||
| 468 | } | ||
| 469 | |||
| 470 | public static String sendPost(String url, Map<String,String> mapParam ,Map<String,String> mapHeader, Integer timeout) throws Exception { | ||
| 471 | |||
| 472 | StringBuilder sbParam=new StringBuilder(""); | ||
| 473 | int i1=0; | ||
| 474 | Set<String> setKey=mapParam.keySet(); | ||
| 475 | for (String strKey : setKey ) { | ||
| 476 | |||
| 477 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 478 | if (i1<setKey.size()-1){ | ||
| 479 | sbParam.append("&"); | ||
| 480 | } | ||
| 481 | i1++; | ||
| 482 | } | ||
| 483 | |||
| 484 | return sendPost(url, sbParam.toString(), mapHeader, timeout); | ||
| 485 | } | ||
| 486 | |||
| 487 | |||
| 488 | |||
| 489 | |||
| 490 | |||
| 491 | /** | ||
| 492 | * 安全的 Get 请求 | ||
| 493 | * | ||
| 494 | * | ||
| 495 | * | ||
| 496 | **/ | ||
| 497 | public static String sendSecureGet(String strURL, String strParam, Map<String,String> mapHeader | ||
| 498 | ,TrustManager tmIn) throws Exception { | ||
| 499 | |||
| 500 | BufferedReader brIn=null; | ||
| 501 | String strResult=null; | ||
| 502 | |||
| 503 | try { | ||
| 504 | |||
| 505 | // 创建SSLContext对象,并使用指定的信任管理器初始化 | ||
| 506 | TrustManager[] arrayTM = { tmIn }; | ||
| 507 | SSLContext sslc = SSLContext.getInstance("SSL", "SunJSSE"); | ||
| 508 | sslc.init(null, arrayTM, new java.security.SecureRandom()); | ||
| 509 | // 从上述SSLContext对象中得到SSLSocketFactory对象 | ||
| 510 | SSLSocketFactory sslsf = sslc.getSocketFactory(); | ||
| 511 | |||
| 512 | URL urlHttps = new URL(strURL); | ||
| 513 | HttpsURLConnection connHttps = (HttpsURLConnection)(urlHttps.openConnection()); | ||
| 514 | connHttps.setSSLSocketFactory(sslsf); | ||
| 515 | |||
| 516 | //设置请求方式(GET/POST) | ||
| 517 | connHttps.setRequestMethod("GET"); | ||
| 518 | |||
| 519 | connHttps.setUseCaches(false); | ||
| 520 | |||
| 521 | //设置通用的请求属性 | ||
| 522 | connHttps.setRequestProperty("Accept", "*/*"); | ||
| 523 | connHttps.setRequestProperty("Charset", "UTF-8"); | ||
| 524 | connHttps.setRequestProperty("Connection", "Keep-Alive"); | ||
| 525 | connHttps.setRequestProperty("User-Agent", "Server(Java) WebUtil"); | ||
| 526 | |||
| 527 | if (null!=mapHeader && !mapHeader.isEmpty()){ | ||
| 528 | for(String strKey:mapHeader.keySet()){ | ||
| 529 | String strValue=mapHeader.get(strKey); | ||
| 530 | |||
| 531 | char cFirst = strKey.charAt(0); | ||
| 532 | if(cFirst < 65 || cFirst > 90){ //不是大写开头 | ||
| 533 | //System.out.println( new StringBuilder("A http header parameter '").append(strKey).append("' isn't start with capital letter..")); | ||
| 534 | } | ||
| 535 | if (null!=strValue && !strValue.isEmpty()){ | ||
| 536 | connHttps.setRequestProperty(strKey, strValue); | ||
| 537 | |||
| 538 | } | ||
| 539 | } | ||
| 540 | } | ||
| 541 | |||
| 542 | |||
| 543 | //得到实际使用的Charset | ||
| 544 | String strCharset=mapHeader.get("Charset"); | ||
| 545 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 546 | strCharset=mapHeader.get("charset"); | ||
| 547 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 548 | strCharset="UTF-8"; | ||
| 549 | } | ||
| 550 | } | ||
| 551 | |||
| 552 | |||
| 553 | // 建立实际的连接 | ||
| 554 | connHttps.connect(); | ||
| 555 | |||
| 556 | |||
| 557 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 558 | brIn = new BufferedReader( | ||
| 559 | new InputStreamReader(connHttps.getInputStream(),strCharset)); | ||
| 560 | String strLine; | ||
| 561 | |||
| 562 | StringBuilder sbResult=new StringBuilder(); | ||
| 563 | |||
| 564 | while ((strLine = brIn.readLine()) != null) { | ||
| 565 | sbResult.append("\n").append(strLine); //readLine不包含换行符 | ||
| 566 | } | ||
| 567 | connHttps.disconnect(); | ||
| 568 | strResult=sbResult.toString(); | ||
| 569 | |||
| 570 | } catch (Exception e) { | ||
| 571 | throw new IOException("WebUtil发送安全的GET请求异常",e); | ||
| 572 | } finally {// 使用finally块来关闭输出流、输入流. | ||
| 573 | try { | ||
| 574 | if (brIn != null) { | ||
| 575 | brIn.close(); | ||
| 576 | brIn=null; | ||
| 577 | } | ||
| 578 | } catch (IOException ex) { | ||
| 579 | ex.printStackTrace(); | ||
| 580 | } | ||
| 581 | } | ||
| 582 | return strResult; | ||
| 583 | } | ||
| 584 | |||
| 585 | public static String sendSecureGet(String strUrl, Map<String,String> mapParam, Map<String,String> mapHeader,TrustManager tmIn) throws Exception { | ||
| 586 | StringBuilder sbParam=new StringBuilder(""); | ||
| 587 | int i1=0; | ||
| 588 | Set<String> setKey=mapParam.keySet(); | ||
| 589 | for (String strKey : setKey ) { | ||
| 590 | |||
| 591 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 592 | if (i1<setKey.size()-1){ | ||
| 593 | sbParam.append("&"); | ||
| 594 | } | ||
| 595 | i1++; | ||
| 596 | } | ||
| 597 | return sendSecureGet(strUrl, sbParam.toString(), mapHeader,tmIn); | ||
| 598 | } | ||
| 599 | |||
| 600 | |||
| 601 | /** | ||
| 602 | * 安全的 Post 请求 | ||
| 603 | * | ||
| 604 | * | ||
| 605 | * | ||
| 606 | **/ | ||
| 607 | public static String sendSecurePost(String strURL, String strParam, Map<String,String> mapHeader | ||
| 608 | ,TrustManager tmIn) throws Exception { | ||
| 609 | |||
| 610 | BufferedReader brIn=null; | ||
| 611 | PrintWriter brOut=null; | ||
| 612 | String strResult=null; | ||
| 613 | |||
| 614 | try { | ||
| 615 | |||
| 616 | // 创建SSLContext对象,并使用指定的信任管理器初始化 | ||
| 617 | TrustManager[] arrayTM = { tmIn }; | ||
| 618 | SSLContext sslc = SSLContext.getInstance("SSL", "SunJSSE"); | ||
| 619 | sslc.init(null, arrayTM, new java.security.SecureRandom()); | ||
| 620 | // 从上述SSLContext对象中得到SSLSocketFactory对象 | ||
| 621 | SSLSocketFactory sslsf = sslc.getSocketFactory(); | ||
| 622 | |||
| 623 | URL urlHttps = new URL(strURL); | ||
| 624 | HttpsURLConnection connHttps = (HttpsURLConnection)(urlHttps.openConnection()); | ||
| 625 | connHttps.setSSLSocketFactory(sslsf); | ||
| 626 | |||
| 627 | //设置请求方式(GET/POST) | ||
| 628 | connHttps.setRequestMethod("POST"); | ||
| 629 | |||
| 630 | //设置POST所需配置 | ||
| 631 | connHttps.setDoOutput(true); | ||
| 632 | connHttps.setDoInput(true); | ||
| 633 | |||
| 634 | connHttps.setUseCaches(false); | ||
| 635 | |||
| 636 | //设置通用的请求属性 | ||
| 637 | connHttps.setRequestProperty("Accept", "*/*"); | ||
| 638 | connHttps.setRequestProperty("Charset", "UTF-8"); | ||
| 639 | connHttps.setRequestProperty("Connection", "Keep-Alive"); | ||
| 640 | connHttps.setRequestProperty("User-Agent", "Server(Java) WebUtil"); | ||
| 641 | |||
| 642 | if (null!=mapHeader && !mapHeader.isEmpty()){ | ||
| 643 | for(String strKey:mapHeader.keySet()){ | ||
| 644 | String strValue=mapHeader.get(strKey); | ||
| 645 | |||
| 646 | char cFirst = strKey.charAt(0); | ||
| 647 | if(cFirst < 65 || cFirst > 90){ //不是大写开头 | ||
| 648 | //System.out.println( new StringBuilder("A http header parameter '").append(strKey).append("' isn't start with capital letter..")); | ||
| 649 | } | ||
| 650 | if (null!=strValue && !strValue.isEmpty()){ | ||
| 651 | connHttps.setRequestProperty(strKey, strValue); | ||
| 652 | |||
| 653 | } | ||
| 654 | } | ||
| 655 | } | ||
| 656 | |||
| 657 | //得到实际使用的Charset | ||
| 658 | String strCharset=mapHeader.get("Charset"); | ||
| 659 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 660 | strCharset=mapHeader.get("charset"); | ||
| 661 | if (null==strCharset || strCharset.isEmpty()){ | ||
| 662 | strCharset="UTF-8"; | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 666 | // 获取URLConnection对象对应的输出流 | ||
| 667 | brOut = new PrintWriter(connHttps.getOutputStream()); | ||
| 668 | |||
| 669 | // 发送请求参数 | ||
| 670 | if (null!=strParam){ | ||
| 671 | brOut.print(new String(strParam.getBytes(strCharset))); | ||
| 672 | brOut.flush(); | ||
| 673 | } | ||
| 674 | |||
| 675 | |||
| 676 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 677 | brIn = new BufferedReader(new InputStreamReader(connHttps.getInputStream(),strCharset)); | ||
| 678 | String strLine; | ||
| 679 | |||
| 680 | StringBuilder sbResult=new StringBuilder(); | ||
| 681 | |||
| 682 | while ((strLine = brIn.readLine()) != null) { | ||
| 683 | sbResult.append("\n").append(strLine); //readLine不包含换行符 | ||
| 684 | } | ||
| 685 | connHttps.disconnect(); | ||
| 686 | strResult=sbResult.toString(); | ||
| 687 | |||
| 688 | } catch (Exception e) { | ||
| 689 | throw new IOException("WebUtil发送安全的POST请求异常",e); | ||
| 690 | } finally { // 使用finally块来关闭输出流、输入流. | ||
| 691 | try { | ||
| 692 | if (brIn != null) { | ||
| 693 | brIn.close(); | ||
| 694 | brIn=null; | ||
| 695 | } | ||
| 696 | if (brOut != null) { | ||
| 697 | brOut.close(); | ||
| 698 | brOut=null; | ||
| 699 | } | ||
| 700 | } catch (IOException ex) { | ||
| 701 | ex.printStackTrace(); | ||
| 702 | } | ||
| 703 | } | ||
| 704 | return strResult; | ||
| 705 | } | ||
| 706 | |||
| 707 | public static String sendSecurePost(String url, Map<String,String> mapParam ,Map<String,String> mapHeader,TrustManager tmIn) throws Exception { | ||
| 708 | |||
| 709 | StringBuilder sbParam=new StringBuilder(""); | ||
| 710 | int i1=0; | ||
| 711 | Set<String> setKey=mapParam.keySet(); | ||
| 712 | for (String strKey : setKey ) { | ||
| 713 | |||
| 714 | sbParam.append(strKey).append("=").append(mapParam.get(strKey)); | ||
| 715 | if (i1<setKey.size()-1){ | ||
| 716 | sbParam.append("&"); | ||
| 717 | } | ||
| 718 | i1++; | ||
| 719 | } | ||
| 720 | |||
| 721 | return sendSecurePost(url, sbParam.toString(), mapHeader,tmIn); | ||
| 722 | } | ||
| 723 | |||
| 724 | |||
| 725 | /** | ||
| 726 | * 获取请求的PostBody | ||
| 727 | * | ||
| 728 | * | ||
| 729 | * | ||
| 730 | **/ | ||
| 731 | public static String getPostBody(HttpServletRequest request) | ||
| 732 | throws IOException { | ||
| 733 | // 解析结果存储在HashMap | ||
| 734 | //Map<String, Object> map = new HashMap<String, Object>(); | ||
| 735 | String str = ""; | ||
| 736 | BufferedReader reader = null; | ||
| 737 | try { | ||
| 738 | StringBuilder buffer = new StringBuilder(); | ||
| 739 | reader = new BufferedReader(new InputStreamReader( | ||
| 740 | request.getInputStream(), "UTF-8")); | ||
| 741 | String line = null; | ||
| 742 | while ((line = reader.readLine()) != null) { | ||
| 743 | buffer.append(line); | ||
| 744 | } | ||
| 745 | str = buffer.toString(); | ||
| 746 | //map = JSONUtil.json2map(str); | ||
| 747 | } catch (Exception e) { | ||
| 748 | e.printStackTrace(); | ||
| 749 | } finally { | ||
| 750 | if (null != reader) { | ||
| 751 | try { | ||
| 752 | reader.close(); | ||
| 753 | } catch (IOException e) { | ||
| 754 | e.printStackTrace(); | ||
| 755 | } | ||
| 756 | } | ||
| 757 | |||
| 758 | } | ||
| 759 | |||
| 760 | return str; | ||
| 761 | } | ||
| 762 | |||
| 763 | /** | ||
| 764 | * 向指定 URL 发送POST方法 发送PostBody | ||
| 765 | * | ||
| 766 | * @param url | ||
| 767 | * | ||
| 768 | * @param param | ||
| 769 | * | ||
| 770 | * @return | ||
| 771 | */ | ||
| 772 | /* | ||
| 773 | @Deprecated | ||
| 774 | public static String sendPost(String url, String param) { | ||
| 775 | PrintWriter out = null; | ||
| 776 | BufferedReader in = null; | ||
| 777 | String result = ""; | ||
| 778 | try { | ||
| 779 | URL realUrl = new URL(url); | ||
| 780 | // 打开和URL之间的连接 | ||
| 781 | URLConnection conn = realUrl.openConnection(); | ||
| 782 | // 设置通用的请求属性 | ||
| 783 | conn.setRequestProperty("accept", "* /*"); | ||
| 784 | conn.setRequestProperty("connection", "Keep-Alive"); | ||
| 785 | conn.setRequestProperty("user-agent", | ||
| 786 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); | ||
| 787 | // 发送POST请求必须设置如下两行 | ||
| 788 | conn.setDoOutput(true); | ||
| 789 | conn.setDoInput(true); | ||
| 790 | // 获取URLConnection对象对应的输出流 | ||
| 791 | out = new PrintWriter(conn.getOutputStream()); | ||
| 792 | // 发送请求参数 | ||
| 793 | out.print(param); | ||
| 794 | // flush输出流的缓冲 | ||
| 795 | out.flush(); | ||
| 796 | // 定义BufferedReader输入流来读取URL的响应 | ||
| 797 | in = new BufferedReader( | ||
| 798 | new InputStreamReader(conn.getInputStream())); | ||
| 799 | String line; | ||
| 800 | while ((line = in.readLine()) != null) { | ||
| 801 | result += line; | ||
| 802 | } | ||
| 803 | } catch (ConnectException ce) { | ||
| 804 | System.out.println("发送 POST 请求出现异常(Connection timed out!)"); | ||
| 805 | //logger.info(url+" (post failed)"); | ||
| 806 | ce.printStackTrace(); | ||
| 807 | } catch (Exception e) { | ||
| 808 | System.out.println("发送 POST 请求出现异常!"+e); | ||
| 809 | e.printStackTrace(); | ||
| 810 | }finally{//使用finally块来关闭输出流、输入流 | ||
| 811 | try{ | ||
| 812 | if(out!=null){ | ||
| 813 | out.close(); | ||
| 814 | } | ||
| 815 | if(in!=null){ | ||
| 816 | in.close(); | ||
| 817 | } | ||
| 818 | } | ||
| 819 | catch(IOException ex){ | ||
| 820 | ex.printStackTrace(); | ||
| 821 | } | ||
| 822 | } | ||
| 823 | return result; | ||
| 824 | }*/ | ||
| 825 | |||
| 826 | /** | ||
| 827 | * 处理用户上传 | ||
| 828 | */ | ||
| 829 | public static String handleUpload(HttpServletRequest request, HttpServletResponse response, String strFilePath,String strFileName) | ||
| 830 | throws Exception { | ||
| 831 | //String strFileName = request.getParameter("fileName"); | ||
| 832 | //strFileName = new String(strFileName.getBytes("ISO-8859-1"),"UTF-8"); | ||
| 833 | //String overFlg = request.getParameter("over"); // 0:go on;1:over | ||
| 834 | //System.out.println("get: " + fileName); | ||
| 835 | byte[] buf = new byte[4096]; | ||
| 836 | if (strFilePath.charAt(strFilePath.length()-1)!='/'){ | ||
| 837 | strFilePath+="/"; | ||
| 838 | } | ||
| 839 | strFileName=strFilePath+strFileName; | ||
| 840 | File file = new File(strFileName); | ||
| 841 | InputStream is = null; | ||
| 842 | BufferedOutputStream fileOut | ||
| 843 | = new BufferedOutputStream(new FileOutputStream(file, true)); | ||
| 844 | try { | ||
| 845 | is = request.getInputStream(); | ||
| 846 | |||
| 847 | while (true) { | ||
| 848 | int bytesIn = is.read(buf, 0, 4096); | ||
| 849 | //System.out.println(bytesIn); | ||
| 850 | if (bytesIn == -1) { | ||
| 851 | break; | ||
| 852 | } else { | ||
| 853 | fileOut.write(buf, 0, bytesIn); | ||
| 854 | } | ||
| 855 | } | ||
| 856 | |||
| 857 | fileOut.flush(); | ||
| 858 | fileOut.close(); | ||
| 859 | //System.out.println(file.getAbsolutePath()); | ||
| 860 | } catch (IOException e) { | ||
| 861 | throw e; | ||
| 862 | } | ||
| 863 | return strFileName; | ||
| 864 | } | ||
| 865 | |||
| 866 | |||
| 867 | |||
| 868 | |||
| 869 | |||
| 870 | |||
| 871 | |||
| 872 | } |
| 1 | spring: | ||
| 2 | datasource: | ||
| 3 | url: jdbc:mysql://139.196.192.242:3306/cms_test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false | ||
| 4 | username: root | ||
| 5 | password: Tjlh@2017 | ||
| 6 | driver-class-name: com.mysql.jdbc.Driver | ||
| 7 | hikari: | ||
| 8 | maximum-pool-size: 10 | ||
| 9 | minimum-idle: 5 | ||
| 10 | idle-timeout: 180000 | ||
| 11 | auto-commit: true | ||
| 12 | connection-timeout: 30000 | ||
| 13 | connection-test-query: SELECT 1 |
| 1 | spring: | ||
| 2 | datasource: | ||
| 3 | url: jdbc:mysql://139.196.192.242:3306/cms_test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&autoReconnect=true | ||
| 4 | username: root | ||
| 5 | password: Topdraw1qaz | ||
| 6 | driver-class-name: com.mysql.jdbc.Driver | ||
| 7 | hikari: | ||
| 8 | maximum-pool-size: 10 | ||
| 9 | minimum-idle: 5 | ||
| 10 | idle-timeout: 180000 | ||
| 11 | auto-commit: true | ||
| 12 | connection-timeout: 30000 | ||
| 13 | connection-test-query: SELECT 1 |
src/main/resources/config/application.yml
0 → 100644
| 1 | server: | ||
| 2 | port: 18080 | ||
| 3 | |||
| 4 | scheduler: | ||
| 5 | auto-bind: | ||
| 6 | app-enabled: true | ||
| 7 | service-enabled: true | ||
| 8 | media-online-enabled: true | ||
| 9 | |||
| 10 | cron: | ||
| 11 | auto-bind: | ||
| 12 | app: 0/10 * * * * ? | ||
| 13 | service: 0/10 * * * * ? | ||
| 14 | media-online: 0/10 * * * * ? | ||
| 15 | |||
| 16 | spring: | ||
| 17 | mail: | ||
| 18 | host: smtp.ym.163.com | ||
| 19 | username: test@topdraw.cn | ||
| 20 | password: 123456789 | ||
| 21 | protocol: smtp | ||
| 22 | default-encoding: utf-8 | ||
| 23 | developer-mail-address: wanghongyan@topdraw.cn | ||
| 24 | |||
| 25 | profiles: | ||
| 26 | active: dev | ||
| 27 | |||
| 28 | entity: | ||
| 29 | appId: 63 | ||
| 30 | serviceId: 1 |
src/main/resources/logback.xml
0 → 100644
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <configuration scan="true" scanPeriod="60 seconds" debug="false"> | ||
| 3 | |||
| 4 | <!--定义参数,后面可以通过${app.name}使用--> | ||
| 5 | <property name="app.name" value="cms.scheduler"/> | ||
| 6 | <property name="log.path" value="./logs"/> | ||
| 7 | <property name="log.pattern" value="%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/> | ||
| 8 | |||
| 9 | <!--输出到控制台--> | ||
| 10 | <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> | ||
| 11 | <!-- encoder 默认配置为PatternLayoutEncoder --> | ||
| 12 | <!--定义控制台输出格式--> | ||
| 13 | <encoder> | ||
| 14 | <pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg %n</pattern> | ||
| 15 | <charset>utf-8</charset> | ||
| 16 | </encoder> | ||
| 17 | </appender> | ||
| 18 | |||
| 19 | <!--获取比info级别高(包括info级别)但除error级别的日志--> | ||
| 20 | <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||
| 21 | <filter class="ch.qos.logback.classic.filter.LevelFilter"> | ||
| 22 | <level>ERROR</level> | ||
| 23 | <onMatch>DENY</onMatch> | ||
| 24 | <onMismatch>ACCEPT</onMismatch> | ||
| 25 | </filter> | ||
| 26 | <encoder> | ||
| 27 | <pattern>${log.pattern}</pattern> | ||
| 28 | </encoder> | ||
| 29 | <!--滚动策略--> | ||
| 30 | <file>${log.path}/${app.name}-info.log</file> | ||
| 31 | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||
| 32 | <!--路径--> | ||
| 33 | <fileNamePattern>${log.path}/info/${app.name}-%d{yyyy-MM-dd}.log</fileNamePattern> | ||
| 34 | <maxHistory>30</maxHistory> | ||
| 35 | <totalSizeCap>10GB</totalSizeCap> | ||
| 36 | </rollingPolicy> | ||
| 37 | <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> | ||
| 38 | <!-- <!–每个日志文件最大100MB–>--> | ||
| 39 | <!-- <maxFileSize>100MB</maxFileSize>--> | ||
| 40 | <!-- </triggeringPolicy>--> | ||
| 41 | </appender> | ||
| 42 | |||
| 43 | <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||
| 44 | <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | ||
| 45 | <level>ERROR</level> | ||
| 46 | </filter> | ||
| 47 | <encoder> | ||
| 48 | <pattern>${log.pattern}</pattern> | ||
| 49 | </encoder> | ||
| 50 | <!--滚动策略--> | ||
| 51 | <file>${log.path}/${app.name}-error.log</file> | ||
| 52 | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||
| 53 | <!--路径--> | ||
| 54 | <fileNamePattern>${log.path}/error/${app.name}-%d{yyyy-MM-dd}.log</fileNamePattern> | ||
| 55 | <maxHistory>30</maxHistory> | ||
| 56 | <totalSizeCap>10GB</totalSizeCap> | ||
| 57 | </rollingPolicy> | ||
| 58 | <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> | ||
| 59 | <!-- <!–每个日志文件最大50MB–>--> | ||
| 60 | <!-- <maxFileSize>50MB</maxFileSize>--> | ||
| 61 | <!-- </triggeringPolicy>--> | ||
| 62 | </appender> | ||
| 63 | |||
| 64 | <!--普通日志输出到控制台--> | ||
| 65 | <root level="info"> | ||
| 66 | <appender-ref ref="console" /> | ||
| 67 | <appender-ref ref="info" /> | ||
| 68 | <appender-ref ref="error" /> | ||
| 69 | </root> | ||
| 70 | |||
| 71 | <!--监控sql日志输出 --> | ||
| 72 | <logger name="jdbc.sqlonly" level="INFO" additivity="false"> | ||
| 73 | <appender-ref ref="console" /> | ||
| 74 | </logger> | ||
| 75 | |||
| 76 | <logger name="jdbc.resultset" level="ERROR" additivity="false"> | ||
| 77 | <appender-ref ref="console" /> | ||
| 78 | </logger> | ||
| 79 | |||
| 80 | <!-- 如想看到表格数据,将OFF改为INFO --> | ||
| 81 | <logger name="jdbc.resultsettable" level="OFF" additivity="false"> | ||
| 82 | <appender-ref ref="console" /> | ||
| 83 | </logger> | ||
| 84 | |||
| 85 | <logger name="jdbc.connection" level="OFF" additivity="false"> | ||
| 86 | <appender-ref ref="console" /> | ||
| 87 | </logger> | ||
| 88 | |||
| 89 | <logger name="jdbc.sqltiming" level="OFF" additivity="false"> | ||
| 90 | <appender-ref ref="console" /> | ||
| 91 | </logger> | ||
| 92 | |||
| 93 | <logger name="jdbc.audit" level="OFF" additivity="false"> | ||
| 94 | <appender-ref ref="console" /> | ||
| 95 | </logger> | ||
| 96 | </configuration> |
-
Please register or sign in to post a comment