尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Spring Boot Security实战指南:认证授权、过滤器链与踩坑全解析
说句实话我最初看到“Spring Boot Security的学习”这七个字时第一反应是又一个被Spring Security折磨的同行。这个框架在Java后端圈子里口碑两极分化很严重老手觉得它是标配保护壳新手却经常被过滤器链、认证管理器、CSRF这些概念绕到怀疑人生。我自己当年从SSH时代一路写过来第一次接触Spring Security时也懵了整整一周后来在真实项目里踩坑、翻源码、逐步调通才慢慢摸清它的脾气。这篇不是教科书也不打算把官方文档翻译一遍。我想用做项目的视角把学习Spring Boot Security过程中真正值得理解的东西讲明白它解决什么问题、核心机制是什么、如何在真实业务里落地、又会遇到哪些让人抓狂的坑。无论你是刚接触Spring Boot的初学者还是准备在项目里引入安全框架的老开发这篇都值得看完至少能帮你少走两个月的弯路。1. 先搞清楚Spring Security到底在解决什么问题1.1 认证与授权是两个完全不同的概念很多人一上来就抱着“配个登录”的心态去学Spring Security结果越学越乱。根子在于没分清认证和授权的边界。认证Authentication是证明“你是谁”的过程常见手段就是用户名密码、验证码、短信登录、OAuth第三方登录。它回答的是一个判断题请求方提供的身份凭证是否有效。授权Authorization是决定“你能干什么”的过程它回答的是一个选择题这个已经确认身份的人有没有权限访问某个接口、操作某条数据。我见过不少项目把这两件事混在一起在Controller里写一堆if判断比如“如果userId等于admin就放行”。这种做法在小项目里能跑但一旦角色变多、权限粒度变细代码就成了一团乱麻。Spring Security厉害的地方在于它把认证和授权拆成了两层用一套标准机制统一处理你只需要声明规则剩下的拦截、校验、放行都交给框架。学习时我建议先抓主线认证靠的是“凭证”授权靠的是“规则”。搞懂这两条线后面看什么都顺了。1.2 过滤器链是Spring Security的根基绕不开Spring Security本质上是一堆过滤器组成的链每个请求进来都要经过这条链上的层层关卡。这个设计对新手特别不友好因为你看不到它具体做了什么只能感受到“为什么我配置了半天还是不生效”。打个比方过滤器链就像机场安检你得先核验机票和身份证认证然后过安检门查违禁品CSRF防护最后才能进入对应的候机区授权。每个过滤器只干一件事通过就放行给下一个不通过就抛异常返回。Spring Boot自动配置时会给你注册一条默认的过滤器链。自定义配置的本质就是改换这条链上的关卡组合。比如前后端分离项目要把登录接口改成放行用postman调试时要把CSRF关掉静态资源要放行这些都是在配置这一条链。理解了过滤器链的模型再看Spring Security的各种配置类、配置方法你会发现它们不是在“写代码”而是在“组装关卡”。这是整个框架的心智模型越早建立越好。1.3 从“需求驱动”切入比“啃文档”有效得多初学者最容易踩的坑是抱着官方文档从头看到尾。Spring Security的文档写得严谨但信息密度极高没有项目背景去硬啃很容易看过就忘。我更建议用“需求驱动”的方式学先给自己定一个明确的目标比如“给一个前后端分离的博客系统加上账号密码登录和管理员授权”然后围绕这个目标去查文档、看源码、调demo。带着问题学效率高得多。真实项目里触发学习动机的场景我见得比较多的有这么几类给内部管理系统做登录和角色权限、为小程序或App后端提供token认证、给第三方开放API接口时要加签名校验和访问控制还有像基于大学生就业推荐系统这类毕设项目需要区分管理员、教师、学生身份。每一类需求的侧重点都不一样但核心都绕不开认证、授权、安全防护三件事。2. 学习路线与核心设计思路2.1 别急着写代码先回答三个问题我每次带新人做Spring Security都会逼着他们先写清楚三件事第一个登录凭证是什么形式。是传统的Session Cookie还是前后端分离用的JWT Token还是OAuth2.0第三方授权。选型直接决定配置方式。第二个接口的开放策略。哪些接口是公开的比如注册、验证码、登录哪些接口需要登录才能访问哪些接口只有特定角色才能访问。这三个层级对应Spring Security里permitAll、authenticated、hasRole三种规则。第三个密码存储方案。明文是绝对不行的至少要BCrypt加密如果项目里已经有现成的用户表还得考虑密码怎么迁移、怎么兼容老数据。这三个问题想清楚了配置类的骨架基本就出来了。剩下的都是往这个骨架上填细节。2.2 Session和JWT怎么选别盲目跟风我经常被问“到底用Session还是JWT”其实没有标准答案只有适不适合。如果项目是传统的服务端渲染页面比如Thymeleaf模板、JSP那用Session Cookie是最自然的方案Spring Security的默认表单登录就是这套机制配置量最少安全性也可靠。如果项目是前后端分离后端只提供REST API移动端和Web端共用一套接口那JWT更合适。因为客户端不维护Session服务端也不用关心分布式会话共享的问题Token里直接携带用户信息无状态扩展很方便。我对这两个方案的体验做个对比对比维度Session CookieJWT Token适用场景服务端渲染的传统Web应用前后端分离的REST API存储位置服务端内存或Redis客户端保存服务端不存储扩展性多实例部署需要会话共享天然无状态方便水平扩展安全性依赖Cookie安全属性Token有效期与签名需要重点设计实现复杂度Spring Security默认支持需要额外配置和解析逻辑这里想多说一句JWT不是万能药。它的负载是Base64编码的不是加密的敏感信息不能往里面塞。而且JWT一旦签发在有效期内很难主动作废遇到用户被踢下线的场景就很尴尬。所以真实项目里我更倾向于短期JWT 刷新Token的组合或者干脆用Redis存Session、用Redis实现Session共享效果也不错。2.3 Spring Boot 3带来了什么变化近几年Spring生态最大的变动就是Spring Boot 3基于Jakarta EEJava 17成为基线Spring Security也升级到了6.x。最直观的变化是配置方式变了。以前写基于内存用户的配置需要继承WebSecurityConfigurerAdapter重写configure方法这一套在Spring Security 6里已经被彻底废除。现在的标准姿势是声明一个SecurityFilterChain的Bean配合EnableWebSecurity注解。另外一个变化是方法安全注解的包名调整了。原来用EnableGlobalMethodSecurity新版本变成了EnableMethodSecurity注解还是PreAuthorize、Secured那些但底层机制更贴近最新的Spring生态。Java版本也要多留意。如果你还在用Java 8Spring Boot 3跑不起来至少要Java 17。除非项目强制停留在Spring Boot 2.7否则我建议新项目直接上Spring Boot 3 Spring Security 6少走一遍旧配置的弯路。3. 手写一个最小可运行的认证授权模块3.1 引入依赖与基础配置实战第一步先把依赖加进pom.xml。如果你用的是Spring Initializr生成项目勾选Spring Security依赖就自动带了不需要额外写版本号。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency只要加入这个依赖不写任何配置Spring Boot就会自动开启一套默认安全策略所有接口都需要登录默认用户名是user启动时在日志里随机生成密码默认走表单登录页。第一次跑起来看到这个效果很多人会误以为框架坏了其实恰恰说明它已经生效了。接下来在application.yml里补充基本配置。如果只是想临时改个端口一行就够server: port: 8081如果你用的是Intellij IDEA社区版注意Spring Boot项目不需要付费版才能跑社区版完全够用只要在Run Configuration里选ApplicationMain Class填主启动类就行。习惯VSCode的也可以用Spring Boot Extension Pack,启动和调试体验也不差。3.2 配置SecurityFilterChain掌握放行与拦截这是整个Spring Security配置里最重要的一个Bean也是Spring Boot 3 Security 6的核心姿势。package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth - auth .requestMatchers(/api/auth/login, /api/auth/register, /public/**).permitAll() .requestMatchers(/admin/**).hasRole(ADMIN) .anyRequest().authenticated() ) .formLogin(form - form .loginProcessingUrl(/api/auth/login) .permitAll() ) .csrf(csrf - csrf.disable()); return http.build(); } }这里面的逻辑我来逐条讲清楚。authorizeHttpRequests是授权规则的入口按从上到下的顺序匹配先声明放行的接口再声明需要特定角色的接口最后用anyRequest().authenticated()兜底表示剩下的所有接口都要登录。有个坑提醒一下规则顺序很重要。如果把anyRequest().authenticated()写在前面后面的角色规则全都不生效因为所有请求已经被兜底规则拦了。这个顺序问题和用Switch语句写case条件的逻辑是一模一样的先匹配特殊的再匹配全部的。csrf.disable()在前后端分离场景下几乎是必写的因为CSRF防护依赖Session和表单提交纯REST接口不做页面渲染默认的CSRF保护反而会拦截POST请求害得你在Postman里各种不通。3.3 UserDetailsService与密码加密实操认证过程里框架要回答一个问题用户提交的用户名密码和数据库里存的对不对得上。Spring Security自己不直接操作数据库而是通过UserDetailsService接口来获取用户信息。你需要实现这个接口告诉它“根据用户名去哪里查人”。package com.example.demo.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.util.Collections; Service public class CustomUserDetailsService implements UserDetailsService { Autowired private UserMapper userMapper; Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user userMapper.selectOne( new LambdaQueryWrapperUser().eq(User::getUsername, username) ); if (user null) { throw new UsernameNotFoundException(用户不存在); } return org.springframework.security.core.userdetails.User .withUsername(user.getUsername()) .password(user.getPassword()) .authorities(Collections.singletonList(new SimpleGrantedAuthority(ROLE_ user.getRole()))) .build(); } }这段代码的思路是把数据库查出来的用户信息包装成Spring Security认识的一个UserDetails对象。这里尤其要注意角色名的格式权限字符串要拼成ROLE_ADMIN这种形式方法安全注解hasRole用的时候才会正确匹配。密码加密这块强烈建议用BCrypt。Spring Security已经内置了BCryptPasswordEncoder你只需要把它注册成一个Bean然后在创建用户或注册接口里调用它的encode方法存库。BCrypt算法会自动加盐每次生成的密文都不一样所以比对时要用matches方法而不是明文相等判断。Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }我有一次排查过低级问题用户注册时密码直接明文存库导致登录永远验证失败。后来把注册逻辑改成passwordEncoder.encode(password)入库问题秒解。这个坑很常见写代码时一定要留神。3.4 授权规则与自定义权限注解接口级别的授权用requestMatchers可以覆盖大部分场景但精细到方法级别的控制就需要借助方法安全注解了。先开启这个能力Configuration EnableWebSecurity EnableMethodSecurity public class SecurityConfig { }然后在Service或Controller方法上使用注解。PreAuthorize是使用最频繁的支持SpEL表达式可以做非常灵活的判断。GetMapping(/admin/user/list) PreAuthorize(hasRole(ADMIN)) public Result userList() { return Result.success(userService.list()); } PostMapping(/order/{id}/delete) PreAuthorize(hasRole(ADMIN) or hasRole(MANAGER)) public Result deleteOrder(PathVariable Long id) { return Result.success(orderService.deleteById(id)); }实际项目中我更喜欢用权限码而非角色码来控细粒度权限。比如订单模块的删除权限不叫ROLE_ORDER_DELETE而是直接在数据库权限表里存一个order:delete的权限标记然后在PreAuthorize(hasAuthority(order:delete))里用。这样构建RBAC模型时更加灵活角色和权限分离后续调整角色绑定的权限也方便。授权这块我还会配合一个CheckPermission这种自定义注解来做扩展配合AOP实现额外的业务规则判断。这个属于进阶玩法前期基础掌握后再去研究也不迟。4. 把Spring Security放进真实项目4.1 和MyBatis集成时的权限数据模型设计Spring Boot MyBatis是Java老中青年项目里最常见的组合了多商户跨境商城、大学生就业推荐系统这类业务底层几乎都是这套。模型设计上我建议至少建三张核心表用户表、角色表、权限表。然后用用户角色关联表和角色权限关联表把关系串起来。用户对应多个角色角色对应多个权限这就构成了标准的RBAC模型。t_user(id, username, password, status) t_role(id, role_name, role_code) t_permission(id, perm_name, perm_code) t_user_role(id, user_id, role_id) t_role_permission(id, role_id, permission_id)为什么这类项目一定要用RBAC举个实际的例子一个跨境商城里有超级管理员、运营、商家、仓库管理员、客服等多个角色。超级管理员可以访问所有功能商家只能管自己的商品和订单仓库管理员只能处理发货和库存。如果不抽角色和权限直接在用户表里加几十个布尔字段后续随便一个角色调整都要改表结构光想想都头大。MyBatis的Mapper就负责承接这些表的查询然后在UserDetailsService里把查出来的角色和权限全部转成SimpleGrantedAuthority放进去。这样Spring Security在授权判断时就能从当前用户关联的权限集合里精准匹配。4.2 给第三方提供接口校验应该放在哪里很多人问到给第三方提供接口是单独拆一个服务还是放在业务服务里Spring Security又怎么配合我的经验是分两种场景。如果是给公司内部的另一个系统提供接口放在现有服务里没问题路径单独规划一个/open/api/前缀在Security配置里对这些路径单独配置认证规则。如果接口是给外部公司、商户或App调用的我更建议单独拆一个网关或认证服务。原因不只是安全隔离还包括流量控制、签名验签、日志审计这些逻辑可能需要单独联调。真实项目中第三方接口常用的校验方案有这么几种。固定API Key的方式即服务方给第三方分配一个key调用时放在Header里签名校验的方式即请求参数按规则拼接加盐后做MD5或HMAC签名服务端验签确认数据没有被篡改OAuth2.0的方式适合第三方需要代表用户执行操作的场景。Spring Security对这三种方式都有对应支持。单一API Key可以用一个自定义OncePerRequestFilter预先拦一下合法的请求放行到后续流程。签名校验则把验签逻辑放在Spring MVC的Interceptor里更顺手因为验签通常需要解析完整请求体。OAuth2.0则直接用oauth2ResourceServer配置接入。我的建议是先想清楚第三方接口是“服务端到服务端”的机器调用还是“客户端到服务端”的用户调用。前者用API Key或签名就够后者才需要完整走OAuth2.0。不要把简单问题复杂化。4.3 用Spring Boot Admin做监控时安全配置怎么配合有一个热词提到“Spring Boot实现监控都有哪些需求和功能”这里点名说一下Spring Boot Admin。Spring Boot Admin本身是一个独立的监控服务端用于监控多个Spring Boot应用的状态、指标、日志等。它有两种角色Admin Server是监控中心Admin Client是被监控的Spring Boot服务。问题来了如果你的业务服务已经接了Spring Security那Admin Server要访问Client的Actuator接口时Client的安全配置必须放行/actuator/**。否则Admin Server拉取健康信息时会被拦成401或403。.requestMatchers(/actuator/**).permitAll()类似的Admin Server自身一般也要加一层登录认证不能裸奔在公网。最简单的做法是用Spring Security给Admin Server配一套登录页只有内部运维人员知道账号密码。这里有个配置细节如果Actuator接口放行但暴露的端点过多存在信息泄露风险。建议用management.endpoints.web.exposure.include只暴露有必要监控的端点并且把health、info这类端点放给匿名访问其余端点在内网或加权限访问。5. 日常开发中的常见坑与排查技巧5.1 401和403别再傻傻分不清楚被不停追问“为什么我返回401/403”大概是Spring Security新手问得最多的一类问题。Java后端老手都知道但初学者经常搞混。401 Unauthorized其实指的是“未认证”。意思是请求没有携带身份凭证或凭证无效系统不知道你是谁。403 Forbidden指的是“已认证但没有权限”。意思是系统知道你是谁但你不具备访问这个资源的资格。对应到Spring Security的排查思路就很清晰了如果返回401先检查请求头里有没有Token、Token是否过期、Token解析是否成功如果返回403先检查当前用户的角色或权限是否被授予、授权规则里是否用了错误的hasRole和hasAuthority。我曾经排查过一个诡异问题同一个接口A用户访问正常B用户访问就403。后来发现B用户在数据库里分配的角色代码是admin而代码里注册权限时统一拼成了ROLE_ADMINB用户的角色代码和配置完全对不上导致授权永远失败。这类问题光看代码不容易发现用日志把当前用户的所有权限打印出来一眼就能看出来问题在哪。5.2 CSRF和静态资源两个高频迷惑点CSRF这个概念我在前面提过了。这里补充一个经验如果你的项目是做纯后端API不引入页面表单提交那么关闭CSRF完全没问题因为CSRF攻击依赖的是浏览器在不知情的情况下携带Cookie发起请求前后端分离 Token认证的场景下这种攻击面基本不存在。静态资源放行也是常见刚需。比如前端放在/static目录下的图片、CSS、JS文件如果被Spring Security拦截页面就会出现排版错乱、图片加载失败。配置放行时要注意路径匹配.requestMatchers(/css/**, /js/**, /images/**, /favicon.ico).permitAll()还有一个容易忽略的坑Swagger接口文档。开发环境通常要放行/swagger-ui/**和/v3/api-docs/**不然前后端联调时接口文档打不开。但生产环境要记得关掉或加权限保护否则等于把你的接口全景图暴露给所有人。5.3 开发工具与端口那些事搜索热词里提到“Intellij IDEA社区版怎么用Spring Boot”和“修改demo端口号”这里一并说说。社区版Intellij IDEA完全可以开发Spring Boot项目Maven导入依赖、运行主类、Debug调试都没问题。社区版比收费版缺的是Spring Initializr集成和一些高级的Spring插件但可以从Spring官网start.spring.io下好项目压缩包再导入工程体验几乎没有差别。VSCode则更轻量配合Java Extension Pack和Spring Boot Extension Pack跑Spring Boot的体验我已经实测过很多次除了热部署稍显笨拙日常开发完全够用。修改端口时最标准的方式是在application.yml里改server.port。启动时如果你想临时指定端口也可以在启动命令后面加参数java -jar demo.jar --server.port8082如果你还需要同时改其它配置Spring Boot的配置优先级是命令行参数 环境变量 application.yml application.properties这个顺序搞清楚很多启动问题就能自己解决了。5.4 Spring Boot 3的旧资料陷阱现在网上的Spring Security教程相当一部分还是以前的写法。你搜extends WebSecurityConfigurerAdapter、EnableGlobalMethodSecurity搜出来的老文章照抄在Spring Boot 3项目里根本编译不过去。写这篇文章时我给个明确的版本对照Spring Boot 2.7 Spring Security 5.x还能用老写法Spring Boot 3.x Spring Security 6.x请用SecurityFilterChainEnableMethodSecurity的新写法。所有依赖版本号交给Spring Boot BOM管理尽量不要手工指定Spring Security版本否则容易出现各种莫名的兼容问题。另外提醒一句spring.factories和spring.config.import这类的配置方式在Boot 3里也有变化。遇到项目启动时某个自动配置类不生效先检查依赖是放到implementation还是compileOnly然后再排查注解有没有被正确扫描到。6. 学习路径与避坑建议6.1 我的推荐学习顺序经常有人让我推荐Spring Security的学习路径我给的顺序比网上大多数教程要“反直觉”一些先去理解过滤器链模型再看简单的用户密码认证紧接着做方法级别授权最后才碰JWT、OAuth2.0等进阶内容。第一步跑通最简单的表单登录demo感受一下依赖加入后发生了什么。第二步搭一个内存用户掌握UserDetailsService的实现方式。第三步把数据库用户表接进来配合MyBatis或MyBatis-Plus查询用户。第四步做接口授权区分permitAll、authenticated、hasRole。第五步才是集成JWT处理Token生成、拦截、解析和异常处理。每一步都跑通demo后再往下走不要跳步。6.2 和FastAPI这类后端框架对比换一个视角理解安全设计不少学Spring Boot的人也会接触Python的FastAPI。搜索热词里就有“后端Spring Boot 3和Python FastAPI”我聊聊两者在处理安全上的差异。Spring Security是一个完整、历史悠久的框架默认提供一套安全策略你只要加入依赖整个应用瞬间被保护起来。这是它的优点也是学习曲线陡峭的原因因为你面对的是一个“什么都管”的框架。FastAPI的OAuth2和JWT更像是一堆独立工具把密码校验、Token生成、依赖注入这些零件拆开你需要手动把它们组装起来。看FastAPI官方文档的安全教程你会发现逻辑非常直白因为它没有传统框架那么多历史包袱。这种对比给我们的启发是Spring Security的复杂一部分是历史演进导致的但不代表设计不合理。它的抽象层级更高很多安全最佳实践已经被内置了。我在FastAPI里要写的几十行代码Spring Security里可能几个配置方法就搞定了。理解这个差异后你对Spring Security反而会多几分敬畏和认同。6.3 真正有效的小项目练习思路纸上得来终觉浅学习Spring Security最有效的办法是找一个小项目亲手做一遍安全改造。我推荐你拿一个最简单的“用户管理”应用练手用户注册登录、默认角色分配、管理员才能删除用户、普通用户只能查看自己信息。依次加上接口防刷、登录次数限制、密码加密升级、JWT登录、权限码校验。每加一个功能都是一次实战遇到问题再回头看文档知识就变成你的了。练习时控制台日志多开。Spring Security在debug模式下会输出大量有用的中间过程信息logging.level.org.springframework.securityDEBUG加上以后你能清楚地看到每个请求走到了过滤器链的哪一环被哪个过滤器拦下来了。查问题效率比对着代码猜快十倍。6.4 最后分享一个小技巧把异常响应调成你自己习惯的格式默认情况下Spring Security认证失败返回的是一个简单的401或Page Not Found页面。真正开发接口时合理的做法是自定义异常响应让返回格式和业务接口统一比如Result.error(401,未登录或登录已过期)这样前端统一拦截处理就很方便。实操时实现AuthenticationEntryPoint和AccessDeniedHandler把未认证异常和未授权异常分别处理。代码如下复制可直接用Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .exceptionHandling(ex - ex .authenticationEntryPoint((request, response, authException) - { response.setCharacterEncoding(UTF-8); response.setContentType(application/json); response.getWriter().write(JSON.toJSONString(Result.error(401, 未登录或登录已过期))); }) .accessDeniedHandler((request, response, accessDeniedException) - { response.setCharacterEncoding(UTF-8); response.setContentType(application/json); response.getWriter().write(JSON.toJSONString(Result.error(403, 没有权限访问))); }) ) .authorizeHttpRequests(...); return http.build(); }这个细节我在项目里几乎必用因为如果一直用框架默认的异常返回前端联调时常被迫处理各种格式混乱的错误信息体验很差。7. 写在最后我的真实体会我接触Spring Security大概五年了从最开始照着旧教程写WebSecurityConfigurerAdapter到后来用Spring Boot 3重写一整套项目中间交了不少学费。最深的体会是这个框架的很多设计看似繁琐其实是在逼你养成安全思维。以前自己写登录拦截器爽是爽但漏洞也容易埋得深密码明文存库、接口漏加校验、Token不过期、没有操作日志这些问题在真实生产环境里每一个都能致命。Spring Security把大部分标准安全措施做成默认开关你在这个基础上做事至少不会犯最基础的错误。如果你正在被它折磨别灰心。把过滤器链想成一条流水线把认证授权想成关卡规则动手写一个小项目跑通一遍你就能感受到框架给你兜底的踏实感。技术这件事从来都是先痛苦后通透花了深功夫调通的那一刻你会觉得一切都值了。
RELATED

相关推荐

给Claude装个长期记忆:claude-mem使用与部署指南

给Claude装个长期记忆:claude-mem使用与部署指南

你有没有遇到过这种尴尬的情况:昨天刚让Claude帮你梳理完一个项目的技术方案,今天打开新会话,它像是被格式化了内存,对你的项目背景、技术栈、偏好习惯一概不知,又得像第一次见面一样从头解释一遍。我折腾过各种prompt…

📅 2026/10/7 4:32:09
iOS地图定位实战:解决黑屏、后台失效与权限拒绝

iOS地图定位实战:解决黑屏、后台失效与权限拒绝

简介:本资源是一个面向iOS初学者与中级开发者的地图定位功能实战Demo,聚焦Core Location与MapKit框架集成,解决应用中获取用户位置、显示地图及追踪定位等核心需求。压缩包共23个文件,包含5个Objective-C实现文件(.m/.…

📅 2026/10/7 4:32:09
Spring Boot + Vue协作机器人门户开发:从表设计到部署全记录

Spring Boot + Vue协作机器人门户开发:从表设计到部署全记录

去年底接到一个协作机器人厂商的项目,要帮他们把面向客户的门户网站系统搭起来,内部项目代号就叫 058。一开始以为就是做个产品展示官网,真动手拆需求才发现,协作机器人门户要管的内容比普通企业站复杂得多:产品系列、…

📅 2026/10/7 4:32:09
MORE NEWS

更多资讯

📰

MiniMax M Plan 迁移与 H3 视频本地部署:Claude Code 和 Cursor 接入实录

1. 从 Token Plan 到 M Plan:这次改动到底动了谁的蛋糕如果你最近两个月一直在用 MiniMax 的 API 做多模态应用,大概率已经被那条“Token Plan 即将下线”的公告刷过屏。我自己的几个小项目从去年开始就挂在 Token Plan 上,视频生成、语音合成…

📰

基于Python的高校学业预警系统设计与实现:Flask+MySQL实战指南

简介:面向高校计算机相关专业毕业生的基于Python的高校学生学业预警系统毕业设计资源包已整理上传,系统采用Django框架与MySQL数据库实现,包含学生管理、成绩管理、预警分析等核心功能模块,并配套完整毕业论文文档,适合…

📰

JSP火车票查询系统实战:Servlet+JDBC+MySQL从环境搭建到答辩避坑

简介:一套面向Java Web初学者的JSP火车查询系统毕业设计项目,采用B/S模式,以Java、JSP与MySQL为核心技术栈,适用于计算机专业学生进行课程设计、毕业设计或Java Web入门练习。资源包含完整项目源代码、数据库脚本及部署配置&#…

📰

t3code:基于Electron的终端增强型开发壳工具解析

1. 项目概述:t3code 是什么?它解决的不是“安装问题”,而是开发者本地环境的“认知摩擦”t3code 这个名字乍看像某个开源工具的代号,但结合当前全网搜索热度——t3code、CLI、Electron、Homebrew、winget 这些词高频共现&#xff…

📰

Python递归实战:朱梁真理元嵌套函数与闭包避坑指南

如果你也被“递归”这两个字折磨过,那这篇内容应该能帮到你。我最近在复盘一个困扰团队很久的 Python 递归问题,最后把所有经验浓缩成了一条内部黑话,全称叫“朱梁真理递归元嵌套函数定理”。名字听着中二,其实就是我们对“递归 …

📰

AI Native团队落地手册:CLAUDE.md、Plan Mode与Agent实战

1. 从“用AI写代码”到“AI Native团队”的认知跃迁这两年我参与过不少团队的研发流程改造,从最早大家偷偷用补全插件,到后来公司统一采购助手账号,再到现在张口闭口“AI Native”,中间踩的坑比想象中多得多。很多人以为把Copilot…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