谷歌SEO

谷歌SEO

Products

当前位置:首页 > 谷歌SEO >

建设网站需要哪些工具来搭建中国住房和城乡建设部的证书查询系统?

96SEO 2026-02-20 07:44 0


但是不想写重复代码#xff0c;我们可以提供一个通用starter#xff0c;提…1.

建设网站需要哪些工具来搭建中国住房和城乡建设部的证书查询系统?

在我们日常的Java开发中免不了和其他系统的业务交互或者微服务之间的接口调用

但是不想写重复代码我们可以提供一个通用starter提供通用加密解密功能

前置知识

hutool-crypto提供了很多加密解密工具包括对称加密非对称加密摘要加密等等这不做详细介绍。

2.2

在接口调用链中request的请求流只能调用一次处理之后如果之后还需要用到请求流获取数据就会发现数据为空。

比如使用了filter或者aop在接口处理之前获取了request中的数据对参数进行了校验那么之后就不能在获取request请求流了。

2.2.2

继承HttpServletRequestWrapper将请求中的流copy一份复写getInputStream和getReader方法供外部使用。

每次调用后的getInputStream方法都是从复制出来的二进制数组中进行获取这个二进制数组在对象存在期间一致存在。

使用Filter过滤器在一开始替换request为自己定义的可以多次读取流的request。

InputStreamHttpServletRequestWrapper

package

xyz.hlh.cryptotest.utils;import

org.apache.commons.io.IOUtils;import

import

javax.servlet.ServletInputStream;

import

javax.servlet.http.HttpServletRequest;

import

javax.servlet.http.HttpServletRequestWrapper;

import

InputStreamHttpServletRequestWrapper

extends

InputStreamHttpServletRequestWrapper(HttpServletRequest

request)

{super(request);}Overridepublic

ServletInputStream

CachedServletInputStream(cachedBytes.toByteArray());}Overridepublic

BufferedReader

InputStreamReader(getInputStream()));}/***

首次获取流时将流放入

ByteArrayOutputStream();IOUtils.copy(super.getInputStream(),

cachedBytes);}/***

CachedServletInputStream(byte[]

buf)

ByteArrayInputStream(buf);}Overridepublic

boolean

HttpServletRequestInputStreamFilter

package

xyz.hlh.cryptotest.filter;import

org.springframework.core.annotation.Order;

import

org.springframework.stereotype.Component;

import

xyz.hlh.cryptotest.utils.InputStreamHttpServletRequestWrapper;import

import

javax.servlet.ServletException;

import

javax.servlet.http.HttpServletRequest;

import

org.springframework.core.Ordered.HIGHEST_PRECEDENCE;/***

author

HttpServletRequestInputStreamFilter

implements

转换为可以多次获取流的requestHttpServletRequest

httpServletRequest

request;InputStreamHttpServletRequestWrapper

inputStreamHttpServletRequestWrapper

new

InputStreamHttpServletRequestWrapper(httpServletRequest);//

放行chain.doFilter(inputStreamHttpServletRequestWrapper,

response);}

SpringBoot-validation提供了优雅的参数校验入参都是实体类在实体类字段上加上对应注解就可以在进入方法之前进行参数校验如果参数错误会抛出错误BindException是不会进入方法的。

这种方法必须要求在接口参数上加注解Validated或者是Valid

但是很多清空下我们希望在代码中调用某个实体类的校验功能所以需要如下工具类。

ParamException

xyz.hlh.cryptotest.exception;import

lombok.Getter;import

xyz.hlh.cryptotest.utils;import

xyz.hlh.cryptotest.exception.CustomizeException;

import

xyz.hlh.cryptotest.exception.ParamException;import

javax.validation.ConstraintViolation;

import

Validation.buildDefaultValidatorFactory().getValidator();/***

验证数据*

验证结果异常throwParamException(validate);}/***

验证数据(分组)*

验证结果异常throwParamException(validate);}/***

param

VALIDATOR.validateProperty(object,

propertyName);//

验证结果异常throwParamException(validate);}/***

param

VALIDATOR.validateProperty(object,

propertyName,

验证结果异常throwParamException(validate);}/***

验证结果异常*

throwParamException(SetConstraintViolationObject

validate)

{fieldList.add(next.getPropertyPath().toString());msgList.add(next.getMessage());}throw

new

声明自动配置类把需要对外提供的对象创建好通过配置类统一向外暴露

在resource目录下准备一个名为spring/spring.factories的文件以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key自动配置类为value列表进行注册

2.6

RequestBodyAdvice和ResponseBodyAdvice

RequestBodyAdvice是对请求的json串进行处理

ResponseBodyAdvice是对请求相应的jsoin传进行处理一般用于相应结果的加密

功能介绍

接口入参的时候接收的是解密之后的数据但是在进入接口之前会自动解密取得对应的数据

功能细节

加密解密使用对称加密的AES算法使用hutool-crypto模块进行实现

所有的实体类提取一个公共父类包含属性时间戳用于加密数据返回之后的实效性如果超过60分钟那么其他接口将不进行处理。

如果接口加了加密注解EncryptionAnnotation并且返回统一的json数据Result类则自动对数据进行加密。

如果是继承了统一父类RequestBase的数据自动注入时间戳确保数据的时效性

如果接口加了解密注解DecryptionAnnotation并且参数使用RequestBody注解标注传入json使用统一格式RequestData类并且内容是继承了包含时间长的父类RequestBase则自动解密并且转为对应的数据类型

代码实现

org.springframework.boot.autoconfigure.EnableAutoConfiguration\

xyz.hlh.crypto.config.AppConfig

CryptConfig

org.springframework.boot.context.properties.ConfigurationProperties;

import

org.springframework.context.annotation.Configuration;

import

org.springframework.context.annotation.PropertySource;import

author

PropertySource(classpath:crypto.properties)

Data

cn.hutool.crypto.symmetric.AES;

import

org.springframework.context.annotation.Bean;

import

org.springframework.context.annotation.Configuration;import

import

java.nio.charset.StandardCharsets;/***

author

cryptConfig.getKey().getBytes(StandardCharsets.UTF_8),

cryptConfig.getIv().getBytes(StandardCharsets.UTF_8));}}

请求自动解密

com.fasterxml.jackson.databind.ObjectMapper;

import

org.apache.commons.lang3.StringUtils;

import

org.springframework.beans.factory.annotation.Autowired;

import

org.springframework.core.MethodParameter;

import

org.springframework.http.HttpInputMessage;

import

org.springframework.http.converter.HttpMessageConverter;

import

org.springframework.web.bind.annotation.ControllerAdvice;

import

org.springframework.web.context.request.RequestAttributes;

import

org.springframework.web.context.request.RequestContextHolder;

import

org.springframework.web.context.request.ServletRequestAttributes;

import

org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;

import

xyz.hlh.crypto.annotation.DecryptionAnnotation;

import

xyz.hlh.crypto.common.exception.ParamException;

import

xyz.hlh.crypto.constant.CryptoConstant;

import

xyz.hlh.crypto.entity.RequestBase;

import

xyz.hlh.crypto.entity.RequestData;

import

xyz.hlh.crypto.util.AESUtil;import

javax.servlet.ServletInputStream;

import

javax.servlet.http.HttpServletRequest;

import

方法上有DecryptionAnnotation注解的进入此拦截器*

param

methodParameter.hasMethodAnnotation(DecryptionAnnotation.class);}Overridepublic

HttpInputMessage

beforeBodyRead(HttpInputMessage

inputMessage,

真实的参数*/SneakyThrowsOverridepublic

Object

RequestContextHolder.getRequestAttributes();ServletRequestAttributes

requestAttributes;if

ParamException(request错误);}HttpServletRequest

