96SEO 2026-02-19 15:51 0
我们在基于Session做登录认证的时候会有一些问题因为Session存储到服务器端然后通过客户端的Cookie进行匹配如果正确则通过认证否则不通过认证。

这在简单的系统中可以这么使用并且难度是最低的但是如果在大型分布式项目中如果还是基于Session做登录认证的话就不可行了。
这个时候我们可以基于token做登录认证。
token其实就是一个字符串生成token的实现方案有很多种可以使用uuid作为token也可以使用jwt作为token其中使用jwt实现的方案是最流行的那么下面将会讲如何在SpringBoot中基于jwt实现token登录认证。
dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion4.4.0/version
Target({ElementType.METHOD,ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
通过识别是否在接口上添加Auth注解来确定是否需要登录才能访问。
同时这里需要注意只拦截HandlerMethod类型同时还要考虑放行BasicErrorController因为基本的报错在这个控制器中如果不放行那么会看不到报错信息。
handlerMethod.getMethod().getAnnotation(Auth.class);if
(StringUtils.isNotBlank(token))
{request.getRequestDispatcher(/error/tokenError).forward(request,
{request.getRequestDispatcher(/error/token).forward(request,
这里是做前后端分离需要做的步骤解决跨域的方式有好几种这里使用拦截器的方式解决跨域问题。
{response.setHeader(Access-Control-Allow-Origin,
*);response.setHeader(Access-Control-Allow-Credentials,
true);response.setHeader(Access-Control-Allow-Methods,
OPTIONS);response.setHeader(Access-Control-Max-Age,
3600);response.setHeader(Access-Control-Allow-Headers,
x-requested-with,accept,authorization,content-type);return
这里没有用到全局异常处理器不过为了项目的完整性我还是选择把这些常规的内容写上去。
LoggerFactory.getLogger(this.getClass());ExceptionHandler(TokenExpiredException.class)public
handleTokenExpiredException(TokenExpiredException
已过期);logger.error(e.getMessage());return
R.error(ResponseEnum.TOKEN_EX);}
操作成功),FAIL(300,获取数据失败),USER_EX(301,用户不存在请重新登录),ERROR(302,错误请求),USERNAME_PASSWORD_ERROR(303,用户名或密码错误),NO_TOKEN(400,无token请重新登录),TOKEN_VERIFY_ERROR(401,token验证失败请重新登录),TOKEN_EX(402,token已过期);private
(code.equals(value.getCode())){return
R();response.setCode(ResponseEnum.SUCCESS.getCode());response.setMessage(ResponseEnum.SUCCESS.getMsg());response.setData(data);return
R();response.setCode(errCode);response.setMessage(errMessage);return
R();response.setCode(responseEnum.getCode());response.setMessage(responseEnum.getMsg());return
通过TokenUtil可以生成token和验证token是否正确。
com.auth0.jwt.algorithms.Algorithm;import
JWT.create().withSubject(json.toString())
不要把密码封装进去不安全.withIssuer(ISSUER)
设置发布者.withExpiresAt(DateUtil.offsetMinute(new
Map.sign(Algorithm.HMAC256(ENCRYPT_KEY));
JWT.require(Algorithm.HMAC256(ENCRYPT_KEY)).withIssuer(ISSUER).build();jwtVerifier.verify(token);return
TokenExpiredExceptione.printStackTrace();return
(StringUtils.isNotBlank(userName)
StringUtils.isNotBlank(password))
TokenUtil.createToken(json);user.setToken(token);return
R.error(ResponseEnum.USERNAME_PASSWORD_ERROR);}
R.error(ResponseEnum.NO_TOKEN);}PostMapping(/tokenError)public
R.error(ResponseEnum.TOKEN_VERIFY_ERROR);}
R.ok(登录成功);}PostMapping(/hi)public
addInterceptors(InterceptorRegistry
CrossInterceptorHandler()).addPathPatterns(new
{/**});registry.addInterceptor(new
LoginInterceptor()).addPathPatterns(/**).excludePathPatterns(/user/login,
访问登录接口通过提交表单方式提交请求通过token验证后会返回一个token然后我们请求添加了Auth注解的接口都需要在请求头添加token字段和对应的值。
如果请求头中没有填写token或者填写的不对在请求需求登录后才能访问的接口时都会报错。
比如这里的/test/hello是需要登录后才能访问的接口如果没有正确填写token那么会报错如下图所示。
有一个test/hi接口没有Auth注解可以不用登录就能访问如下图所示。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback