[spring6: Mvc-函數式編程]-源碼解析

接口

ServerRequest

public interface ServerRequest {HttpMethod method();URI uri();UriBuilder uriBuilder();default String path() {return requestPath().pathWithinApplication().value();}default RequestPath requestPath() {return ServletRequestPathUtils.getParsedRequestPath(servletRequest());}Headers headers();MultiValueMap<String, Cookie> cookies();Optional<InetSocketAddress> remoteAddress();List<HttpMessageConverter<?>> messageConverters();<T> T body(Class<T> bodyType) throws ServletException, IOException;<T> T body(ParameterizedTypeReference<T> bodyType) throws ServletException, IOException;default <T> T bind(Class<T> bindType) throws BindException {return bind(bindType, dataBinder -> {});}<T> T bind(Class<T> bindType, Consumer<WebDataBinder> dataBinderCustomizer) throws BindException;default Optional<Object> attribute(String name) {Map<String, Object> attributes = attributes();if (attributes.containsKey(name)) {return Optional.of(attributes.get(name));}else {return Optional.empty();}}Map<String, Object> attributes();default Optional<String> param(String name) {List<String> paramValues = params().get(name);if (CollectionUtils.isEmpty(paramValues)) {return Optional.empty();}else {String value = paramValues.get(0);if (value == null) {value = "";}return Optional.of(value);}}MultiValueMap<String, String> params();MultiValueMap<String, Part> multipartData() throws IOException, ServletException;default String pathVariable(String name) {Map<String, String> pathVariables = pathVariables();if (pathVariables.containsKey(name)) {return pathVariables.get(name);}else {throw new IllegalArgumentException("No path variable with name \"" + name + "\" available");}}Map<String, String> pathVariables();HttpSession session();Optional<Principal> principal();HttpServletRequest servletRequest();default Optional<ServerResponse> checkNotModified(Instant lastModified) {Assert.notNull(lastModified, "LastModified must not be null");return DefaultServerRequest.checkNotModified(servletRequest(), lastModified, null);}default Optional<ServerResponse> checkNotModified(String etag) {Assert.notNull(etag, "Etag must not be null");return DefaultServerRequest.checkNotModified(servletRequest(), null, etag);}default Optional<ServerResponse> checkNotModified(Instant lastModified, String etag) {Assert.notNull(lastModified, "LastModified must not be null");Assert.notNull(etag, "Etag must not be null");return DefaultServerRequest.checkNotModified(servletRequest(), lastModified, etag);}static ServerRequest create(HttpServletRequest servletRequest, List<HttpMessageConverter<?>> messageReaders) {return new DefaultServerRequest(servletRequest, messageReaders);}static Builder from(ServerRequest other) {return new DefaultServerRequestBuilder(other);}// ...
}

Headers

interface Headers {List<MediaType> accept();List<Charset> acceptCharset();List<Locale.LanguageRange> acceptLanguage();OptionalLong contentLength();Optional<MediaType> contentType();@NullableInetSocketAddress host();List<HttpRange> range();List<String> header(String headerName);@Nullabledefault String firstHeader(String headerName) {List<String> list = header(headerName);return list.isEmpty() ? null : list.get(0);}HttpHeaders asHttpHeaders();
}

Builder

interface Builder {Builder method(HttpMethod method);Builder uri(URI uri);Builder header(String headerName, String... headerValues);Builder headers(Consumer<HttpHeaders> headersConsumer);Builder cookie(String name, String... values);Builder cookies(Consumer<MultiValueMap<String, Cookie>> cookiesConsumer);Builder body(byte[] body);Builder body(String body);Builder attribute(String name, Object value);Builder attributes(Consumer<Map<String, Object>> attributesConsumer);Builder param(String name, String... values);Builder params(Consumer<MultiValueMap<String, String>> paramsConsumer);Builder remoteAddress(InetSocketAddress remoteAddress);ServerRequest build();}

RequestPredicate