request

servletRequestAttributes.getRequest();//

inputStream

request.getInputStream();RequestData

requestData

objectMapper.readValue(inputStream,

(requestData

StringUtils.isBlank(requestData.getText()))

{throw

放入解密之前的数据request.setAttribute(CryptoConstant.INPUT_ORIGINAL_DATA,

text);//

(StringUtils.isBlank(decryptText))

{throw

放入解密之后的数据request.setAttribute(CryptoConstant.INPUT_DECRYPT_DATA,

decryptText);//

objectMapper.readValue(decryptText,

body.getClass());//

result).getCurrentTimeMillis();//

有效期

ParamException(String.format(请求参数类型%s

未继承%s,

RequestBase.class.getName()));}}/***

如果body为空转为空对象*

真实的参数*/SneakyThrowsOverridepublic

Object

targetType.getTypeName();Class?

bodyClass

com.fasterxml.jackson.databind.ObjectMapper;

import

org.apache.commons.lang3.StringUtils;

import

org.springframework.beans.factory.annotation.Autowired;

import

org.springframework.core.MethodParameter;

import

org.springframework.http.MediaType;

import

org.springframework.http.ResponseEntity;

import

org.springframework.http.converter.HttpMessageConverter;

import

org.springframework.http.server.ServerHttpRequest;

import

org.springframework.http.server.ServerHttpResponse;

import

org.springframework.web.bind.annotation.ControllerAdvice;

import

org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import

sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;

import

xyz.hlh.crypto.annotation.EncryptionAnnotation;

import

xyz.hlh.crypto.common.entity.Result;

import

xyz.hlh.crypto.common.exception.CryptoException;

import

xyz.hlh.crypto.entity.RequestBase;

import

xyz.hlh.crypto.util.AESUtil;import

author

(ParameterizedTypeImpl)returnType.getGenericParameterType();//

(genericParameterType.getRawType()

Result.class

returnType.hasMethodAnnotation(EncryptionAnnotation.class))

{return

(genericParameterType.getRawType()

{return

genericParameterType.getActualTypeArguments())

{if

returnType.hasMethodAnnotation(EncryptionAnnotation.class))

{return

false;}SneakyThrowsOverridepublic

Result?

{((RequestBase)data).setCurrentTimeMillis(System.currentTimeMillis());}String

dataText

(StringUtils.isBlank(dataText))

{return

CryptoException(加密失败数据小于16位);}String

encryptText

AESUtil.encryptHex(dataText);return

Result.builder().status(body.getStatus()).data(encryptText).message(body.getMessage()).build();}

5.4

org.hibernate.validator.constraints.Range;import

javax.validation.constraints.NotBlank;

import

javax.validation.constraints.NotNull;

import

Teacher实体类使用SpringBoot的validation校验*

email

xyz.hlh.crypto.controller;import

org.springframework.http.ResponseEntity;

import

org.springframework.validation.annotation.Validated;

import

org.springframework.web.bind.annotation.PostMapping;

import

org.springframework.web.bind.annotation.RequestBody;

import

org.springframework.web.bind.annotation.RestController;

import

xyz.hlh.crypto.annotation.DecryptionAnnotation;

import

xyz.hlh.crypto.annotation.EncryptionAnnotation;

import

xyz.hlh.crypto.common.entity.Result;

import

xyz.hlh.crypto.common.entity.ResultBuilder;

import

xyz.hlh.crypto.entity.Teacher;/***

author

不加密的对象*/PostMapping(/get)public

get(Validated

ResponseBodyResult格式*/PostMapping(/encrypt)EncryptionAnnotationpublic

encrypt(Validated

Result格式*/PostMapping(/encrypt1)EncryptionAnnotationpublic

Result?

success(teacher).getBody();}/***

param

返回解密后的数据*/PostMapping(/decrypt)DecryptionAnnotationpublic

decrypt(Validated



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback