服务端渲染(SSR)与客户端渲染(CSR)详解

1. 背景与概念

在早期 Web 时代,网页主要是静态 HTML 页面,用户点击链接后会刷新整个页面。随着网络与前端技术的发展,人们开始追求更好的页面性能与用户体验,尤其是在移动端和实时交互场景下,对于页面加载速度的要求不断提升。

渲染是指如何将数据转换成可视化的页面输出给用户。渲染策略的不同主要体现在在哪个环节完成页面 DOM 结构的组装:

  • 服务端渲染(SSR,Server-Side Rendering):在服务器将 HTML 拼装好,再返回给浏览器。
  • 客户端渲染(CSR,Client-Side Rendering):将 HTML 基础骨架和脚本文件返回给浏览器,由客户端自行完成页面结构与内容的生成。

理解两种不同的渲染模式以及它们各自的优缺点,是进行高效 Web 开发的基础。


2. 服务端渲染(SSR)

2.1 原理与工作流程

SSR 的核心思想是:服务器在接收到用户请求后,通过后台模板引擎或服务器端框架将 HTML 模板与数据整合生成完整的 HTML 文件,然后将这份完整的页面内容一次性返回给用户。

下图展示 SSR 的渲染流程:

服务端渲染(SSR)与客户端渲染(CSR)详解_第1张图片

  1. 用户请求页面:用户在浏览器输入 URL 或点击链接。
  2. 服务器处理请求:服务器通过后端应用(如 Node.js、Java、PHP 等)执行逻辑、查询数据库或调用其他服务。
  3. 生成 HTML:服务器端使用模板引擎(如 EJS、Pug、Thymeleaf 等)或 SSR 框架将数据与模板合并生成完整 HTML。
  4. 返回响应:服务器一次性返回完整的 HTML 文件给浏览器。
  5. 浏览器渲染:由于 HTML 已包含了页面内容,浏览器能够立即开始渲染首屏。

2.2 优点

  1. 更快的首屏渲染
    • 浏览器无需等待大量的 JavaScript 执行或数据请求,在接收完服务器返回的 HTML 之后即可开始显示页面。
  2. SEO 友好
    • 搜索引擎爬虫可以直接爬取到带内容的 HTML,能更好地索引页面,对需要搜索流量的网站至关重要。
  3. 较好的兼容性
    • 一些不支持 JavaScript 的浏览器或者用户关闭 JS 时,仍能看到基本页面内容。

2.3 缺点

  1. 服务器压力较大
    • 每次请求都要在服务器上进行页面拼装,如果遇到高并发场景,服务器负载可能会显著提高。
  2. 开发部署复杂
    • SSR 通常需要前后端协同开发,或者使用如 Next.js、Nuxt.js 这类兼具前后端逻辑的框架,构建流程、部署模式均比纯前端复杂。
  3. 交互性相对有限
    • SSR 返回静态 HTML 后,后续页面的动态交互需要在客户端使用 JavaScript“接管”,这通常称为 Hydration(注水),并非 SSR 自带的功能,但在现代框架中普遍存在。

2.4 常见框架与技术

  • Next.js(基于 React):支持 React 代码在服务端的渲染,并提供多种数据获取方式(如 getServerSidePropsgetStaticProps 等)。
  • Nuxt.js(基于 Vue):基于 Vue.js 提供类似的 SSR 功能。
  • Angular Universal:Angular 官方提供的 SSR 解决方案。
  • 传统多页应用模型:PHP + Apache、Ruby on Rails、Django 等常见后端 MVC 框架都属于服务端渲染的范畴。

3. 客户端渲染(CSR)

3.1 原理与工作流程

与 SSR 相比,CSR 的核心在于前端框架在浏览器端执行,把后端返回的原始数据(通常是 JSON)与模板代码在浏览器完成拼接,生成并更新 DOM。

下图展示 CSR 流程:

服务端渲染(SSR)与客户端渲染(CSR)详解_第2张图片

  1. 用户请求页面:浏览器加载到一个基本的 HTML 页面,其中包含一个容器
    (或
    )以及一段 JS 脚本。
  2. 加载并执行 JS:浏览器下载并执行前端框架代码(如 React、Vue、Angular 等)。
  3. 前端请求数据:前端脚本向后端 API 请求数据(可能是 RESTful、GraphQL 等)。
  4. 返回 JSON 数据:服务器返回所需的数据给浏览器。
  5. 渲染或更新 DOM:前端框架在浏览器端根据数据动态生成 HTML 并插入到页面中。

3.2 优点

  1. 更强的前端交互与动态性
    • 前端可以精确地控制页面上的每个组件,响应式更新更加灵活。
  2. 前后端分离
    • 后端只需要提供数据接口,前端处理全部的页面渲染,开发协作更清晰。
  3. 减轻服务器端负载
    • 服务器主要负责返回静态资源和数据,页面拼装工作转移到浏览器端,服务器的渲染压力减少。

3.3 缺点

  1. 首屏渲染速度慢
    • 用户需要先加载所有的 JS 代码和执行脚本,然后等待数据请求完成,才会看到完整的页面。网络较差时体验不佳。
  2. SEO 不友好
    • 依赖 JavaScript 渲染的页面对搜索引擎爬虫来说可能是“空白页”, 除非采用预渲染SSR 混合等手段。
  3. 复杂的前端工程化
    • CSR 项目往往要考虑打包、路由、状态管理、数据处理等工程问题,团队需要具备更全面的前端技能。

3.4 常见框架与技术

  • React + React Router + Redux 或其它数据流框架(如 MobX、Recoil)。
  • Vue + Vue Router + Vuex (或 Pinia)。
  • Angular(完全前端 SPA 框架)
  • Svelte、Ember、Backbone.js 等相对小众但仍有市场的解决方案。

4. SSR vs CSR:对比与应用场景

4.1 场景对比

指标 服务端渲染(SSR) 客户端渲染(CSR)
首屏速度 快(服务器返回完整 HTML) 慢(需先加载 JS,再请求数据生成 DOM)
SEO 效果 好(爬虫可直接获取内容) 相对差(需要额外的预渲染或 SSR 支持)
服务器压力 高(服务器需要频繁渲染页面) 低(主要服务接口与静态资源)
前端交互性 需要 SSR + Hydration 实现 SPA 交互 交互灵活,前端占主导地位
开发/部署难度 较复杂,需要特定的 SSR 框架或方案配合 相对简单,前后端分离较彻底
适用场景 内容驱动、对 SEO 要求高、追求首屏速度 以交互性为主的应用、大量组件化逻辑、高度前后端分离

