SEO基础

SEO基础

Products

当前位置:首页 > SEO基础 >

贵阳网站开发人员如何通过SEO技巧提升工资?

96SEO 2026-02-19 18:00 0


SpringSecurity

来做安全框架#xff0c;小项目用相对简单的Shiro。

贵阳网站开发人员如何通过SEO技巧提升工资?

认证、授权是

SpringSecurity

认证#xff1a;通过用户名密码验证当前访问系统的是不是本…Spring

Security

认证通过用户名密码验证当前访问系统的是不是本系统的用户并且要确认具体是哪个用户。

授权经过认证后判断当前用户是否有权限进行某个操作。

本笔记只做代码编写具体概念参考

B站视频链接SpringSecurity框架教程-Spring

认证流程图

Authentication接口它的实现类表示当前访问系统的用户封装了用户相关信息。

AuthenticationManager接口定义了认证

Authentication

authenticate()UserDetailsService接口加载用户特定数据的核心接口。

里面定义了一个根据用户名查询用户信息的方法loadUserByUsername()。

UserDetails接口提供核心用户信息。

通过

UserDetailsService

UserDetailsService接口在这个实现类中去查询数据库。

pom.xml

xmlnshttp://maven.apache.org/POM/4.0.0

xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0

http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.ymqx/groupIdartifactIdSpringSecurityDemo/artifactIdversion1.0-SNAPSHOT/versionnameSpringSecurityDemo/namepropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/propertiesparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.0/version/parentdependencies!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!--security--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependency!--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3/version/dependency!--mysql--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency/dependencies

/project引入依赖spring-boot-starter-security

service

1、根据用户名查询用户信息LambdaQueryWrapperUser

wrapper

LambdaQueryWrapper();wrapper.eq(User::getUserName,

username);User

userMapper.selectOne(wrapper);//

1.1、如果查询不到数据就通过抛出异常来给出提示if(Objects.isNull(user)){throw

new

3、封装成UserDetails对象返回UserDetails

loginUser

实现UserDetailsService接口重写loadUserByUsername()方法内部实现查询数据库逻辑将获取的用户信息封装成UserDetails对象返回。

1.2

user.getPassword();}Overridepublic

String

user.getUserName();}Overridepublic

boolean

jdbc:mysql://localhost:3306/sg_security?characterEncodingutf-8serverTimezoneUTCusername:

rootpassword:

默认使用的PasswordEncoder要求数据库中的密码格式为{id}password

它会根据id去判断密码的加密方式。

但是我们一般不会采用这种方式。

所以就需要替换PasswordEncoder。

我们一般使用SpringSecurity为我们提供的BCryptPasswordEncoder。

我们只需要使用把BCryptPasswordEncoder对象注入Spring容器中SpringSecurity就会使用该PasswordEncoder来进行密码校验。

我们可以定义一个

SpringSecurity

要求这个配置类要继承WebSecurityConfigurerAdapter。

public

passwordEncoder.encode(123456);System.out.println(encode);boolean

matches

passwordEncoder.matches(123456,

encode);System.out.println(matches);}

}输出

$2a$10$V.th3Vaeh9lzPJmtyM3A7eqL9YRZ1Cv4By4KmJN2F6t5bng6P4UFG

true字符串123456生成的密文插入到用户表sys_user

--密码原文存储

sys_user(user_name,nick_name,password,status,email,phonenumber,sex,avatar,user_type,create_by,create_time,update_by,update_time,del_flag)

values(sg,三更,$2a$10$V.th3Vaeh9lzPJmtyM3A7eqL9YRZ1Cv4By4KmJN2F6t5bng6P4UFG,0,null,123456789,男,,0,0,2022-06-01,0,2022-06-01,0)1.5

controller

{SpringApplication.run(SecurityApplication.class,args);}

}访问

入门案例每次访问资源都要重新认证而且需要使用SpringSecurity默认的login页面所以我们需要自定义登录接口。

通过入门的认证流程图可知通过AuthenticationManager的authenticate()方法来进行用户认证同时需要将登录接口进行放行让用户访问这个接口的时候不用登录也能访问。

认证成功的话要生成一个JWT放入响应中返回。

并且为了让用户下回请求时能通过JWT识别出具体的是哪个用户我们需要把用户信息存入redis可以把用户

自定义登录接口调用

UserDetailsService在这个实现类中去查询数据库。

已经实现

Jwt

中获取用户信息存入SecurityContextHolder。

2.1

!--redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--

--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency!--fastjson依赖--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.33/version/dependency!--jwt依赖--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.0/version/dependency2.2

新增工具类

clazz;static{ParserConfig.getGlobalInstance().setAutoTypeSupport(true);}public

byte[]

SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);}Overridepublic

deserialize(byte[]

TypeFactory.defaultInstance().constructType(clazz);}

}3.

redisTemplate(RedisConnectionFactory

connectionFactory){RedisTemplateObject,

Object

RedisTemplate();template.setConnectionFactory(connectionFactory);FastJsonRedisSerializer

serializer

FastJsonRedisSerializer(Object.class);//

使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new

StringRedisSerializer());template.setValueSerializer(serializer);//

Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new

StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return

template;}