// RequestPredicates 
@FunctionalInterface
public interface RequestPredicate {boolean test(ServerRequest request);default RequestPredicate and(RequestPredicate other) {return new RequestPredicates.AndRequestPredicate(this, other);}default RequestPredicate negate() {return new RequestPredicates.NegateRequestPredicate(this);}default RequestPredicate or(RequestPredicate other) {return new RequestPredicates.OrRequestPredicate(this, other);}default Optional<ServerRequest> nest(ServerRequest request) {return (test(request) ? Optional.of(request) : Optional.empty());}default void accept(RequestPredicates.Visitor visitor) {visitor.unknown(this);}
}

RouterFunction

// RouterFunctions
@FunctionalInterface
public interface RouterFunction<T extends ServerResponse> {Optional<HandlerFunction<T>> route(ServerRequest request);default RouterFunction<T> and(RouterFunction<T> other) {return new RouterFunctions.SameComposedRouterFunction<>(this, other);}default RouterFunction<?> andOther(RouterFunction<?> other) {return new RouterFunctions.DifferentComposedRouterFunction(this, other);}default RouterFunction<T> andRoute(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {return and(RouterFunctions.route(predicate, handlerFunction));}default RouterFunction<T> andNest(RequestPredicate predicate, RouterFunction<T> routerFunction) {return and(RouterFunctions.nest(predicate, routerFunction));}default <S extends ServerResponse> RouterFunction<S> filter(HandlerFilterFunction<T, S> filterFunction) {return new RouterFunctions.FilteredRouterFunction<>(this, filterFunction);}default void accept(RouterFunctions.Visitor visitor) {visitor.unknown(this);}default RouterFunction<T> withAttribute(String name, Object value) {Assert.hasLength(name, "Name must not be empty");Assert.notNull(value, "Value must not be null");Map<String, Object> attributes = new LinkedHashMap<>();attributes.put(name, value);return new RouterFunctions.AttributesRouterFunction<>(this, attributes);}default RouterFunction<T> withAttributes(Consumer<Map<String, Object>> attributesConsumer) {Assert.notNull(attributesConsumer, "AttributesConsumer must not be null");Map<String, Object> attributes = new LinkedHashMap<>();attributesConsumer.accept(attributes);return new RouterFunctions.AttributesRouterFunction<>(this, attributes);}}

HandlerFilterFunction

@FunctionalInterface
public interface HandlerFilterFunction<T extends ServerResponse, R extends ServerResponse> {R filter(ServerRequest request, HandlerFunction<T> next) throws Exception;default HandlerFilterFunction<T, R> andThen(HandlerFilterFunction<T, T> after) {Assert.notNull(after, "HandlerFilterFunction must not be null");return (request, next) -> {HandlerFunction<T> nextHandler = handlerRequest -> after.filter(handlerRequest, next);return filter(request, nextHandler);};}default HandlerFunction<R> apply(HandlerFunction<T> handler) {Assert.notNull(handler, "HandlerFunction must not be null");return request -> this.filter(request, handler);}static <T extends ServerResponse> HandlerFilterFunction<T, T>ofRequestProcessor(Function<ServerRequest, ServerRequest> requestProcessor) {Assert.notNull(requestProcessor, "Function must not be null");return (request, next) -> next.handle(requestProcessor.apply(request));}static <T extends ServerResponse, R extends ServerResponse> HandlerFilterFunction<T, R>ofResponseProcessor(BiFunction<ServerRequest, T, R> responseProcessor) {Assert.notNull(responseProcessor, "Function must not be null");return (request, next) -> responseProcessor.apply(request, next.handle(request));}static <T extends ServerResponse> HandlerFilterFunction<T, T>ofErrorHandler(Predicate<Throwable> predicate, BiFunction<Throwable, ServerRequest, T> errorHandler) {Assert.notNull(predicate, "Predicate must not be null");Assert.notNull(errorHandler, "ErrorHandler must not be null");return (request, next) -> {try {T t = next.handle(request);if (t instanceof ErrorHandlingServerResponse response) {response.addErrorHandler(predicate, errorHandler);}return t;}catch (Throwable throwable) {if (predicate.test(throwable)) {return errorHandler.apply(throwable, request);}else {throw throwable;}}};}}

HandlerFunction

@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {T handle(ServerRequest request) throws Exception;
}

ServerResponse

// AsyncServerResponse, EntityResponse<T>, RenderingResponse
public interface ServerResponse {HttpStatusCode statusCode();HttpHeaders headers();MultiValueMap<String, Cookie> cookies();@NullableModelAndView writeTo(HttpServletRequest request, HttpServletResponse response, Context context) throws ServletException, IOException;static BodyBuilder from(ServerResponse other) {return new DefaultServerResponseBuilder(other);}static ServerResponse from(ErrorResponse response) {return status(response.getStatusCode()).headers(headers -> headers.putAll(response.getHeaders())).body(response.getBody());}static BodyBuilder status(HttpStatusCode status) {return new DefaultServerResponseBuilder(status);}static BodyBuilder status(int status) {return new DefaultServerResponseBuilder(HttpStatusCode.valueOf(status));}static BodyBuilder ok() {return status(HttpStatus.OK);}static BodyBuilder created(URI location) {BodyBuilder builder = status(HttpStatus.CREATED);return builder.location(location);}static BodyBuilder accepted() {return status(HttpStatus.ACCEPTED);}static HeadersBuilder<?> noContent() {return status(HttpStatus.NO_CONTENT);}static BodyBuilder seeOther(URI location) {BodyBuilder builder = status(HttpStatus.SEE_OTHER);return builder.location(location);}static BodyBuilder temporaryRedirect(URI location) {BodyBuilder builder = status(HttpStatus.TEMPORARY_REDIRECT);return builder.location(location);}static BodyBuilder permanentRedirect(URI location) {BodyBuilder builder = status(HttpStatus.PERMANENT_REDIRECT);return builder.location(location);}static BodyBuilder badRequest() {return status(HttpStatus.BAD_REQUEST);}static HeadersBuilder<?> notFound() {return status(HttpStatus.NOT_FOUND);}static BodyBuilder unprocessableEntity() {return status(HttpStatus.UNPROCESSABLE_ENTITY);}static ServerResponse async(Object asyncResponse) {return AsyncServerResponse.create(asyncResponse);}static ServerResponse async(Object asyncResponse, Duration timeout) {return AsyncServerResponse.create(asyncResponse, timeout);}static ServerResponse sse(Consumer<SseBuilder> consumer) {return SseServerResponse.create(consumer, null);}static ServerResponse sse(Consumer<SseBuilder> consumer, Duration timeout) {return SseServerResponse.create(consumer, timeout);}// ...	
}

HeadersBuilder

HeadersBuilder 是一個用于構建 HTTP 響應頭的鏈式構建器接口,支持添加和修改響應頭、Cookie、緩存控制、允許的方法、ETag、資源位置等常用 HTTP 頭部信息,并最終生成響應對象。

interface HeadersBuilder<B extends HeadersBuilder<B>> {B header(String headerName, String... headerValues);B headers(Consumer<HttpHeaders> headersConsumer);B cookie(Cookie cookie);B cookies(Consumer<MultiValueMap<String, Cookie>> cookiesConsumer);B allow(HttpMethod... allowedMethods);B allow(Set<HttpMethod> allowedMethods);B eTag(String eTag);B lastModified(ZonedDateTime lastModified);B lastModified(Instant lastModified);B location(URI location);B cacheControl(CacheControl cacheControl);B varyBy(String... requestHeaders);ServerResponse build();ServerResponse build(WriteFunction writeFunction);@FunctionalInterfaceinterface WriteFunction {@NullableModelAndView write(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception;}}

BodyBuilder

BodyBuilder 是在 HeadersBuilder 基礎上擴展的接口,用于構建包含響應體(包括對象、模板渲染、流式數據等)的 HTTP 響應內容。

interface BodyBuilder extends HeadersBuilder<BodyBuilder> {BodyBuilder contentLength(long contentLength);BodyBuilder contentType(MediaType contentType);ServerResponse body(Object body);<T> ServerResponse body(T body, ParameterizedTypeReference<T> bodyType);ServerResponse render(String name, Object... modelAttributes);ServerResponse render(String name, Map<String, ?> model);ServerResponse stream(Consumer<StreamBuilder> streamConsumer);}

SseBuilder

SseBuilder 是用于構建并發送 Server-Sent Events(SSE) 的構建器接口,支持事件 ID、名稱、重試時間、注釋、數據發送,以及超時、異常和完成回調等控制邏輯。

interface SseBuilder {void error(Throwable t);void complete();SseBuilder onTimeout(Runnable onTimeout);SseBuilder onError(Consumer<Throwable> onError);SseBuilder onComplete(Runnable onCompletion);void send(Object object) throws IOException;void send() throws IOException;SseBuilder id(String id);SseBuilder event(String eventName);SseBuilder retry(Duration duration);SseBuilder comment(String comment);void data(Object object) throws IOException;}

StreamBuilder

StreamBuilder 是用于構建低層級響應流的構建器接口,支持向客戶端逐步寫入對象數據(可指定媒體類型)、刷新緩沖、注冊流控制回調,以及在出現異常或超時等情況時進行處理。

interface StreamBuilder {void error(Throwable t);void complete();StreamBuilder onTimeout(Runnable onTimeout);StreamBuilder onError(Consumer<Throwable> onError);StreamBuilder onComplete(Runnable onCompletion);StreamBuilder write(Object object) throws IOException;StreamBuilder write(Object object, @Nullable MediaType mediaType) throws IOException;void flush() throws IOException;}

Context

Context 接口定義了在 writeTo(HttpServletRequest, HttpServletResponse, Context) 方法中使用的上下文,提供用于響應體轉換的 HttpMessageConverter 列表。

interface Context {List<HttpMessageConverter<?>> messageConverters();
}

執行

推薦閱讀: [spring6: DispatcherServlet.doDispatch]-源碼分析

RouterFunctionMapping

public class RouterFunctionMapping extends AbstractHandlerMapping implements InitializingBean, MatchableHandlerMapping {@Nullableprivate RouterFunction<?> routerFunction;private List<HttpMessageConverter<?>> messageConverters = Collections.emptyList();private boolean detectHandlerFunctionsInAncestorContexts = false;public RouterFunctionMapping() {}public RouterFunctionMapping(RouterFunction<?> routerFunction) {this.routerFunction = routerFunction;}@Overridepublic void afterPropertiesSet() {if (this.routerFunction == null) {initRouterFunctions();}if (CollectionUtils.isEmpty(this.messageConverters)) {initMessageConverters();}if (this.routerFunction != null) {PathPatternParser patternParser = getPatternParser();if (patternParser == null) {patternParser = new PathPatternParser();setPatternParser(patternParser);}RouterFunctions.changeParser(this.routerFunction, patternParser);}}private void initRouterFunctions() {List<RouterFunction<?>> routerFunctions = obtainApplicationContext().getBeanProvider(RouterFunction.class).orderedStream().map(router -> (RouterFunction<?>) router).collect(Collectors.toList());ApplicationContext parentContext = obtainApplicationContext().getParent();if (parentContext != null && !this.detectHandlerFunctionsInAncestorContexts) {parentContext.getBeanProvider(RouterFunction.class).stream().forEach(routerFunctions::remove);}this.routerFunction = routerFunctions.stream().reduce(RouterFunction::andOther).orElse(null);logRouterFunctions(routerFunctions);}private void initMessageConverters() {List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(4);messageConverters.add(new ByteArrayHttpMessageConverter());messageConverters.add(new StringHttpMessageConverter());messageConverters.add(new AllEncompassingFormHttpMessageConverter());this.messageConverters = messageConverters;}@Override@Nullableprotected Object getHandlerInternal(HttpServletRequest servletRequest) throws Exception {if (this.routerFunction != null) {// DefaultServerRequestServerRequest request = ServerRequest.create(servletRequest, this.messageConverters);HandlerFunction<?> handlerFunction = this.routerFunction.route(request).orElse(null);setAttributes(servletRequest, request, handlerFunction);return handlerFunction;}else {return null;}}private void setAttributes(HttpServletRequest servletRequest, ServerRequest request,@Nullable HandlerFunction<?> handlerFunction) {PathPattern matchingPattern =(PathPattern) servletRequest.getAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE);if (matchingPattern != null) {servletRequest.removeAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE);servletRequest.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, matchingPattern.getPatternString());ServerHttpObservationFilter.findObservationContext(request.servletRequest()).ifPresent(context -> context.setPathPattern(matchingPattern.getPatternString()));}servletRequest.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, handlerFunction);servletRequest.setAttribute(RouterFunctions.REQUEST_ATTRIBUTE, request);}@Nullable@Overridepublic RequestMatchResult match(HttpServletRequest request, String pattern) {throw new UnsupportedOperationException("This HandlerMapping uses PathPatterns");}
}

HandlerFunctionAdapter

public class HandlerFunctionAdapter implements HandlerAdapter, Ordered {private static final Log logger = LogFactory.getLog(HandlerFunctionAdapter.class);private int order = Ordered.LOWEST_PRECEDENCE;@Nullableprivate Long asyncRequestTimeout;public void setOrder(int order) {this.order = order;}@Overridepublic int getOrder() {return this.order;}public void setAsyncRequestTimeout(long timeout) {this.asyncRequestTimeout = timeout;}@Overridepublic boolean supports(Object handler) {return handler instanceof HandlerFunction;}@Nullable@Overridepublic ModelAndView handle(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Object handler) throws Exception {WebAsyncManager asyncManager = getWebAsyncManager(servletRequest, servletResponse);servletResponse = getWrappedResponse(asyncManager);ServerRequest serverRequest = getServerRequest(servletRequest);ServerResponse serverResponse;if (asyncManager.hasConcurrentResult()) {serverResponse = handleAsync(asyncManager);}else {HandlerFunction<?> handlerFunction = (HandlerFunction<?>) handler;serverResponse = handlerFunction.handle(serverRequest);}if (serverResponse != null) {return serverResponse.writeTo(servletRequest, servletResponse, new ServerRequestContext(serverRequest));}else {return null;}}private WebAsyncManager getWebAsyncManager(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(servletRequest, servletResponse);asyncWebRequest.setTimeout(this.asyncRequestTimeout);WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(servletRequest);asyncManager.setAsyncWebRequest(asyncWebRequest);return asyncManager;}private static HttpServletResponse getWrappedResponse(WebAsyncManager asyncManager) {AsyncWebRequest asyncRequest = asyncManager.getAsyncWebRequest();Assert.notNull(asyncRequest, "No AsyncWebRequest");HttpServletResponse servletResponse = asyncRequest.getNativeResponse(HttpServletResponse.class);Assert.notNull(servletResponse, "No HttpServletResponse");return servletResponse;}private ServerRequest getServerRequest(HttpServletRequest servletRequest) {ServerRequest serverRequest =(ServerRequest) servletRequest.getAttribute(RouterFunctions.REQUEST_ATTRIBUTE);Assert.state(serverRequest != null, () -> "Required attribute '" +RouterFunctions.REQUEST_ATTRIBUTE + "' is missing");return serverRequest;}@Nullableprivate ServerResponse handleAsync(WebAsyncManager asyncManager) throws Exception {Object result = asyncManager.getConcurrentResult();asyncManager.clearConcurrentResult();LogFormatUtils.traceDebug(logger, traceOn -> {String formatted = LogFormatUtils.formatValue(result, !traceOn);return "Resume with async result [" + formatted + "]";});if (result instanceof ServerResponse response) {return response;}else if (result instanceof Exception exception) {throw exception;}else if (result instanceof Throwable throwable) {throw new ServletException("Async processing failed", throwable);}else if (result == null) {return null;}else {throw new IllegalArgumentException("Unknown result from WebAsyncManager: [" + result + "]");}}@Override@SuppressWarnings("deprecation")public long getLastModified(HttpServletRequest request, Object handler) {return -1L;}private static class ServerRequestContext implements ServerResponse.Context {private final ServerRequest serverRequest;public ServerRequestContext(ServerRequest serverRequest) {this.serverRequest = serverRequest;}@Overridepublic List<HttpMessageConverter<?>> messageConverters() {return this.serverRequest.messageConverters();}}
}

實戰

@SpringBootApplication
public class Application {@Beanpublic RequestPredicate requestPredicate() {return RequestPredicates.GET("/");}@Beanpublic HandlerFunction<ServerResponse> handlerFunction() {return request -> ServerResponse.ok().body("hello, world");}@Beanpublic HandlerFilterFunction<ServerResponse, ServerResponse> handlerFilterFunction() {return (request, next) -> {System.out.println("Before handler");ServerResponse response = next.handle(request);System.out.println("After handler");return response;};}@Beanpublic RouterFunction<ServerResponse> routerFunction() {return RouterFunctions.route(requestPredicate(), handlerFunction()).filter(handlerFilterFunction());}public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90818.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux DNS 服務器正反向解析

一、環境說明與準備工作 1.基礎信息 本次實驗用兩臺 Linux 主機&#xff0c;分別作為 DNS 服務端和客戶端&#xff0c;具體信息如下&#xff1a;服務端IP客戶端IP網址192.168.120.130192.168.120.128www.zy.com2.準備工作 關閉安全軟件&#xff1a;服務端和客戶端都要關閉防火墻…

歷史數據分析——中證旅游

中證旅游板塊走勢從月線級別來看2015年5月到2024年9月&#xff0c;月線上走出了一個震蕩中樞的月線級別下跌段&#xff1b;目前月線級別底部放巨量&#xff0c;總體還在底部震蕩&#xff0c;后續上漲的概率較大。從周線級別來看從2022年12月到2024年9月整體是下跌走勢&#xff…

OpHReda精準預測酶最佳PH

1.顯著改進&#xff1a;OpHReda通過檢索嵌入數據增強機制&#xff0c;顯著提高了酶最佳pH預測的準確性&#xff0c;相比現有方法提升了55%的F1分數。2.多尺度殘差輕注意力模塊&#xff1a;該模塊結合了殘差學習和多尺度特征提取&#xff0c;增強了模型對酶序列中殘差級信息的捕…

醫護行業在未來會被AI淘汰嗎?

隨著AI的迅速發展&#xff0c;似乎所有職業都有被AI替代的風險&#xff0c;那麼醫療領域作為一個高技術依賴性的行業&#xff0c;有機會被淘汰嗎?我們今天就來說說&#xff0c;幾乎不可能被AI淘汰的職業---護理。一) AI在護理中扮演的角色i.) 臨床工作支持1. 健康監測自動化即…

大語言模型加速技術之KV Cache

大語言模型加速技術之KV CacheWhy we need KV Cache &#xff1f;Self-Attention Without CacheSelf-Attention With CacheHuggingface 官方代碼實現Why we need KV Cache &#xff1f; 生成式generative模型的推理過程很有特點&#xff0c;我們給一個輸入文本&#xff0c;模型…

代碼隨想錄算法訓練營第五十三天|圖論part4

110.字符串接龍 題目鏈接&#xff1a;110. 字符串接龍文章講解&#xff1a;代碼隨想錄思路&#xff1a; 把每個字符串看成圖的一個節點。 轉換為求無權圖兩節點的的最短路徑。求最短路徑用bfs #include <string> #include <vector> #include <iostream> #i…

Java進階4:泛型、序列化和反序列化

Java泛型 Java泛型是JDK5引入的一個新的特性&#xff0c;泛型提供了編譯時的類型安全檢測機制&#xff0c;這個機制運行程序員在編譯的時候檢測到非法的類型。泛型的本質是參數化類型&#xff0c;也就是所操作的數據類型被指定為一個參數。 泛型方法 可以寫一個泛型方法&#x…

RAG實戰指南 Day 24:上下文構建與提示工程

【RAG實戰指南 Day 24】上下文構建與提示工程 文章內容 開篇 歡迎來到"RAG實戰指南"系列的第24天&#xff01;今天我們將深入探討RAG系統中至關重要的上下文構建與提示工程技術。在檢索增強生成系統中&#xff0c;如何有效地組織檢索到的文檔片段&#xff0c;并將…

AWD的攻擊和防御手段

一、AWD相關介紹 AWD&#xff08;Attack With Defence&#xff09;是 CTF 線下賽中最接近真實攻防場景、觀賞性和對抗性最強的賽制之一。 賽制本質 人人對抗&#xff1a;所有戰隊互為攻擊者與防守者。 零和記分&#xff1a;你拿到的每一分都是別人的失分&#xff0c;總積分恒…

泛微OA8前臺SQL注入

漏洞URL&#xff1a; http://106.15.190.147/js/hrm/getdata.jsp?cmdgetSelectAllId&sql***注入點 在getdata.jsp中&#xff0c;直接將request對象交給 weaver.hrm.common.AjaxManager.getData(HttpServletRequest, ServletContext) : 方法處理 在getData方法中&#xff0…

Android 藍牙學習

在Android中&#xff0c;進行藍牙設備掃描startDiscovery需要申請位置權限&#xff0c;但有的時候并不需要申請位置權限&#xff0c;就有了android:usesPermissionFlags"neverForLocation"&#xff0c;設置這個就不用申請位置權限來進行藍牙掃描。 android:usesPerm…

Earth靶機攻略

一.環境準備 1.1Earth靶機環境準備 首先將我們解壓好的的Earth.ova放入虛擬機里&#xff0c;并配置環境 將網絡連接換成NET連接 二.信息搜集 2.1ip搜集 2.1.1使用netdiscover命令掃描靶機的ip地址,發現地址為192.168.182.137 2.2端口掃描 2.2.1使用nmap工具對目標機進行端…

java8 List常用基本操作(去重,排序,轉換等)

參考簡述網址: java8 List 根據對象某個字段或多個字段去重、篩選、List轉Map、排序、分組、統計計數等等 list簡單方法示例如下&#xff1a; 一、先定義一個訂單對象&#xff08;Order&#xff09; public class Order {private Long id;private Long userId;private Strin…

【linux】HAProxy七層代理

HAPorxy簡介HAProxy&#xff08;High Availability Proxy&#xff09;是一款高性能、開源的負載均衡器與反向代理服務器&#xff0c;主要用于 TCP 和 HTTP 協議的流量分發&#xff0c;廣泛應用于高并發、高可用的網絡架構中核心特性超高性能與低資源消耗基于單進程、多線程模型…

Android 的16 KB內存頁設備需要硬件支持嗎,還是只需要手機升級到Android15系統就可以

Android 的16 KB內存頁設備需要硬件支持嗎&#xff0c;還是只需要手機升級到Android15系統就可以&#xff1f; deepseek回答&#xff1a; DeepSeek R1 思考 3 秒 思考過程 好的&#xff0c;用戶現在問的是Android的16 KB內存頁設備是否需要硬件支持&#xff0c;還是只需要升級到…

相機內外參矩陣:從3D世界坐標到2D像素坐標變換

相機內外參矩陣&#xff1a;從3D世界坐標到2D像素坐標變換介紹**1. 內參矩陣&#xff08;Intrinsic Matrix, K&#xff09;****2. 外參矩陣&#xff08;Extrinsic Matrix, [R|t]&#xff09;****3. 完整投影過程&#xff08;世界坐標 → 像素坐標&#xff09;****步驟1&#xf…

哈希指針與數據結構:構建可信數字世界的基石

一、哈希指針的核心原理哈希指針是一種創新型數據結構&#xff0c;融合了傳統指針的定位功能與密碼學哈希的驗證能力&#xff1a;雙重功能&#xff1a;既存儲數據地址&#xff0c;又包含該數據的哈希值&#xff0c;實現數據定位與完整性驗證的統一。抗篡改機制&#xff1a;數據…

java實現一個方法,isTure則程序繼續往下,為false則return的鏈式寫法

以下是實現鏈式條件檢查的Java方法&#xff0c;采用函數式風格設計。代碼包含一個Chainable類&#xff0c;支持連續的check方法和多個終止操作&#xff08;如then, orElse等&#xff09;&#xff0c;滿足在條件為false時中斷鏈式調用并返回默認值的需求&#xff1a;import java…

數據結構學習之堆

本篇我們將學習新的數據結構——二叉樹。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com 目錄 樹的概念 樹形結構 非樹形結構 樹的相關術語 樹的表示 樹在實際生活上的應用 二叉樹 慢二叉樹 完全二叉樹 二叉樹的儲存結構 二叉樹的存儲結構 順序結構…

【csdn問答社區分析】前端開發熱點問題全解析

前端時間我在csdn問答社區的前端部分"視察”了一圈發現了大家的問題主要集中在以下方面一、框架與組件庫使用問題 Vue相關問題 組件化開發&#xff1a;如avue-crud組件自定義樣式不生效、el-select大數據分頁懶加載、element-plus表格動態列校驗等。功能實現&#xff1a;包…