spring boot 有没有办法全局拦截 url 进行截断处理

2019-09-27 11:52:50 +08:00
 rizon

请求方会在 url 后面加上一个特殊的路径走网关去处理这个地址。
但是现在有个服务会直接接收请求不走网关,也不能加 nginx 处理 url。 那么 Spring 有办法去全局处理 url 吗?把地址截断。

请求地址: http://server/path/tag 真实的地址: http://server/path

不讨论为什么会出现这种场景,为什么不合理这些东西。 只是单纯的想知道技术上怎么去全局重写 url 地址。

5092 次点击
所在节点    程序员
24 条回复
ywcjxf1515
2019-09-27 12:14:37 +08:00
写一个过滤器,再加上一个包装类包装原有的 Request 对象,包装类重写拿到 url 的方法,使得 springmvc 发到相应的控制器方法?
ywcjxf1515
2019-09-27 12:16:57 +08:00
要不在过滤器中做转发,使用 servlet 自带的转发?
leonme
2019-09-27 12:17:19 +08:00
拦截器
zgcwkj
2019-09-27 12:19:25 +08:00
用 shiro 不是更好?
HonoSV
2019-09-27 12:28:35 +08:00
shiro
Takamine
2019-09-27 12:31:51 +08:00
感觉拦截器就好,这个需求上 shiro 重了点。
rizon
2019-09-27 14:24:32 +08:00
@ywcjxf1515 #1
@leonme #3
@Takamine #6
我也知道是拦截器,能有些具体的写法吗?不知道拦截器怎么才能修改 url 后重新发到对应的 controller
HuasLeung
2019-09-27 14:24:38 +08:00
拦截器或 AOP
HuasLeung
2019-09-27 14:26:03 +08:00
修改完 url 后 forward 转发对应 controller
honeycomb
2019-09-27 14:29:33 +08:00
@rizon 拦截器,或者 AOP 也可以达到类似的效果(在切面方法里把 request 找出来)。

可以考虑先从 AOP 入手,这样可以完全不影响到现有代码(不想要了的时候,只要去掉 pointcut 注解),如果试了一下觉得 AOP 不满足需求的话再用拦截器不迟。
sunsulei
2019-09-27 14:30:17 +08:00
不一定好做. 因为 url 进去了. 肯定先被 servletDispacher 处理, 那会已经确定了具体的处理 controller 以及 method.
feiyizhan
2019-09-27 14:34:55 +08:00
继承 HttpServletRequestWrapper,然后实现一个过滤器,在过滤器的 doFilter 方法里调用 chain.doFilter 方法时,传入自己实现的 request。
LeeSeoung
2019-09-27 14:41:16 +08:00
urlrewritefilter 有搜到这个包 看下能满足?
tzh1247
2019-09-27 14:45:03 +08:00
Jfinal 中的 Handler 有这个功能
luozic
2019-09-27 14:54:14 +08:00
拦截器 AOP 实际这种 niginx 转发或者网关处理更干净
66beta
2019-09-27 15:02:28 +08:00
JAVA 新手路过,spring 的卖点不就是切片吗?
licoycn
2019-09-27 15:04:32 +08:00
拦截器,AOP
iiicarus
2019-09-27 15:21:27 +08:00
AOP 做,pointcut 拦截所有 controller,然后拿到 URL,过滤掉不需要的 URL,然后再进行一系列操作。前几天刚好完成了类似功能。http 日志详细记录。
ywcjxf1515
2019-09-27 15:22:41 +08:00
测试过了,我说的两种方法都行。
/qaz 对应的是 test()方法,想让 /qaz/test 调用 test()方法。不使用转发或者包装类,/qaz/test 不能调用 test()方法。
aHR0cHM6Ly9pLmxvbGkubmV0LzIwMTkvMDkvMjcvOExmSDJ4NlVDRTM5YndlLnBuZw==
aHR0cHM6Ly9pLmxvbGkubmV0LzIwMTkvMDkvMjcvNzNTZXhRMnFXSktFbm01LnBuZw==
aHR0cHM6Ly9pLmxvbGkubmV0LzIwMTkvMDkvMjcvZGJOTWZZRXpybXk1S2pvLnBuZw==
(utf-8,base64)
@rizon
aragakiyuii
2019-09-27 15:50:13 +08:00
shiro 用 filter,springmvc 用 interceptor,spring 用 aop

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX