Servlet处理带尾部斜杠/的URI
有一个需求:让一个Servlet能够同时处理形如/XXX/YYY
和/XXX/YYY/
的URI,即URI尾部的斜杠有没有都要能处理到。
很容易想到,做两个URL Pattern/XXX/YYY
和/XXX/YYY/
映射到该Servlet,问题就解决了。
但如果URI是动态的呢?比如XXX
和YYY
都是不确定的,成分数量也是不确定的,但处理逻辑又是相同的,那么就需要将任意URI都映射到该Servlet上。为了使静态资源能正常响应而不匹配进来,URL Pattern不要写/*
,而是写/
(fallback匹配),同时在web.xml
中做静态资源文件的URL Pattern(如*.css
)映射到default
(因为优先级*.xxx
> /
> 静态资源默认)。
此时,静态资源的URI和形如/XXX/YYY
(尾部无斜杠)的URI就都能正常响应了,但是/XXX/YYY/
(尾部有斜杠)却404,原因是Servlet容器将尾部带斜杠的URI看做是静态资源了,在没有精确匹配的情况下,会作为目录去匹配默认主页文件(实际请求/XXX/YYY/index.html
)。也就是说,请求根本就没有走到预期的Servlet中。
那怎么办呢?难道用/*
Servlet抓到所有的请求,然后自己做分发?很麻烦,而且对于静态资源是重复造轮子。
解决思路其实很简单,用Filter把尾部斜杠去掉,然后内部转发一下就可以了。Filter用URL Pattern/*
抓到所有请求,如果发现URI尾部带斜杠,就移除尾部斜杠然后转发,否则正常放行。
@WebFilter("/*")
public class TheFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
String uri = httpRequest.getRequestURI();
if (uri.endsWith("/")) {
uri = uri.substring(0, uri.length() - 1);
httpRequest.getRequestDispatcher(uri).forward(servletRequest, servletResponse);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
}
Servlet处理带尾部斜杠/的URI的更多相关文章
- 不走标准路的微软:少一个斜杠的URI Path
今天又被微软不按标准的做法折腾了一下,写篇博文抱怨一下. 我们先来看一下IETF(Internet Engineering Task Force)对URI结构的标准定义(链接): 注意上面的path部 ...
- 带双反斜杠的Json数据至单反斜杠的Json数据处理
假如你光看标题,你只能哦呵呵了!我也看不懂.还是先描述下问题吧.这里是使用微信接口返回了一些数据.因为该串数据包含html标签所以TX是对该串数据进行了编码的.所有的数据是通过Unicode编码的,然 ...
- nginx 重写URL尾部斜杠
1. 在URL结尾添加斜杠 在虚拟主机中这么添加一条改写规则: rewrite ^(.*[^/])$ $1/ permanent;或者rewrite ^([/\w-_]*[^/])$ $1/ perm ...
- Sed替换 内容带反斜杠(/)
sed "s#XXXX#${NAME}#" $MAIL_CONTENT > /tmp/MAIL_CONTENT1.tmp -----不论什么字符,紧跟着s命令的都被认为是新的 ...
- httpd 不带反斜杠 出现 301重定向
[root@VM_64_69_centos httpd]# curl http://localhost:9001/pay <!DOCTYPE HTML PUBLIC "-//IETF/ ...
- URL结尾反斜杠对SEO的影响(转)
开始纠结网站URL加不加反斜杠对SEO的影响,还有些人把这个反斜杠说的神乎其神,我擦,本人手贱百度了一下,果然“博大精深”,敬请参考! 从百度站长平台的外链分析里,我们可以看到,一些目录结构的URL, ...
- 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠
最近遇到一个比较郁闷的问题,记录一下 写了一个接口,想返回json 数据,但是返回值中总是带有反斜杠... ,下面来看原因 首先,配置 webapi的路由 App_Start 文件夹下 ,WebApi ...
- URL后面带\斜杠对SEO的影响
例如以下的两种URL书写方式: 1.www.baidu.com 2.www.baidu.com\ 这两种书写方式的区别到底在哪里呢?哪一个的速度更快呢?可能对于我们大多数人来说会觉得两个速度一样,因为 ...
- 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)
策划填Excel表时,约定对于复杂类型的数据采用Json的格式填写.如下图,D列的内容是Json数据. 单元格中的Json如下. { "name": "BeJson2&q ...
随机推荐
- CF466C 题解
Description 给定一个数组,求有多少组 \(i,j\) 将整个数组分成和相等的三个数组. Solution 从左往右看一遍,记录每一个 \(i\) 使得 \(\sum_{k=1}^i a_k ...
- CTF中的序列化与反序列化
记一些CTF出现的序列化与反序列化的知识点和题目. 序列化和反序列化的概念 序列化就是将对象转换成字符串.字符串包括 属性名 属性值 属性类型和该对象对应的类名. 反序列化则相反将字符串重新恢复成对象 ...
- Vue-Promise
promise 就是一种异步编程的的解决方案 当执行网络请求的时候,代码就会出现阻塞,下面的代码要等待请求完成了在运行,所以我们一般网络请求的时候就去开启一个异步任务,一边请求一边执行其他代码 请求到 ...
- 把对象交给spring管理的3种方法及经典应用
背景 先说一说什么叫把对象交给spring管理.它区别于把类交给spring管理.在spring里采用注解方式@Service.@Component这些,实际上管理的是类,把这些类交给spring来负 ...
- docker 安装mysql设置不区分表名大小写,创建minio,设置开机自启动
环境deepin mysql : docker run -p 3306:3306 --name tyer-mysql --restart=always -v $PWD/conf:/etc/mysql/ ...
- noip19
sb\(O(n^{2})\)传参 T1 暴力一会儿就码好,结果.. 祭奠一下死去的代码 died #include<cstdio> #define MAX 1010 #define re ...
- idea中的springboot的maven项目报错Failed to clean project: Failed to delete D:\new_shunyi\shunyi\target\shunyi\WEB-INF\classes\static\
正准备打包上传到测试环境,本想先clean下,没想到报了个这个错,意思大概是无法删除target下的某个文件,没有权限(一脸懵逼): 后来百度发现可能是因为我之前启动了tomcat,未关闭,然后关闭了 ...
- C# 二维码生成 ( QRCoder )
二维码1.前言seaconch 最近在搞二维码方面的一些东西,所以接触了一些二维码相关,那么既然用过了就要有用过了的样子 其实关于二维码的文章真的多的数不胜数,有很多写的很认真,很好,但这就像是学习一 ...
- Object 类中的主要结构
== 操作符与equals 方法 == 操作符 equals 方法 重写equals() 方法的 toString() 方法
- Fancytree实例
一.实例 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...