一. 导言导言 导言 导言 导言
甜甜圈洞缓存可能是一种有用的技术, 您可以在此隐藏页面中的某些元素, 但并非全部@ . @ 。 但是执行 . 可能是困难的 。 在此我将演示您如何使用 HTMX}. 来实施简单的甜甜饼洞抓取技巧 。 @ info
问题
我与这个网站有一个问题, 就是我想使用 Anti @-@forgery massigns 来防止 Cross-}Site Request Forgery {() 攻击然而,它曾经给页面的缓存造成问题 {. 这对每页的请求来说都是独一无二的 < ,} 所以如果您隐藏有我的表格的 page{,} 这个符号对于所有用户来说都是一样的>%.} 这将意味着如果一个用户提交表_,} 该标志将是无效的, 而提交的表格将无法满足 ASPMS14}NET核心 。
解决方案
一个常见的方法是“'nut hole' cacheching”,您隐藏了大部分的页面,但某些元素MS K2。在 ASP}[pos]'(Other_.NET Core)使用部分视图框架实现这一点有一系列方法,然而它很复杂,需要执行并且经常要求具体的软件包和 configig}.}我想要一个更简单的解决方案\□.}
因为我已经用得非常好了 HTMX 在此工程中, @ ' @ 是一个极简单的方法, 通过动态装入 HTMX@ MS K3 部分来获取动态的 & ' @ donut hole @ MPK2} 功能 。 我已经在博客上写了 使用带有 Javascript 的反伪造请求 Tokens 然而,问题又在于这是否有效地禁用了页面的缓存@. @
使用 HTMX 动态装入片段时, 我可以恢复此功能@ . @ *
<li class="group relative mb-1 hidden lg:block ml-2" id="typeaheadelement">
<div hx-trigger="load" hx-get="/typeahead" hx-target="#typeaheadelement" hx-swap="innerHTML"></div>
</li>
死简单的@ , @ right?} 所有这一切都被调用到控制器中返回部分视图的单行代码 .} 这意味着在服务器上生成了 Anti-forgery 符号, 而页面可以缓存为普通@ MPK4}( 此部分视图是动态装入的) 因此该代号对于每个请求来说仍然是独一无二的\ MS K5
注意: MSKO} 您如果使用像 HTMX 一样的“ MS K1” 方法, 您需要确保 load 事件='}在后面的按钮上再次开火 .}我设置了第一个加载时覆盖目标的字头来做到这一点@.}
这意味着它第一次运行时, 它会清除原 div 并用以下控制器返回的部分内容替换为新内容@ . @% 因为 Anto-}#forgery signal 是在服务器上生成的并且存储在会话曲奇中。 直到我重新配置了 Appç).}为止, 它仍然应该使用这个方法来工作
我们设置了 hx-target 以外元素为主, 以避免 JS 错误@;, 因为 HTMX 在完成请求时需要有效目标@ ._ 这样您就可以去掉触发HTMX 请求的元素@ MPK3}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
[HttpGet("typeahead")]
public IActionResult TypeAhead()
{
return PartialView("_TypeAhead");
}
在部分内,我们还有简单的形式 与Anti-forgerysign@.
<div x-data="window.mostlylucid.typeahead()" class="relative" id="searchelement" x-on:click.outside="results = []">
@Html.AntiForgeryToken()
<label class="input input-sm dark:bg-custom-dark-bg bg-white input-bordered flex items-center gap-2">
<input
type="text"
x-model="query"
x-on:input.debounce.300ms="search"
x-on:keydown.down.prevent="moveDown"
x-on:keydown.up.prevent="moveUp"
x-on:keydown.enter.prevent="selectHighlighted"
placeholder="Search..."
class="border-0 grow input-sm text-black dark:text-white bg-transparent w-full"/>
<i class="bx bx-search"></i>
</label>
<!-- Dropdown -->
<ul x-show="results.length > 0"
class="absolute z-10 my-2 w-full bg-white dark:bg-custom-dark-bg border border-1 text-black dark:text-white border-b-neutral-600 dark:border-gray-300 rounded-lg shadow-lg">
<template x-for="(result, index) in results" :key="result.slug">
<li
x-on:click="selectResult(result)"
:class="{
'dark:bg-blue-dark bg-blue-light': index === highlightedIndex,
'dark:hover:bg-blue-dark hover:bg-blue-light': true
}"
class="cursor-pointer text-sm p-2 m-2"
x-text="result.title"
></li>
</template>
</ul>
</div>
此选项封装了打印头搜索的所有代码, 当它“ '” 提交时, 它会拉动标记并将其添加到请求中 “ @ MS K1” 和“ MPK2” 之前一样
let token = document.querySelector('#searchelement input[name="__RequestVerificationToken"]').value;
console.log(token);
fetch(`/api/search/${encodeURIComponent(this.query)}`, { // Fixed the backtick and closing bracket
method: 'GET', // or 'POST' depending on your needs
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': token // Attach the AntiForgery token in the headers
}
})
在结论中的结论
这是获取“'donut hole”的超级简单方式 I' 与 HTMX. It@'这是在没有额外软件包的复杂性的情况下获得“catching”的好处的绝佳方法 希望您能发现这个有用\ . 请告诉我 在下面的评论中是否有问题