1. 使用HttpServletRequest

UrlPathHelper 解析 出 url路径

org.springframework.web.util.UrlPathHelper 是 Spring 框架中用于处理 HTTP 请求路径的一个工具类,它帮助解析和处理与请求路径相关的细节。特别是 getLookupPathForRequest(HttpServletRequest request) 方法,能够获取到与当前请求匹配的路径,通常用于基于 URL 的路由和控制器匹配。

getLookupPathForRequest(request) 获取的路径特点

  1. 去除上下文路径和 servlet 路径

    • 该方法会返回从 URL 中去掉了上下文路径(context path)和 Servlet 路径(servlet path)的部分。它通常返回的就是用来路由到特定控制器或资源的匹配路径。
    • 例如,假设有一个请求 URL 为 http://example.com/myapp/api/resource,其中 myapp 是上下文路径,api 是 servlet 路径,/resource 是实际的匹配路径。那么,getLookupPathForRequest 会返回 /resource
  2. 与 Handler Mapping 相关

    • getLookupPathForRequest 获取的路径是基于 Spring MVC 的 HandlerMapping 机制来使用的。它通过解析请求的路径来找到匹配的处理器(如控制器)。这意味着返回的路径是 Spring MVC 用来路由请求的核心路径。
  3. 考虑 URL 解码

    • 该方法会对 URL 中的编码字符(如 %20 代表的空格)进行解码,这样程序获得的路径是实际可读的路径,而非编码的形式。例如,/path%20with%20spaces 会被转换为 /path with spaces
  4. 支持 HTTP 转发和重定向

    • 在处理 RequestDispatcherforwardinclude 时,UrlPathHelper 会处理和解析正确的路径,因此,即便请求是通过内部转发或者 include 处理的,该方法也能够返回当前转发后的路径。
  5. 配置灵活性

    • UrlPathHelper 允许配置是否应保留 URL 编码字符、是否要移除矩阵变量(通常以 ; 为分隔符的 URL 参数),以及是否应忽略上下文路径等,这使得它在不同的场景下具有很高的灵活性。

代码解析

StringBuilder reqInfo = new StringBuilder();
UrlPathHelper urlPathHelper = new UrlPathHelper();
String urlPath = urlPathHelper.getLookupPathForRequest(request);
  • urlPathHelper.getLookupPathForRequest(request):获取请求的匹配路径,去除上下文和 Servlet 路径的部分,返回匹配路径。
  • reqInfo.append(urlPath):将该路径添加到 StringBuilder 中,可能用于日志记录或后续的请求处理。

使用场景

  1. 路径匹配与路由:在处理 RESTful API 或 MVC 请求时,用于获取去除了上下文路径的匹配路径,以便路由到合适的控制器。
  2. 自定义过滤器:在实现自定义过滤器时,可以使用该方法获取请求的匹配路径,进行进一步的路径判断或权限控制。
  3. 日志记录和调试:在处理 HTTP 请求时,提取路径信息进行日志记录和调试,尤其是在复杂的 URL 路由或转发时。

总结来说,UrlPathHelper.getLookupPathForRequest 提供了一个灵活且精准的方式来解析请求路径,帮助开发者在 Spring 应用中处理基于路径的逻辑和路由。

2. 上下文路径和Servlet 路径的区别

在 Spring 和 Java Web 应用中,上下文路径(Context Path)Servlet 路径(Servlet Path) 是两个常见的路径概念,它们定义了应用和特定 Servlet 的 URL 结构。

1. 上下文路径(Context Path)

  • 定义:上下文路径是指应用部署到服务器中的根路径,所有请求都必须以该路径为前缀才能访问该应用。
  • 作用:它决定了应用的访问根路径,通常用于区分同一服务器中不同的应用。
示例:
  • 假设上下文路径是 /myapp,那么请求 http://localhost:8080/myapp 就会到达该应用。如果没有配置,上下文路径默认为 /(根路径),即应用直接从服务器的根目录开始访问。
如何配置上下文路径
  • application.properties 中配置
    server.servlet.context-path=/myapp
    
  • application.yml 中配置
    server:servlet:context-path: /myapp
    

在这个例子中,应用的上下文路径被设置为 /myapp,所有请求必须以 /myapp 开头才能路由到该应用。

2. Servlet 路径(Servlet Path)

  • 定义Servlet 路径是指应用中的某个具体 Servlet 或控制器处理的 URL 路径,它是在上下文路径之后的部分,决定了哪个 Servlet 或控制器处理特定的请求。
  • 作用:它用于将特定的请求路由到相应的 Servlet 或控制器进行处理。
示例:
  • 假设某个 Servlet 映射路径为 /api/*,并且上下文路径为 /myapp,则 URL http://localhost:8080/myapp/api/hello 将由该 Servlet 来处理请求。/api 就是该 Servlet 的路径。
如何配置 Servlet 路径
  • 你可以通过 @WebServletServletRegistrationBean 来配置 Servlet 路径。

通过 @WebServlet 注解配置

@WebServlet(urlPatterns = "/api/*")
public class MyServlet extends HttpServlet {// 处理请求
}

通过 ServletRegistrationBean 动态注册 Servlet

@Bean
public ServletRegistrationBean<MyServlet> myServlet() {return new ServletRegistrationBean<>(new MyServlet(), "/api/*");
}

3. 上下文路径和 Servlet 路径的区别

路径类型作用范围配置方式请求中的位置
上下文路径定义整个应用在服务器上的根路径server.servlet.context-path请求的开头部分
Servlet 路径定义应用内某个 Servlet 或控制器的路径@WebServletServletRegistrationBean上下文路径之后的部分
路径的组合关系

假设配置如下:

  • 上下文路径:/myapp
  • Servlet 路径:/api/*

当访问 http://localhost:8080/myapp/api/hello

  • 上下文路径/myapp
  • Servlet 路径/api/hello

Spring 的 UrlPathHelper.getLookupPathForRequest(request) 会去除上下文路径 /myapp 和 Servlet 路径中的 /api,返回的 lookup path 就是 /hello

4. 总结

  • 上下文路径 是整个应用的根路径,可以通过 server.servlet.context-path 配置。
  • Servlet 路径 是应用内某个 Servlet 或控制器的具体映射路径,通常通过 @WebServletServletRegistrationBean 进行配置。

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913473.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913473.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913473.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04安装p4显卡 nvidia-utils-570-server 570.133.20驱动CUDA Version: 12.8

Ubuntu22.04安装p4显卡 nvidia-utils-570-server 570.133.20驱动CUDA Version: 12.8专业显卡就是专业显卡&#xff0c;尽管p4已经掉到了白菜价&#xff0c;官方的支持却一直都保持&#xff0c;比如它可以装上cuda12.8,这真的出乎我意料。NVIDIA Tesla P4显卡的主要情况Pascal架…

工业日志AI大模型智能分析系统-前端实现

目录 主要架构 前端项目结构 1. 核心实现代码 1.1 API服务封装 (src/api/log.ts) 1.2 TS类型定义 (src/types/api.ts) 1.3 Pinia状态管理 (src/stores/logStore.ts) 1.4 日志分析页面 (src/views/LogAnalysis.vue) 1.5 日志详情组件 (src/components/LogDetail.vue) 2…

C++内存泄漏排查

引言 C内存泄漏问题的普遍性与危害内存泄漏排查大赛的背景与目标文章结构和主要内容概述 内存泄漏的基本概念 内存泄漏的定义与类型&#xff08;显式、隐式、循环引用等&#xff09;C中常见的内存泄漏场景&#xff08;指针管理不当、资源未释放等&#xff09;内存泄漏对程序性能…

20250706-4-Docker 快速入门(上)-常用容器管理命令_笔记

一、常用管理命令1. 选项&#xfeff;&#xfeff;1&#xff09;ls&#xfeff;功能&#xff1a;列出容器常用参数&#xff1a;-a&#xff1a;查看所有容器包含退出的-q&#xff1a;列出所有容器ID-l&#xff1a;列出最新创建的容器状态使用技巧&#xff1a;容器很多时使用dock…

基于 Camunda BPM 的工作流引擎示例项目

项目介绍 这是一个基于 Camunda BPM 的工作流引擎示例项目&#xff0c;包含完整的后台接口和前端页面&#xff0c;实现了流程的设计、部署、执行等核心功能。 技术栈 后端 Spring Boot 2.7.9Camunda BPM 7.18.0MySQL 8.0JDK 1.8 前端 Vue 3Element PlusBpmn.jsVite 功能…

Day06_刷题niuke20250707

试卷01&#xff1a; 单选题 C 1. 在C中,一个程序无论由多少个源程序文件组成,其中有且仅有一个主函数main().说法是否正确&#xff1f; A 正确 B 错误 正确答案&#xff1a;A 官方解析&#xff1a; 在C程序设计中,一个完整的程序确实有且仅有一个main函数作为程序的入口点,这…

洛谷 P5788 【模板】单调栈

题目背景模板题&#xff0c;无背景。2019.12.12 更新数据&#xff0c;放宽时限&#xff0c;现在不再卡常了。题目描述给出项数为 n 的整数数列 a1…n​。定义函数 f(i) 代表数列中第 i 个元素之后第一个大于 ai​ 的元素的下标&#xff0c;即 f(i)mini<j≤n,aj​>ai​​{…

linux系统运行时_安全的_备份_还原_方法rsync

1.问题与需求 问题: 新部署的机器设备(主控RK3588), 没有经过烧录定制镜像, 研发部署, 直接组装发送到客户现场需要通过frpc远程部署: 安装ros2 python包 docker镜像 环境配置 自启动配置 SN设备信息写自动部署脚本, 实现一键部署升级无奈物联网卡做了白名单限制, apt 和…

18套精美族谱Excel模板,助力家族文化传承!

【资源分享】18套精美族谱Excel模板&#xff0c;助力家族文化传承&#xff01; &#x1f3af; 本文分享一套完整的家族谱系资源&#xff0c;包含18个精心设计的Excel模板&#xff0c;从基础模板到专业图表&#xff0c;满足各类家族的族谱制作需求。 一、为什么要制作族谱&…

MySQL Galera Cluster企业级部署

一、MySQL Galera Cluster简介 主要特点 同步复制&#xff1a; 所有的写操作&#xff08;包括插入、更新、删除&#xff09;在集群中的所有节点上都是同步的。这意味着每个节点上的数据是完全一致的。 多主节点&#xff1a; 集群中的每个节点都是主节点。所有节点都可以处理读…

HTTP 重定向

什么是 HTTP 重定向&#xff1f; HTTP 重定向&#xff08;HTTP Redirect&#xff09; 是服务器向客户端&#xff08;通常是浏览器&#xff09;发出的指令&#xff0c;告诉客户端某个请求的资源已被移到新的位置。重定向通常通过发送一个特殊的 HTTP 状态码&#xff08;例如 3x…

本地加载非在线jar包设置

项目中存在私有jar包&#xff0c;提示在线获取不到&#xff0c;需要先获取到完整的jar包在打进maven中再在项目中进行maven依赖引入 mvn install:install-file -DfileD:\tools\maven\apache-maven-3.5.2\local_repository2\org\ahjk\SixCloudCommon\1.0\SixCloudCommon-1.0-SN…

Codeforces Round 979 (Div. 2)

A c[1]-b[1]0&#xff0c;之后每个c[1]-b[1]最大都是maxa-mina&#xff0c;最大和最小放前两个 B ans2^(a1)-2^s-1&#xff0c;1一个最小 C 我们可以把式子化为(....)||(....)||(....)括号里没有||&#xff0c;如果括号全是1那么A赢&#xff0c;A尽量选择把1选在一起 D …

UI前端大数据处理性能瓶颈突破:分布式计算框架的应用

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;前端大数据处理的性能困境与破局之路在数据爆炸增长的时代&#xff0c;UI…

病虫害数据集

数据是泰迪杯主办方提供的已经标记好的数据&#xff0c;4k画质的图片&#xff0c;总大小8个G 链接&#xff1a;https://pan.baidu.com/s/1fvmNHGrLvflEovjfCjDLOw?pwd6666 提取码&#xff1a;6666 虫害包括&#xff1a; 八点灰灯蛾 褐飞虱属 白背飞虱 二化螟 蟋蟀 黄足…

JAVA基础:关于JDK环境变量设置的若干相关细节及注意事项

一、JDK下载安装 网址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 以 win11 为例&#xff0c;根据网址下载安装包后&#xff0c;点击安装&#xff0c;注意设置安装路径 二、基础常识 1.Java三大使用平台 Java SE(Java Standard Edition): 标准版&…

C++高频知识点(四)

文章目录 16. 虚基类要解决什么问题&#xff1f;17. C中如何进行类型转换操作&#xff1f;列举并解释四种类型转换方式。18. 什么是函数重载&#xff1f;如何进行函数重载&#xff1f;19. 解释C中的友元函数和友元类&#xff0c;并解释其使用场景。友元函数友元类 20. 请解释C中…

【Servlet资源转发介绍】

文章目录 前言一、Servlet 资源转发是什么&#xff1f;1. 为什么要资源转发&#xff1f; 二、资源转发 vs 重定向三、如何使用 RequestDispatcher 进行资源转发1. 引入依赖2. 获取 RequestDispatcher3. forward 示例4. include 示例JSP 中 include 指令或动作Servlet 中 includ…

牛客周赛 Round 99题解

Round 99 思路&#xff1a;我们之间去用字符串去统计即可&#xff0c;输入一个字符串&#xff0c;看相邻有没有99即可 #include<bits/stdc.h> using namespace std; #define int long long string s; signed main() {cin>>s;int ns.size();for(int i1;i<n;i){i…

AR 如何改变我们构建网站的方式

想坐在沙发上试鞋子&#xff1f;欢迎来到 Web AR 的世界。还记得你在网页上逛商城时&#xff0c;点击一副墨镜&#xff0c;然后镜头打开&#xff0c;它就自动出现在你脸上的那一瞬间吗&#xff1f;不需要下载 App&#xff0c;不需要跳转&#xff0c;只需一个浏览器。这不是科幻…