4.2 哪种策略适合你?

  • 如果你的项目是新闻、博客、文档、内容社区等类型,且需要更好的 SEO 和更快的首屏速度,SSR 是更优选。
  • 如果你的项目是管理后台、数据可视化平台、社交应用等高度交互的 Web 应用,或者对 SEO 要求不高,CSR 通常更灵活,用户的后续操作也会更丝滑。

4.3 典型案例分析

  1. 搜索引擎依赖型网站:如营销型官网、博客或媒体站点。
    • SSR 能够保证页面在第一时间渲染出可读内容,并利于搜索引擎索引。
    • 若流量非常高,需做好服务器集群或缓存策略。
  2. 电商网站:商品详情页需要 SEO,但用户下单流程和个性化推荐又需要较多交互。
    • 可采用 关键页面 SSR,如商品详情页、栏目列表页等;其它部分使用 CSR 以提升交互体验。
  3. 大型 SPA(如管理平台、社交平台)
    • 更适合 CSRSSR + Hydration 的形式。SSR 提供初始页面的内容渲染,Hydration 让前端具备 SPA 的流畅体验。

5. 混合渲染:SSG、同构渲染和渐进增强

在实际项目中,SSR 和 CSR 并非万能钥匙,混合渲染方案则像一把瑞士军刀,更灵活地满足不同需求。

5.1 SSG(静态站点生成)

  • 核心思想:在构建阶段就把所有动态页面编译成纯静态的 HTML 文件,部署到 CDN 或静态服务器。
  • 适用场景:博客、文档、营销页面等,页面内容更新频率较低,但对访问速度和 SEO 要求高。
  • 代表框架:Next.js 的 getStaticProps、Nuxt.js 的 nuxt generate、Gatsby、Hexo、Hugo 等。

5.2 同构渲染(Isomorphic / Universal)

  • 概念:让前端和后端使用相同的技术栈(通常是 JavaScript),页面初始由服务端渲染生成 HTML,浏览器接收后再由相同的前端框架接管后续交互。
  • 优势:前后端共享代码与组件逻辑,减少重复开发;可以先 SSR 提供首屏,再启用 CSR 进行前端交互。
  • 代表技术:React + Next.js、Vue + Nuxt.js、Angular Universal。

5.3 渐进增强与客户端 Hydration

  • 渐进增强:优先给用户展示基本可用的内容(SSR 方案),然后在浏览器加载完脚本后进行Hydration——注入交互事件、动画、异步请求等高级功能。
  • 客户端 Hydration:在初次渲染后的静态 DOM 上“激活”或“绑定” JavaScript 事件,使页面具备与纯 CSR 相同的交互体验。
  • 应用示例:对于需要兼顾 SEO 与高交互的页面,可先在服务端输出初始 HTML,客户端再 Hydration,实现性能和交互的双赢。

6. 实用优化策略与最佳实践

6.1 性能优化

  1. 服务端缓存
    • 利用 Varnish、Redis、Nginx 缓存热点页面或数据接口,减少重复渲染负担。
    • 配合CDN 分发静态资源(HTML、CSS、JS、图片等)以提高全球加载速度。
  2. Lazy Loading 与代码拆分
    • 前端可按需加载 JS 组件,或拆分成多个包,只有在用户需要时才加载对应功能,提高首屏渲染速度。
  3. 减少数据传输
    • 通过压缩(Gzip、Brotli)、精简数据返回、启用 HTTP/2 或 HTTP/3 等方式优化网络传输。
  4. SSR + 客户端缓存
    • 即使 SSR,也可在客户端添加 Service Worker 或利用 IndexedDB,实现离线缓存或部分资源本地化。

6.2 SEO 优化

  1. SSR 或预渲染
    • 对于注重 SEO 的页面,最简单的方式是确保爬虫可以获取到纯 HTML 内容。
    • 也可使用Prerender.io 等第三方服务进行预渲染。
  2. 正确的 Meta 标签与路由结构
    • 动态生成页面时,确保 </code>、<code><meta name="description"></code> 等合理设置。</li> <li>对路由进行扁平化或语义化设计,利于搜索引擎抓取。</li> </ul></li> <li><strong>网站地图与 Robots</strong> <ul> <li>提供 <code>sitemap.xml</code> 并在 Robots.txt 中正确配置爬取规则,引导搜索引擎索引重要页面。</li> </ul></li> </ol> <h4>6.3 开发与部署流程</h4> <ol> <li><strong>本地开发与调试</strong> <ul> <li>SSR 场景下,需要有一套本地模拟服务端渲染的环境,或依赖框架自带的开发服务器(如 <code>npm run dev</code> in Next.js)。</li> <li>CSR 场景下,本地只需配置好前端打包工具和 mock API 即可。</li> </ul></li> <li><strong>持续集成(CI)与持续部署(CD)</strong> <ul> <li>利用 Jenkins、GitLab CI、GitHub Actions 等工具自动化构建与测试。</li> <li>SSR 方案通常需要构建 + 启动服务器,CSR 则只需静态文件构建 + 部署到 CDN 或静态服务器。</li> </ul></li> <li><strong>灰度发布与回滚</strong> <ul> <li>通过 Nginx 或容器编排(如 Kubernetes)进行灰度发布,在流量较低的时段测试新版本,若出现问题可及时回滚。</li> </ul></li> </ol> <hr> <h3>7. 未来趋势与展望</h3> <ul> <li><strong>React Server Components</strong>:React 官方提出的一种新概念,部分组件在服务端渲染,部分组件在客户端渲染,实现更灵活的同构架构。</li> <li><strong>Edge Side Rendering(边缘渲染)</strong>:利用边缘计算节点来减轻主服务器负载,提高全球用户访问的速度和可用性。</li> <li><strong>渐进式框架</strong>:例如 Astro、Qwik 等新一代框架主打“零 JS 负载”或延迟 Hydration 的概念,进一步优化首屏渲染。</li> </ul> <p>这些新趋势的核心目标在于:<strong>在追求高交互性的同时,让用户尽快看到内容</strong>,并兼顾 SEO、性能与可维护性。</p> <hr> <h3>8. 总结</h3> <ul> <li><strong>SSR(服务端渲染)</strong>:在服务器生成完整 HTML,首屏快、SEO 友好,但服务器压力与开发成本较高。</li> <li><strong>CSR(客户端渲染)</strong>:在浏览器端生成页面,前后端分离度高、交互性强,但首屏慢、SEO 较弱。</li> <li><strong>混合渲染方案</strong>(SSG、同构渲染、渐进增强)逐渐成为主流选择,既能兼顾性能与 SEO,也能保留灵活的前端交互。</li> </ul> <p>在实际项目中,你需要根据<strong>业务逻辑、性能要求、SEO 需求、团队能力与成本</strong>多维度综合评估,选取最合适的渲染模式或混合方案。随着网络基础设施的进步与前端技术的迭代,SSR 和 CSR 的界限在不断模糊,未来将出现更多创新模式帮助开发者打造更快、更优质的 Web 体验。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1881743482888974336"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(前端)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1939954267695673344.htm" title="从零构建现代JavaScript技术栈:Node.js与Yarn基础配置指南" target="_blank">从零构建现代JavaScript技术栈:Node.js与Yarn基础配置指南</a> <span class="text-muted">施想钧</span> <div>从零构建现代JavaScript技术栈:Node.js与Yarn基础配置指南js-stack-from-scratchverekia/js-stack-from-scratch:是一个从零开始构建现代JavaScript开发栈的教程,包括工具、技术和实践。适合JavaScript开发人员、前端开发人员和初学者,以及对构建现代Web应用程序感兴趣的人员。项目地址:https://gitcode.co</div> </li> <li><a href="/article/1939942674270318592.htm" title="视频断点续播全栈实现:基于HTML5前端与Spring Boot后端" target="_blank">视频断点续播全栈实现:基于HTML5前端与Spring Boot后端</a> <span class="text-muted">独立开发者阿乐</span> <a class="tag" taget="_blank" href="/search/%E5%8E%9F%E5%88%9B/1.htm">原创</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/API/1.htm">API</a><a class="tag" taget="_blank" href="/search/API/1.htm">API</a><a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/Boot/1.htm">Boot</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/video%E5%85%83%E7%B4%A0/1.htm">video元素</a> <div>文章目录视频断点续播功能实现方案核心思路前端实现HTML结构JavaScript实现SpringBoot后端实现1.依赖配置(pom.xml)2.实体类3.存储库接口4.服务层5.控制器实现要点视频断点续播功能构思图流程说明用户交互:前端核心功能:后端处理:数据存储:我的个人网站:乐乐主题创作室视频断点续播功能实现方案核心思路实现视频断点续播需要前后端配合,主要包括:前端记录播放进度后端存储进度信</div> </li> <li><a href="/article/1939896791747063808.htm" title="【代码审计】安全审核常见漏洞修复策略" target="_blank">【代码审计】安全审核常见漏洞修复策略</a> <span class="text-muted">秋说</span> <a class="tag" taget="_blank" href="/search/Java%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/1.htm">Java代码审计</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/1.htm">代码审计</a> <div>文章目录1.异常信息泄露修复建议不推荐用法推荐用法2.文件上传漏洞错误示例(缺乏校验)安全示例(含格式/扩展名校验)3.SQL注入漏洞(MyBatis${})示例修复建议4.生成组件间接依赖生成依赖树建议5.间接依赖组件的漏洞什么是间接依赖后端修复1后端修复2前端修复1前端修复26.XSS(跨站脚本攻击)错误示例(存在风险)安全示例(自动转义)修复建议7.接口未鉴权修复建议8.路径遍历漏洞错误示例</div> </li> <li><a href="/article/1939894269816926208.htm" title="Flask + GPT 实践" target="_blank">Flask + GPT 实践</a> <span class="text-muted">红鼻子时代</span> <a class="tag" taget="_blank" href="/search/flask%E9%A1%B9%E7%9B%AE/1.htm">flask项目</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>一、前言本篇文章会介绍从零开始构建一个基于Flask+GPT的小项目的过程。总共有四个版本的迭代,包括:1、调用GPT接口并渲染到前端页面;2、使用Flask提供的session来实现登录和登出功能;3、用SQLAlchemy管理数据库,实现用户注册和登录;4、记录和分页查看用户与GPT的对话历史。二、项目环境与依赖Python版本:建议3.7+Flask:最常用的PythonWeb框架之一ope</div> </li> <li><a href="/article/1939893261384609792.htm" title="uni-app subPackages 分包加载:优化应用性能的利器" target="_blank">uni-app subPackages 分包加载:优化应用性能的利器</a> <span class="text-muted">阿珊和她的猫</span> <a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>前端开发工程师、技术日更博主、已过CET6阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1牛客高级专题作者、打造专栏《前端面试必备》、《2024面试高频手撕题》、《前端求职突破计划》蓝桥云课签约作者、上架课程《Vue.js和Egg.js开发企业级健康管理项目》、《带你从入门到实战全面掌握uni-app》文章目录subPackages配置注意事项优点使用场景在uni-app中,sub</div> </li> <li><a href="/article/1939892127068647424.htm" title="【C#】两个list根据某个元素比较差集" target="_blank">【C#】两个list根据某个元素比较差集</a> <span class="text-muted">weixin_30594001</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>1.今天突然跟前端有一点小小的分歧,传输数据和数据库里的数据做比对,该前端做处理还是后端,(并不是都不愿意做,相反,都愿意在自己那端处理==)2.最后终于归结我这了,好久之前做过list比对,记得刚写代码的时候,两个list比对?那就无限foreach呗,当然实现是能实现,这就很影响比对效果和代码的整洁度了。3.接下来,我回忆起来了我之前写过的一个比较方法,拿出来记录一下//重写比较方法publi</div> </li> <li><a href="/article/1939891748394299392.htm" title="java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)" target="_blank">java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)</a> <span class="text-muted"></span> <div>源代码+数据库+LW文档(1万字以上)+开题报告+答辩稿ppt+部署教程+代码讲解+代码时间修改工具技术实现开发语言:后端:Java前端:vue框架:springboot数据库:mysql开发工具JDK版本:JDK1.8数据库:mysql数据库工具:Navicat开发软件:idea主要角色及功能介绍本次系统的用例图做出了十分明确的功能划分,在设计时可以有很好的设计思路进行设计和延展。(1)管理员用</div> </li> <li><a href="/article/1939886127213244416.htm" title="前端base64遇到的坑:window.btoa中文报错的修复方案" target="_blank">前端base64遇到的坑:window.btoa中文报错的修复方案</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>问题是这样的:同事在使用的过程中发现一个问题:点击确定按钮后,有个报错提示。如下截图所示:报错文本是:invalidcharactererrorfailedtoexecutebtoaonwindowthestringtobeencodedcontainscharactersoutsideofthelatin1range详情:前端base64遇到的坑:window.btoa中文报错的修复方案</div> </li> <li><a href="/article/1939884308172959744.htm" title="Spring Security 鉴权与授权详解(前后端分离项目)" target="_blank">Spring Security 鉴权与授权详解(前后端分离项目)</a> <span class="text-muted"></span> <div>前言在现代Web开发中,前后端分离架构已经成为主流。后端专注于提供RESTfulAPI,而前端通过AJAX请求与后端交互。在这种架构下,如何对用户进行认证(Authentication)和授权(Authorization)成为了系统设计中的核心问题。SpringSecurity是Spring框架中用于构建安全系统的模块,它不仅提供了强大的安全机制,还支持灵活的自定义配置。本文将围绕鉴权失败和成功时</div> </li> <li><a href="/article/1939864782756704256.htm" title="前端Vue面试八股常考题(二)" target="_blank">前端Vue面试八股常考题(二)</a> <span class="text-muted">LuxTorch</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">前端面试题</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>文章目录1、VueRouter如何配置404页面?1.基础配置步骤2.高级用法2、Vue中的过滤器有哪些应用场景?Vue3如何替代?1.过滤器的核心功能2.典型应用场景3.Vue3中的替代方案3、Vue中computed和methods的区别是什么?示例对比4、什么是Vue的前端路由?如何实现?1.核心实现方式:VueRouter2.VueRouter配置步骤3.VueRouter核心功能特性5、</div> </li> <li><a href="/article/1939842101881663488.htm" title="手把手教你入门vue+springboot开发(十三)--无感token前端实现" target="_blank">手把手教你入门vue+springboot开发(十三)--无感token前端实现</a> <span class="text-muted">段鸿潭</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a> <div>文章目录前言一、前端代码实现1.登录处理2.刷新token请求增加3.请求拦截器修改4.响应拦截器修改5.测试结果二、代码逻辑优化前言上一篇我们研究了无感token刷新的实现方案以及后端代码实现,本篇我们将详细研究一下前端代码实现,前端代码实现过程中也有很多细节的地方需要注意,重点要关注前端代码编码过程中的业务逻辑处理。一、前端代码实现1.登录处理Login.vue文件中://调用接口,完成登录l</div> </li> <li><a href="/article/1939822946658873344.htm" title="为什么要学习 next.js 框架 + Vercel 部署平台,因为我想把自己的 app 分享给别人。" target="_blank">为什么要学习 next.js 框架 + Vercel 部署平台,因为我想把自己的 app 分享给别人。</a> <span class="text-muted">waterHBO</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前端开发太卷?不如给你的React换个“豪华座驾”和“F1赛道”**如果你像我一样,从create-react-app的时代一路走来,你一定经历过那种“甜蜜的烦恼”:React给了你一个超强的V8引擎,但造车剩下的所有事——从方向盘(路由)、底盘(项目结构)到导航系统(数据管理)——都得你自己撸。结果就是,每个项目开始前,你都在重复发明轮子,在Webpack的配置地狱里苦苦挣扎。好消息是,时代变了</div> </li> <li><a href="/article/1939801504806400000.htm" title="jQuery-Json-AJAX-跨域" target="_blank">jQuery-Json-AJAX-跨域</a> <span class="text-muted">了解化</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a> <div>一、jQuery1.简介用于简化JavaScript代码开发主要作用:对于前端来说,写更少代码、做更多事情2、JQuery入门2.1操作选择器$("p")选取元素。$("p.intro")选取所有class="intro"的元素。$("p#demo")选取所有id="demo"的元素。事件及其事件绑定JavaScript的事件与jQuery事件区别:jQuery事件就是将JavaScript事件名</div> </li> <li><a href="/article/1939799864963559424.htm" title="ECharts后台读取数据动态生成折线图:实时数据可视化解决方案" target="_blank">ECharts后台读取数据动态生成折线图:实时数据可视化解决方案</a> <span class="text-muted">窦菲芊Harriet</span> <div>ECharts后台读取数据动态生成折线图:实时数据可视化解决方案【下载地址】ECharts后台读取数据动态生成折线图该项目提供了一种高效的方法,利用PHP从数据库中读取数据,并通过JSON格式传输到前端,结合ECharts库动态生成折线图。通过AJAX技术,数据能够实时刷新,确保折线图始终反映最新数据变化。项目集成了ECharts和jQuery,简化了开发流程,适合需要实时数据可视化的场景。只需将</div> </li> <li><a href="/article/1939799234706468864.htm" title="二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5" target="_blank">二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5</a> <span class="text-muted">csdndddsd</span> <a class="tag" taget="_blank" href="/search/uniapp%E5%80%9F%E8%B4%B7%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">uniapp借贷系统开发</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E9%A2%9D%E8%B4%B7%E7%B3%BB%E7%BB%9Fapp/1.htm">小额贷系统app</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E8%96%AA%E8%B4%B7%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E6%90%AD%E5%BB%BA/1.htm">工薪贷系统安装搭建</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E7%94%A8%E8%B4%B7%E8%AE%A4%E8%AF%81%E7%B3%BB%E7%BB%9F/1.htm">信用贷认证系统</a><a class="tag" taget="_blank" href="/search/h5%E8%B5%84%E9%87%91%E8%B4%B7%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/1.htm">h5资金贷系统安装搭建教程</a><a class="tag" taget="_blank" href="/search/%E5%80%9F%E8%B4%B7%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E6%90%AD%E5%BB%BA/1.htm">借贷系统安装搭建</a><a class="tag" taget="_blank" href="/search/%E5%80%9F%E8%B4%B7%E7%B3%BB%E7%BB%9F%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/1.htm">借贷系统二次开发</a> <div>前端:UNIAPP后端:ThinkPHP数据库:Mysql前端使用的uniapp可以打包APPH5小程序系统提供了完善的网络借贷体系,为金融中介平台提供从获客到贷后管理全流程服务,解决了借贷手续繁琐、流程缓慢等问题此源码为运营中版本,具有极高稳定性,防注入,防攻击,修复全部已知后门漏洞仅供学习演示、二次开发专用,禁止一切违法行为的利用!可提现金额(元)¥{{qbMoney}}充值提现余额明细余额变</div> </li> <li><a href="/article/1939781970565328896.htm" title="一种文档与代码双轨处理的RAG架构方案" target="_blank">一种文档与代码双轨处理的RAG架构方案</a> <span class="text-muted">木鱼时刻</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a> <div>1.目标如何构建一个能同时高效处理文档和代码的RAG系统?本文提出的融合架构,旨在解决这一核心挑战。2.整体架构概览该系统的顶层设计思想是专业分工,统一调度。它将复杂的知识处理流程拆解为清晰的模块,各模块各司其职,最终由一个核心服务进行统一编排。+-------------------+|前端||(DifyWeb界面)|+-------------------+|+----------------</div> </li> <li><a href="/article/1939752348960223232.htm" title="ECMAScript 2019(ES2019):数组与对象操作的精细化升级" target="_blank">ECMAScript 2019(ES2019):数组与对象操作的精细化升级</a> <span class="text-muted">DT——</span> <a class="tag" taget="_blank" href="/search/ECMAScript/1.htm">ECMAScript</a><a class="tag" taget="_blank" href="/search/%E5%8E%86%E5%8F%B2%E8%BF%9B%E7%A8%8B/1.htm">历史进程</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1.版本背景与发布发布时间:2019年6月,由ECMAInternational正式发布,标准编号为ECMA-26210thEdition。历史意义:作为ES6之后的第四次年度更新,ES2019聚焦于数组、对象和字符串操作的精细化改进,提升开发效率和代码可读性。时代背景:随着前端框架的成熟和Node.js的普及,开发者对数组扁平化、对象转换等高频操作的需求激增,ES2019的发布回应了这些痛点。2</div> </li> <li><a href="/article/1939750837395976192.htm" title="大话前端:Vue和React的生命周期" target="_blank">大话前端:Vue和React的生命周期</a> <span class="text-muted"></span> <div>Vue和React的生命周期可以比作一棵树的生命周期,从种子到成熟树木的整个过程。种子阶段(初始化):Vue:这是创建Vue实例的过程,类似于树木的种子埋入土壤,开始萌芽。在这个阶段,Vue会初始化事件和生命周期,然后进入模板编译阶段。React:类似地,React组件的初始化阶段就像是种子的萌芽。这里涉及到组件的构造函数、getDefaultProps和getInitialState方法,它们为</div> </li> <li><a href="/article/1939727265927589888.htm" title="一款wordperss AI免费插件自动内容生成+前端AI交互+文章批量采集" target="_blank">一款wordperss AI免费插件自动内容生成+前端AI交互+文章批量采集</a> <span class="text-muted">Linkreate</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/wordpress/1.htm">wordpress</a><a class="tag" taget="_blank" href="/search/wordpressAI%E6%8F%92%E4%BB%B6/1.htm">wordpressAI插件</a><a class="tag" taget="_blank" href="/search/wordpress%E5%85%8D%E8%B4%B9%E6%8F%92%E4%BB%B6/1.htm">wordpress免费插件</a><a class="tag" taget="_blank" href="/search/wordpress%E8%87%AA%E5%8A%A8%E5%8F%91%E6%96%87/1.htm">wordpress自动发文</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8F%91%E6%96%87%E6%BA%90%E7%A0%81/1.htm">自动发文源码</a> <div>一款LinkreatewordperssAI自动内容生成+前端AI会话窗口交互+文章批量采集免费插件1.SEO优化文章生成关键词驱动的内容生成:用户可以输入关键词或长尾关键词,插件会根据这些关键词生成高质量的SEO优化文章。文章结构清晰,语言自然流畅,符合SEO标准,能够有效提升网站内容的搜索引擎排名。自定义文章长度和要求:用户可以根据需要指定文章的长度(字数)以及对文章的额外要求,例如内容风格、</div> </li> <li><a href="/article/1939715335536046080.htm" title="中小团队零成本搭建PHP任务管理系统:4大核心工具实测推荐" target="_blank">中小团队零成本搭建PHP任务管理系统:4大核心工具实测推荐</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>引言在现代软件开发和团队协作中,高效的任务管理系统是提升生产力的核心要素。PHP作为全球最受欢迎的服务器端编程语言之一,凭借其成熟的生态系统、丰富的框架选择和强大的社区支持,成为构建任务管理系统的理想选择。一个优秀的PHP任务管理系统不仅能够实现任务的全生命周期管理,还能通过智能化的功能提升团队协作效率,降低项目管理成本。构建这样一个系统需要考虑多个层面:从底层的数据库设计到前端的用户体验,从安全</div> </li> <li><a href="/article/1939697253291716608.htm" title="Android Gantt View 安卓实现项目甘特图" target="_blank">Android Gantt View 安卓实现项目甘特图</a> <span class="text-muted">netkiller-BG7NYT</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E6%89%8B%E6%9C%AD/1.htm">手札</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E7%94%98%E7%89%B9%E5%9B%BE/1.htm">甘特图</a> <div>需要做一个项目管理工具,其中使用到了甘特图。发现全网甘特图解决方案比较少,于是自动动手丰衣足食。前面我用Python和Node.js前端都做过,这次仅仅是移植到Android上面。其实甘特图非常简单,开发也不难,如果我专职去做,能做出一个非常棒产品。我写这个只是消遣,玩玩,闲的蛋痛,所以不怎么上心,就搞成下面这德行吧。仅仅供大家学习,参考。那天心情好了,完善一下。屏幕布局文件<androidx.c</div> </li> <li><a href="/article/1939682372236668928.htm" title="每天一个前端小知识 Day 16 - 前端性能优化全流程指南" target="_blank">每天一个前端小知识 Day 16 - 前端性能优化全流程指南</a> <span class="text-muted">蓝婷儿</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/1.htm">前端面试</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>前端性能优化全流程指南(从加载到交互)目标概览:前端性能优化四大核心维度阶段优化目标加载阶段首屏速度、资源压缩、请求优化渲染阶段减少回流重绘、避免布局抖动交互阶段保持高帧率、避免卡顿持久运行阶段内存泄露处理、缓存命中策略一、加载性能优化(首屏速度为王)✅核心策略:资源体积优化JS/CSS/图片压缩(如gzip,brotli)Tree-shaking(去除无用代码)图片压缩(webp优先)合理拆包(</div> </li> <li><a href="/article/1939641532214734848.htm" title="JS 与 CSS 的交互式开发:打造灵动的网页体验" target="_blank">JS 与 CSS 的交互式开发:打造灵动的网页体验</a> <span class="text-muted">维他奶糖61</span> <a class="tag" taget="_blank" href="/search/pandas/1.htm">pandas</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>在当今的网页开发领域,静态的网页早已无法满足用户日益增长的交互需求。JavaScript(JS)和层叠样式表(CSS)作为前端开发的两大支柱,它们的强强联合能够创造出令人惊叹的交互式网页效果。从简单的按钮点击变色,到复杂的动画过渡和动态页面布局变换,JS与CSS的交互式开发赋予了网页生命与活力。接下来,就让我们深入探索这一奇妙的领域。理解JS与CSS的分工与协作在开始交互式开发之前,我们需要明确J</div> </li> <li><a href="/article/1939627404326662144.htm" title="HTML前端的自动化构建工具使用" target="_blank">HTML前端的自动化构建工具使用</a> <span class="text-muted">前端视界</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E8%89%BA%E5%8C%A0%E9%A6%86/1.htm">前端艺匠馆</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>HTML前端的自动化构建工具使用:从手工作坊到智能工厂的蜕变关键词:前端构建工具、自动化流程、Gulp、Webpack、前端工程化摘要:本文将带你从前端开发的“手工作坊时代”出发,一步步理解为什么需要自动化构建工具,揭秘核心概念和工作原理,并通过实战案例教你用Gulp和Webpack搭建高效的前端工作流。无论你是刚入门的前端新手,还是想优化现有项目的开发者,都能在这里找到从“手动劳动”到“智能生产</div> </li> <li><a href="/article/1939623752572661760.htm" title="用Pytorch训练手写签名模型并进行签名识别" target="_blank">用Pytorch训练手写签名模型并进行签名识别</a> <span class="text-muted">TBM矩阵</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/AI%E4%BD%93%E7%B3%BB%E5%AD%A6%E4%B9%A0/1.htm">AI体系学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>整体思路收集至少两个人的手写签名图片,每个人至少20张使用Pytorch进行模型训练使用Flask搭建Web服务使用Html/JavaScript实现前端调用进行签名识别项目结构signature-systemdatatrainuser001001.png...user002001.png...templatesindex.htmlapp.pymodel.pytrain.py建模:model.py</div> </li> <li><a href="/article/1939620346080587776.htm" title="FlatBuffers(概念、原理及优势、在TS中的使用)" target="_blank">FlatBuffers(概念、原理及优势、在TS中的使用)</a> <span class="text-muted">前端杂货铺</span> <a class="tag" taget="_blank" href="/search/TodoList/1.htm">TodoList</a><a class="tag" taget="_blank" href="/search/100%E4%B8%AA%E5%B0%8F%E7%9F%A5%E8%AF%86/1.htm">100个小知识</a><a class="tag" taget="_blank" href="/search/FlatBuffers/1.htm">FlatBuffers</a><a class="tag" taget="_blank" href="/search/JSON/1.htm">JSON</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">序列化</a><a class="tag" taget="_blank" href="/search/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">反序列化</a> <div>个人简介个人主页:前端杂货铺‍♂️学习方向:主攻前端方向,正逐渐往全干发展个人状态:研发工程师,现效力于中国工业软件事业人生格言:积跬步至千里,积小流成江海推荐学习:前端面试宝典100个小功能Vue2Vue3Vue2/3项目实战Node.js实战Three.js个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧文章目录介绍在Vue中使用FlatBuffersFlatBuff</div> </li> <li><a href="/article/1939613789125144576.htm" title="Node.js 后端开发:与前端的完美结合" target="_blank">Node.js 后端开发:与前端的完美结合</a> <span class="text-muted"></span> <div>Node.js后端开发:与前端的完美结合关键词:Node.js、后端开发、前后端分离、RESTfulAPI、Express、性能优化、全栈开发摘要:本文深入探讨Node.js在后端开发中的优势及其与前端的完美结合方式。我们将从Node.js的核心特性出发,分析其适合后端开发的原因,详细介绍如何构建高性能的RESTfulAPI服务,探讨前后端分离架构的最佳实践,并通过实际项目案例展示Node.js如</div> </li> <li><a href="/article/1939600179430748160.htm" title="前端React和Vue框架的区别" target="_blank">前端React和Vue框架的区别</a> <span class="text-muted"></span> <div>React和Vue作为前端Web开发的两大主流框架,虽然都用于构建用户界面,但在设计理念、语法风格、生态系统等方面存在显著差异。以下从多个维度对比两者的核心区别,帮助你在技术选型时做出更合适的决策。一、设计理念与架构1.数据流控制React:强制单向数据流(One-WayDataFlow),状态变化只能通过父组件→子组件传递,如需反向通信(如子组件修改父组件状态),需通过回调函数实现。复杂应用中需</div> </li> <li><a href="/article/1939593626833186816.htm" title="前端基础知识JavaScript系列 - 25(Javascript本地存储)" target="_blank">前端基础知识JavaScript系列 - 25(Javascript本地存储)</a> <span class="text-muted">前端小白从0开始</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、方式javaScript本地缓存的方法我们主要讲述以下四种:cookiesessionStoragelocalStorageindexedDBcookieCookie,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据。是为了解决HTTP无状态导致的问题作为一段一般不超过4KB的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制cooki</div> </li> <li><a href="/article/1939579119985553408.htm" title="前端vue2 报错不是一个函数 怎么解决?" target="_blank">前端vue2 报错不是一个函数 怎么解决?</a> <span class="text-muted">突然暴富的我 || 比较富的我</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>检查函数定义确保报错的函数确实在对应的组件或模块中正确定义。函数需要在methods对象中声明,或在混合(mixins)、插件中正确引入。例如:methods:{myFunction(){//函数逻辑}}检查函数调用方式确认函数调用时没有拼写错误,且调用方式正确。在模板中调用需使用@click="myFunction",在脚本中调用需使用this.myFunction()。注意避免直接调用未绑定的</div> </li> <li><a href="/article/123.htm" title="js动画html标签(持续更新中)" target="_blank">js动画html标签(持续更新中)</a> <span class="text-muted">843977358</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a><a class="tag" taget="_blank" href="/search/media/1.htm">media</a><a class="tag" taget="_blank" href="/search/opacity/1.htm">opacity</a> <div>1.jQuery 效果 - animate() 方法    改变 "div" 元素的高度:    $(".btn1").click(function(){      $("#box").animate({height:"300px</div> </li> <li><a href="/article/250.htm" title="springMVC学习笔记" target="_blank">springMVC学习笔记</a> <span class="text-muted">caoyong</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>1、搭建开发环境    a>、添加jar文件,在ioc所需jar包的基础上添加spring-web.jar,spring-webmvc.jar    b>、在web.xml中配置前端控制器       <servlet>     &nbs</div> </li> <li><a href="/article/377.htm" title="POI中设置Excel单元格格式" target="_blank">POI中设置Excel单元格格式</a> <span class="text-muted">107x</span> <a class="tag" taget="_blank" href="/search/poi/1.htm">poi</a><a class="tag" taget="_blank" href="/search/style/1.htm">style</a><a class="tag" taget="_blank" href="/search/%E5%88%97%E5%AE%BD/1.htm">列宽</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%B9%B6%E5%8D%95%E5%85%83%E6%A0%BC/1.htm">合并单元格</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C/1.htm">自动换行</a> <div>引用:http://apps.hi.baidu.com/share/detail/17249059 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); HSSFCellStyle setBorder = wb.</div> </li> <li><a href="/article/504.htm" title="jquery 获取A href 触发js方法的this参数 无效的情况" target="_blank">jquery 获取A href 触发js方法的this参数 无效的情况</a> <span class="text-muted">一炮送你回车库</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>html如下:  <td class=\"bord-r-n bord-l-n c-333\"> <a class=\"table-icon edit\" onclick=\"editTrValues(this);\">修改</a> </td>"   j</div> </li> <li><a href="/article/631.htm" title="md5" target="_blank">md5</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a> <div> import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MDFive { public static void main(String[] args) { String md5Str = "cq</div> </li> <li><a href="/article/758.htm" title="完全卸载干净Oracle11g" target="_blank">完全卸载干净Oracle11g</a> <span class="text-muted">sophia天雪</span> <a class="tag" taget="_blank" href="/search/orale%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">orale数据库</a><a class="tag" taget="_blank" href="/search/%E5%8D%B8%E8%BD%BD%E5%B9%B2%E5%87%80/1.htm">卸载干净</a><a class="tag" taget="_blank" href="/search/%E6%B8%85%E7%90%86%E6%B3%A8%E5%86%8C%E8%A1%A8/1.htm">清理注册表</a> <div>完全卸载干净Oracle11g A、存在OUI卸载工具的情况下:     第一步:停用所有Oracle相关的已启动的服务;     第二步:找到OUI卸载工具:在“开始”菜单中找到“oracle_OraDb11g_home”文件夹中         &</div> </li> <li><a href="/article/885.htm" title="apache 的access.log 日志文件太大如何解决" target="_blank">apache 的access.log 日志文件太大如何解决</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>CustomLog logs/access.log common  此写法导致日志数据一致自增变大。 直接注释上面的语法 #CustomLog logs/access.log common 增加: CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-d.log </div> </li> <li><a href="/article/1012.htm" title="Hadoop单机模式环境搭建关键步骤" target="_blank">Hadoop单机模式环境搭建关键步骤</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>        Hadoop环境需要sshd服务一直开启,故,在服务器上需要按照ssh服务,以Ubuntu Linux为例,按照ssh服务如下: sudo apt-get install ssh sudo apt-get install rsync 编辑HADOOP_HOME/conf/hadoop-env.sh文件,将JAVA_HOME设置为Java</div> </li> <li><a href="/article/1139.htm" title="PL/SQL DEVELOPER 使用的一些技巧" target="_blank">PL/SQL DEVELOPER 使用的一些技巧</a> <span class="text-muted">atongyeye</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>1 记住密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题。 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Developer记住密码。 位置:Tools菜单--Preferences--Oracle--Logon HIstory--Store with password 2 特殊Copy 在SQL Window</div> </li> <li><a href="/article/1266.htm" title="PHP:在对象上动态添加一个新的方法" target="_blank">PHP:在对象上动态添加一个新的方法</a> <span class="text-muted">bardo</span> <a class="tag" taget="_blank" href="/search/%E6%96%B9%E6%B3%95/1.htm">方法</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0/1.htm">动态添加</a><a class="tag" taget="_blank" href="/search/%E9%97%AD%E5%8C%85/1.htm">闭包</a> <div>有关在一个对象上动态添加方法,如果你来自Ruby语言或您熟悉这门语言,你已经知道它是什么...... Ruby提供给你一种方式来获得一个instancied对象,并给这个对象添加一个额外的方法。   好!不说Ruby了,让我们来谈谈PHP   PHP未提供一个“标准的方式”做这样的事情,这也是没有核心的一部分...   但无论如何,它并没有说我们不能做这样</div> </li> <li><a href="/article/1393.htm" title="ThreadLocal与线程安全" target="_blank">ThreadLocal与线程安全</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/threadLocal/1.htm">threadLocal</a> <div>首先来看一下线程安全问题产生的两个前提条件:  1.数据共享,多个线程访问同样的数据。  2.共享数据是可变的,多个线程对访问的共享数据作出了修改。    实例:         定义一个共享数据: public static int a = 0;         </div> </li> <li><a href="/article/1520.htm" title="Tomcat 架包冲突解决" target="_blank">Tomcat 架包冲突解决</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>环境: Tomcat 7.0.6 win7 x64 错误表象:【我的冲突的架包是:catalina.jar 与 tomcat-catalina-7.0.61.jar 冲突,不知道其他架包冲突时是不是也报这个错误】 严重: End event threw exception java.lang.NoSuchMethodException: org.apache.catalina.dep</div> </li> <li><a href="/article/1647.htm" title="【Scala三】分析Spark源代码总结的Scala语法一" target="_blank">【Scala三】分析Spark源代码总结的Scala语法一</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>Scala语法 1. classOf运算符 Scala中的classOf[T]是一个class对象,等价于Java的T.class,比如classOf[TextInputFormat]等价于TextInputFormat.class    2. 方法默认值 defaultMinPartitions就是一个默认值,类似C++的方法默认值     </div> </li> <li><a href="/article/1774.htm" title="java 线程池管理机制" target="_blank">java 线程池管理机制</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/java%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">java线程池</a><a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/1.htm">管理机制</a> <div>编辑 Add Tools   jdk线程池   一、引言 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。   </div> </li> <li><a href="/article/1901.htm" title="关于hql中使用本地sql函数的问题(问-答)" target="_blank">关于hql中使用本地sql函数的问题(问-答)</a> <span class="text-muted">BreakingBad</span> <a class="tag" taget="_blank" href="/search/HQL/1.htm">HQL</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8%E5%87%BD%E6%95%B0/1.htm">存储函数</a> <div>转自于:http://www.iteye.com/problems/23775 问: 我在开发过程中,使用hql进行查询(mysql5)使用到了mysql自带的函数find_in_set()这个函数作为匹配字符串的来讲效率非常好,但是我直接把它写在hql语句里面(from ForumMemberInfo fm,ForumArea fa where find_in_set(fm.userId,f</div> </li> <li><a href="/article/2028.htm" title="读《研磨设计模式》-代码笔记-迭代器模式-Iterator" target="_blank">读《研磨设计模式》-代码笔记-迭代器模式-Iterator</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.Arrays; import java.util.List; /** * Iterator模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象内部表示 * * 个人觉得,为了不暴露该</div> </li> <li><a href="/article/2155.htm" title="常用SQL" target="_blank">常用SQL</a> <span class="text-muted">chenjunt3</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a> <div> --NC建库 CREATE TABLESPACE NNC_DATA01 DATAFILE 'E:\oracle\product\10.2.0\oradata\orcl\nnc_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K ; CREATE TABLESPA</div> </li> <li><a href="/article/2282.htm" title="数学是科学技术的语言" target="_blank">数学是科学技术的语言</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a><a class="tag" taget="_blank" href="/search/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B/1.htm">领域模型</a> <div>  从小学到大学都在学习数学,从小学开始了解数字的概念和背诵九九表到大学学习复变函数和离散数学,看起来好像掌握了这些数学知识,但是在工作中却很少真正用到这些知识,为什么?    最近在研究一种开源软件-CARROT2的源代码的时候,又一次感觉到数学在计算机技术中的不可动摇的基础作用,CARROT2是一种用于自动语言分类(聚类)的工具性软件,用JAVA语言编写,它</div> </li> <li><a href="/article/2409.htm" title="Linux系统手动安装rzsz 软件包" target="_blank">Linux系统手动安装rzsz 软件包</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sz/1.htm">sz</a><a class="tag" taget="_blank" href="/search/rz/1.htm">rz</a> <div>1、下载软件 rzsz-3.34.tar.gz。登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。 2、解压 tar zxvf  rzsz-3.34.tar.gz 3、安装  cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不</div> </li> <li><a href="/article/2536.htm" title="读源码之:ArrayBlockingQueue" target="_blank">读源码之:ArrayBlockingQueue</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>    ArrayBlockingQueue是concurrent包提供的一个线程安全的队列,由一个数组来保存队列元素.通过 takeIndex和 putIndex来分别记录出队列和入队列的下标,以保证在出队列时 不进行元素移动. //在出队列或者入队列的时候对takeIndex或者putIndex进行累加,如果已经到了数组末尾就又从0开始,保证数</div> </li> <li><a href="/article/2663.htm" title="C语言学习九枚举的定义和应用" target="_blank">C语言学习九枚举的定义和应用</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>枚举的定义 # include <stdio.h> enum WeekDay { MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay }; int main(void) { //int day; //day定义成int类型不合适 enum WeekDay day = Wedne</div> </li> <li><a href="/article/2790.htm" title="Vagrant 三种网络配置详解" target="_blank">Vagrant 三种网络配置详解</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/vagrant/1.htm">vagrant</a> <div> Forwarded port Private network Public network Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点。 端口映射(Forwarded port),顾名思义是指把宿主计算机的端口映射到虚拟机的某一个端口上,访问宿主计算机端口时,请求实际是被转发到虚拟机上指定端口的。Vagrantfile中设定语法为: c</div> </li> <li><a href="/article/2917.htm" title="16.性能优化-完结" target="_blank">16.性能优化-完结</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>性能调优是一个宏大的工程,需要从宏观架构(比如拆分,冗余,读写分离,集群,缓存等), 软件设计(比如多线程并行化,选择合适的数据结构), 数据库设计层面(合理的表设计,汇总表,索引,分区,拆分,冗余等) 以及微观(软件的配置,SQL语句的编写,操作系统配置等)根据软件的应用场景做综合的考虑和权衡,并经验实际测试验证才能达到最优。 性能水很深, 笔者经验尚浅 ,赶脚也就了解了点皮毛而已,我觉得</div> </li> <li><a href="/article/3044.htm" title="Word Search" target="_blank">Word Search</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/search/1.htm">search</a> <div>Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or ve</div> </li> <li><a href="/article/3171.htm" title="Spring4新特性——Web开发的增强" target="_blank">Spring4新特性——Web开发的增强</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a><a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a> <div>Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC  Spring4新特性——Groovy Bean定义DSL Spring4新特性——更好的Java泛型操作API  Spring4新</div> </li> <li><a href="/article/3298.htm" title="CentOS安装配置tengine并设置开机启动" target="_blank">CentOS安装配置tengine并设置开机启动</a> <span class="text-muted">liuxingguome</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>yum install gcc-c++  yum install pcre pcre-devel  yum install zlib zlib-devel  yum install openssl openssl-devel Ubuntu上可以这样安装 sudo aptitude install libdmalloc-dev libcurl4-opens</div> </li> <li><a href="/article/3425.htm" title="第14章 工具函数(上)" target="_blank">第14章 工具函数(上)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3552.htm" title="Xelsius 2008 and SAP BW at a glance" target="_blank">Xelsius 2008 and SAP BW at a glance</a> <span class="text-muted">blueoxygen</span> <a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/Xelsius/1.htm">Xelsius</a> <div>Xelsius提供了丰富多样的数据连接方式,其中为SAP BW专属提供的是BICS。那么Xelsius的各种连接的优缺点比较以及Xelsius是如何直接连接到BEx Query的呢? 以下Wiki文章应该提供了全面的概览。   http://wiki.sdn.sap.com/wiki/display/BOBJ/Xcelsius+2008+and+SAP+NetWeaver+BW+Co</div> </li> <li><a href="/article/3679.htm" title="oracle表空间相关" target="_blank">oracle表空间相关</a> <span class="text-muted">tongsh6</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>在oracle数据库中,一个用户对应一个表空间,当表空间不足时,可以采用增加表空间的数据文件容量,也可以增加数据文件,方法有如下几种: 1.给表空间增加数据文件    ALTER TABLESPACE "表空间的名字" ADD DATAFILE    '表空间的数据文件路径' SIZE 50M;   &nb</div> </li> <li><a href="/article/3806.htm" title=".Net framework4.0安装失败" target="_blank">.Net framework4.0安装失败</a> <span class="text-muted">yangjuanjava</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>上午的.net framework 4.0,各种失败,查了好多答案,各种不靠谱,最后终于找到答案了 和Windows Update有关系,给目录名重命名一下再次安装,即安装成功了! 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=17113 方法: 1.运行cmd,输入net stop WuAuServ 2.点击开</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>