value){redisTemplate.opsForValue().set(key,

value);}/***

timeUnit){redisTemplate.opsForValue().set(key,

value,

redisTemplate.opsForValue();return

删除单个对象**

redisTemplate.delete(key);}/***

删除集合对象**

redisTemplate.delete(collection);}/***

缓存List数据**

redisTemplate.opsForList().rightPushAll(key,

dataList);return

redisTemplate.opsForList().range(key,

-1);}/***

dataSet){BoundSetOperationsString,

setOperation

redisTemplate.boundSetOps(key);IteratorT

(it.hasNext()){setOperation.add(it.next());}return

setOperation;}/***

redisTemplate.opsForSet().members(key);}/***

缓存Map**

{redisTemplate.opsForHash().putAll(key,

dataMap);}}/***

redisTemplate.opsForHash().entries(key);}/***

往Hash中存入数据**

value){redisTemplate.opsForHash().put(key,

hKey,

redisTemplate.opsForHash();return

opsForHash.get(key,

redisTemplate.opsForHash();hashOperations.delete(key,

hkey);}/***

redisTemplate.opsForHash().multiGet(key,

hKeys);}/***

UUID.randomUUID().toString().replaceAll(-,

);return

Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey

key

SignatureAlgorithm.HS256;SecretKey

secretKey

System.currentTimeMillis();Date

now

Date(nowMillis);if(ttlMillisnull){ttlMillisJwtUtil.JWT_TTL;}long

expMillis

Date(expMillis);System.out.println(uuid);System.out.println(subject);System.out.println(secretKey);System.out.println(expDate);return

签发者.setIssuedAt(now)

签发时间.signWith(signatureAlgorithm,

secretKey)

第二个参数为秘钥.setExpiration(expDate);}/***

解析**

Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}public

static

JwtUtil.createJWT({usershwen});System.out.println(jwt);*///

jwt

60*1000L);System.out.println(jwt);//过期JWT解析会抛出异常String

token

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI1ODljMGE0MDQ0Y2Y0YmJiYmFhYjFiOWFmOTMzYzc3ZiIsInN1YiI6Int1c2VyPXNod2VufSIsImlzcyI6ImFkbWluIiwiaWF0IjoxNjk5MjczMzE0LCJleHAiOjE2OTkyNzMzNzR9.xMOjtNp2AESTjuSq9G75DaZh9M1dDuLDr4s7yw-xw_Q;Claims

claims

parseJWT(token);System.out.println(claims);}

}7.

renderString(HttpServletResponse

response,

{try{response.setStatus(200);response.setContentType(application/json);response.setCharacterEncoding(utf-8);response.getWriter().print(string);}catch

(IOException

的authenticate()方法来进行用户认证。

SpringSecurity对登录接口进行放行。

注入AuthenticationManager对登录接口进行放行。

package

super.authenticationManagerBean();}//

对登录接口进行放行

antMatchers(/user/login).anonymous()Overrideprotected

void

{http//关闭csrf.csrf().disable()//不通过Session获取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()//

对于登录接口

允许匿名访问.antMatchers(/user/login).anonymous()//

除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();}

}9.

org.ymqx.domain.ResponseResult;

import

authenticationManager;Autowiredprivate

RedisCache

1、自定义authenticationTokenUsernamePasswordAuthenticationToken

authenticationToken

UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword());Authentication

authenticate

authenticationManager.authenticate(authenticationToken);if(Objects.isNull(authenticate)){throw

new

authenticate.getPrincipal();String

userId

loginUser.getUser().getId().toString();String

jwt

userId;System.out.println(key);redisCache.setCacheObject(key,

loginUser);//

4、把token响应给前端HashMapString,String

map

SecurityContextHolder.getContext().getAuthentication();//

2、获取

authentication.getPrincipal();Long

userid

loginUser.getUser().getId();redisCache.deleteObject(login:

userid);return

提示信息如果有错误时前端可以获取该字段进行提示*/private

String

loginServcie;PostMapping(/user/login)public

ResponseResult

中获取用户信息存入SecurityContextHolder。

13.

filter.JwtAuthenticationTokenFilter

package

doFilterInternal(HttpServletRequest

request,

request.getHeader(token);System.out.println(token

token);if

{//放行filterChain.doFilter(request,

response);return;}//

claims.getSubject();System.out.println(userid

userid);}

redisCache.getCacheObject(redisKey);System.out.println(id

loginUser.getUser().getId());if(Objects.isNull(loginUser)){throw

new

4、存入SecurityContextHolder//TODO

获取权限信息封装到Authentication中UsernamePasswordAuthenticationToken

authenticationToken

UsernamePasswordAuthenticationToken(loginUser,null,null);SecurityContextHolder.getContext().setAuthentication(authenticationToken);//

5、放行filterChain.doFilter(request,

response);}

{AutowiredJwtAuthenticationTokenFilter

jwtAuthenticationTokenFilter;Overrideprotected

void

{http//关闭csrf.csrf().disable()//不通过Session获取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()//

对于登录接口

允许匿名访问.antMatchers(/user/login).anonymous()//

除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();//把token校验过滤器添加到过滤器链中http.addFilterBefore(jwtAuthenticationTokenFilter,

UsernamePasswordAuthenticationFilter.class);}...

}http.addFilterBefore(jwtAuthenticationTokenFilter,

UsernamePasswordAuthenticationFilter.class);

token



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