当前位置: 首页 > news >正文

springboot项目搭建集成 redis/跨域/远程请求

目录

一,创建maven项目

1,左上角file > new > maven project 

2,next 到 创建 Group id 和  Artifact id​编辑​编辑

二,配置springboot

1,配置pom文件,

2,创建启动类

3,配置 yml 文件

三,集成 Redis

1,yml追加配置

2,对 Redis 做些代码配置

3,spring 注解@Configuration类中编写代码访问

4,过滤器 ,获取Redis的代码 注:过滤路径在yml配置文件中配置

5,配置 Redis 数据

6,页面访问controller

四,集成 跨域

1,yml文件配置需要跨域的路径端口

2,过滤器,获取跨域代码

3,spring 注解@Configuration类中编写代码访问

五,集成 远程请求

1,封装工具类

2,通用工具类方法sendRequest


一,创建maven项目

1,左上角file > new > maven project 
2,next 到 创建 Group id 和  Artifact id

        

二,配置springboot

1,配置pom文件,
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version></parent><groupId>cn.yilixun.jt.econtract</groupId><artifactId>jt-econtract</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.12</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.4.1</version></dependency><dependency><groupId>org.mybatis.scripting</groupId><artifactId>mybatis-velocity</artifactId><version>2.1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><!-- 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.2</version></dependency><!-- easypoi的支持 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>cn.yilixun.jt.econtract.portal.EcontractPortalStartup</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>
2,创建启动类
package cn.yilixun.jt.econtract.portal;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;/*** Hello world!**/
@SpringBootApplication
@ComponentScan(basePackages = { "cn.yilixun.*" })
@MapperScan("cn.yilixun.jt.econtract.portal.mapper")
@EnableConfigurationProperties
public class EcontractPortalStartup {public static void main(String[] args) {SpringApplication.run(EcontractPortalStartup.class, args);}
}
3,配置 yml 文件

application.yml

spring:application:name: portalprofiles:active: devjackson:default-property-inclusion: non_nulltime-zone: GMT+8main:allow-bean-definition-overriding: true 
mybatis-plus:mapper-locations: classpath:/mybatis/*.xmltype-aliases-package: cn.yilixun.jt.econtract.portal.infoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#日志配置
logging:config: classpath:logback-spring.xmllevel:org.springframework: warn
access:ignore-pattern: /*|control:allow:origin: http://localhost:8080

application-dev.yml

server:port: 10000servlet:context-path: /econtract
logging:file:path: D:\logs
spring:redis:host: 172.16.1.205port: 6379database: 8password: "Redis12#$56"timeout: 10sdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://172.16.1.205:3306/jt_econtract?serverTimezone=GMT%2B8&remarks=true&useInformationSchema=true&tinyInt1isBit=true&allowMultiQueries=trueusername: jt_econtractpassword: JTecontract@2024.

至此,springboot项目生成完毕

三,集成 Redis

1,yml追加配置

2,对 Redis 做些代码配置
package cn.yilixun.jt.econtract.portal.cache;import java.util.concurrent.TimeUnit;import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;public class RedisCache {public final static long REDIS_EXPIRE_TIME = 7200L;public final static String REDIS_KEY_USER_TOKEN = "user-token:";public final static String REDIS_KEY_BASE_DATA = "base-data:";private RedisTemplate<String, String> redisTemplate;public RedisCache(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;}public void hset(final String key, final String hashKey, final Object value) {this.redisTemplate.opsForHash().put(key, hashKey, JSON.toJSONString(value));}public String hget(final String key, final String hashKey) {HashOperations<String,Object,Object> operation = this.redisTemplate.opsForHash();if (operation != null && operation.get(key, hashKey) != null) {return (String)operation.get(key, hashKey);}return null;}public void set(final String key, final Object value) {this.redisTemplate.opsForValue().set(key, JSON.toJSONString(value));}public void set(final String key, final Object value, final long timeout, final TimeUnit timeUnit) {this.redisTemplate.opsForValue().set(key, JSON.toJSONString(value), timeout, timeUnit);}public String get(final String key) {ValueOperations<String, String> operation = this.redisTemplate.opsForValue();return operation.get(key);}public boolean expire(final String key, final long timeout) {return this.expire(key, timeout, TimeUnit.SECONDS);}public boolean expire(final String key, final long timeout, final TimeUnit unit) {return this.redisTemplate.expire(key, timeout, unit);}public boolean delete(final String key) {return this.redisTemplate.delete(key);}public void createUserToken(String token, Object user) {if (user != null) {this.set(RedisCache.REDIS_KEY_USER_TOKEN + token, user, RedisCache.REDIS_EXPIRE_TIME, TimeUnit.SECONDS);}}public JSONObject getLoginUserInfo(String token) {Object obj = this.get(RedisCache.REDIS_KEY_USER_TOKEN + token);if (obj != null) {this.expire(RedisCache.REDIS_KEY_USER_TOKEN + token, RedisCache.REDIS_EXPIRE_TIME, TimeUnit.SECONDS);return JSONObject.parseObject(obj.toString());}return null;}}
3,spring 注解@Configuration类中编写代码访问
package cn.yilixun.jt.econtract.portal.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;import cn.yilixun.jt.econtract.portal.cache.RedisCache;
import cn.yilixun.jt.econtract.portal.filter.SimpleCorsFilter;@Configuration
public class PropertiesConfig {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Beanpublic RedisCache redisCache() {return new RedisCache(this.redisTemplate);}}
4,过滤器 ,获取Redis的代码 注:过滤路径在yml配置文件中配置
package cn.yilixun.jt.econtract.portal.filter;import java.io.IOException;
import java.util.regex.Pattern;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import com.alibaba.fastjson2.JSONObject;import cn.yilixun.jt.econtract.portal.cache.RedisCache;@Component
@WebFilter(urlPatterns = {"/*"})
@Order(1)
public class AccessVerifyFilter implements Filter {@Value("${access.ignore-pattern:}")private String ignoreLoginUri;@Autowiredprivate RedisCache redisCache;@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;String token = req.getHeader("User-Token");if (!StringUtils.hasLength(token)) {token = req.getParameter("userToken");}JSONObject user = redisCache.getLoginUserInfo(token);String path = req.getServletPath();if (!this.isIgnoreUri(this.ignoreLoginUri, path) && (user == null || user.isEmpty())) {JSONObject erInfo = new JSONObject();erInfo.put("state", 900);erInfo.put("code", "302");this.writeResponse(response, erInfo);return;}chain.doFilter(request, response);}private void writeResponse(ServletResponse response, JSONObject msg) throws IOException {response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");response.getWriter().write(msg.toJSONString());response.getWriter().flush();}private boolean isIgnoreUri(String patternsStr, String path) {if (StringUtils.hasLength(patternsStr)) {String[] patterns = patternsStr.split("\\|");if (patterns.length > 0) {for (String p : patterns) {if (StringUtils.hasLength(p) && Pattern.matches(p.replace("*", ".*"), path)) {return true;}}}}return false;}}
5,配置 Redis 数据

6,页面访问controller
package cn.yilixun.jt.econtract.portal.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson2.JSONObject;import cn.yilixun.jt.econtract.portal.cache.RedisCache;
import cn.yilixun.jt.econtract.portal.response.ResponseResult;@RestController
@RequestMapping("/")
public class PortalController {@Autowiredprotected RedisCache redisCache;@GetMapping("/getBaseInfo")public JSONObject dictList(HttpServletRequest req) {String token = req.getHeader("User-Token");if (!StringUtils.hasLength(token)) {token = req.getParameter("userToken");}JSONObject user = redisCache.getLoginUserInfo(token);return ResponseResult.success(user);}}

        

至此,Redis 集成结束

四,集成 跨域

1,yml文件配置需要跨域的路径端口

2,过滤器,获取跨域代码

package cn.yilixun.jt.econtract.portal.filter;import java.io.IOException;
import java.util.Arrays;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** SimpleCORSFilter.* @Title:SimpleCORSFilter.java* @Description SimpleCORSFilter.java*/
public class SimpleCorsFilter implements Filter {private String originUrl;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {originUrl = filterConfig.getInitParameter("originUrl");}/*** 请求过滤器.*/@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest re = (HttpServletRequest) req;String url = re.getHeader("Origin");String[] urlArray = originUrl.split(",");if (Arrays.asList(urlArray).contains(url)) {response.setHeader("Access-Control-Allow-Origin", url);}response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type,token,Access-Token");response.setHeader("Access-Control-Allow-Credentials", "true");chain.doFilter(req, res);} 
}
3,spring 注解@Configuration类中编写代码访问
package cn.yilixun.jt.econtract.portal.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;import cn.yilixun.jt.econtract.portal.cache.RedisCache;
import cn.yilixun.jt.econtract.portal.filter.SimpleCorsFilter;@Configuration
public class PropertiesConfig {@Value("${access.control.allow.origin}")private String originUrl;/*** 跨域过滤器.* * @return*/@SuppressWarnings({ "rawtypes", "unchecked" })@Beanpublic FilterRegistrationBean filterRegist() {FilterRegistrationBean frBean = new FilterRegistrationBean();frBean.setFilter(new SimpleCorsFilter());frBean.addUrlPatterns("/*");frBean.addInitParameter("originUrl", originUrl);return frBean;}
}

至此,跨域集成结束

五,集成 远程请求

1,封装工具类
package cn.yilixun.jt.econtract.portal.util;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;import com.alibaba.fastjson2.JSONObject;import lombok.extern.log4j.Log4j2;@Log4j2
public class RestTemplateUtil {/*** 发送请求.** @param method not null* @return*/public static JSONObject sendRequest(String url, HttpMethod method, Object bodyParams, JSONObject headerParams) throws Exception {log.info("RestTemplateUtil.sendRequest start :: [url] = " + url + ", [method] = " + method);RestTemplate rest = new RestTemplate();rest.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());HttpEntity<Object> request = RestTemplateUtil.getRequestEntity(bodyParams, headerParams);ResponseEntity<JSONObject> res = rest.exchange(url, method, request, JSONObject.class);if (res == null || res.getBody() == null) {throw new Exception("获取api数据异常");}log.info("RestTemplateUtil.sendRequest end :: " + res.getBody().toString());return res.getBody();}private static HttpEntity<Object> getRequestEntity(Object rbp, JSONObject rhp) {MultiValueMap<String, String> header = new LinkedMultiValueMap<>();if (rhp != null && !rhp.isEmpty()) {for (String key : rhp.keySet()) {header.add(key, rhp.getString(key));}}return new HttpEntity<>(rbp, header);}/*** 发送请求.** @param method not null* @return*/public static JSONObject sendRequestMap(String url, HttpMethod method, Map<String, Object> requestBodyParams, Map<String, String> requestHeaderParams) throws Exception {log.info("RestTemplateUtil.sendRequest start :: [url] = " + url + ", [method] = " + method);RestTemplate rest = new RestTemplate();rest.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());HttpEntity<Map<String, Object>> request = getRequest(requestBodyParams, requestHeaderParams);if (method == HttpMethod.GET) {url = convetUrl(url, requestBodyParams);}ResponseEntity<JSONObject> res = rest.exchange(url, method, request, JSONObject.class);if (res == null || res.getBody() == null) {throw new Exception("获取api数据异常");}log.info("RestTemplateUtil.sendRequest end :: " + res.getBody().toString());return res.getBody();}/*** 请求配置.** @Param :authorization* @Return :HttpEntity*/private static HttpEntity<Map<String, Object>> getRequest(Map<String, Object> rbp, Map<String, String> rhp) {Map<String, Object> body = new HashMap<>();HttpHeaders header = new HttpHeaders();if (rbp != null && !rbp.isEmpty()) {for (String key : rbp.keySet()) {body.put(key, rbp.get(key));}}if (rhp != null && !rhp.isEmpty()) {for (String key : rhp.keySet()) {header.add(key, rhp.get(key));}}return new HttpEntity<>(body, header);}public static class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {/*** RestTemplate 把数据从 HttpResponse 转换成 Object 的时候,找不到合适的 HttpMessageConverter 来转换* 需要继承 MappingJackson2HttpMessageConverter 并在构造过程中设置其支持的 MediaType 类型.*/public  WxMappingJackson2HttpMessageConverter() {List<MediaType> mediaTypes = new ArrayList<>();mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);setSupportedMediaTypes(mediaTypes);}}/*** get请求url拼接参数.* @Param :authorization* @Return :HttpEntity*/public static String convetUrl(String url, Map<String, Object> param) {String paramUrl = "";if (param != null) {for (Map.Entry<String, Object> e : param.entrySet()) {paramUrl+=(e.getKey() + "=" + e.getValue() + "&");}}if (StringUtils.hasLength(paramUrl)) {return url + "?" + paramUrl.substring(0, paramUrl.length() - 1);}return url;}
}
2,通用工具类方法sendRequest
private void executeAfterStartup() {JSONObject jsonObject = null;try {jsonObject = RestTemplateUtil.sendRequest("http://localhost:8080/aaaaa", HttpMethod.POST,new JSONObject(), null);} catch (Exception e) {e.printStackTrace();}if ("10".equals(jsonObject.get("code").toString())) {JSONObject jsonObject  = jsonObject.get("data");}}

至此,远程请求集成结束

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?
  • 【Cpp筑基】三、对象和类
  • g++ 编译器参数作用
  • “5G+Windows”推动全场景数字化升级:美格智能5G智能模组SRM930成功运行Windows 11系统
  • TPM管理咨询公司浅谈:Muri、Muda、Mura
  • 智能音箱和普通音箱有什么区别
  • 编程-设计模式 4:建造者模式
  • Daiqile SQL注入绕过
  • 八股面试大总结① —— 计算机网络篇
  • 【Android】JSON的具体使用方法之数据格式,数据解析,GSON的使用
  • 【总览】如何精读文献-经验分享
  • DC-5靶机渗透测试
  • 超赞!墙裂推荐这款开箱即用、永久免费的运维监控平台
  • Apple 智能基础语言模型
  • 【LVS】防火墙mark标记解决调度问题
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2017前端实习生面试总结
  • JavaScript对象详解
  • Java教程_软件开发基础
  • js中forEach回调同异步问题
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mysql 数据库四种事务隔离级别
  • Netty源码解析1-Buffer
  • Python爬虫--- 1.3 BS4库的解析器
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • underscore源码剖析之整体架构
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows-nginx-https-本地配置
  • Xmanager 远程桌面 CentOS 7
  • 大主子表关联的性能优化方法
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 简单实现一个textarea自适应高度
  • 讲清楚之javascript作用域
  • 码农张的Bug人生 - 见面之礼
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何用vue打造一个移动端音乐播放器
  • 手写双向链表LinkedList的几个常用功能
  • 跳前端坑前,先看看这个!!
  • 正则表达式小结
  • 智能合约开发环境搭建及Hello World合约
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Z0458. 树的中心2
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C#)获取字符编码的类
  • (多级缓存)多级缓存
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (五)网络优化与超参数选择--九五小庞
  • (新)网络工程师考点串讲与真题详解