实现过滤器遇到的一些问题

1.ServletRequest能够被强转为HttpServletRequest的原因

首先,他们的继承结构为:

public interface HttpServletRequest extends ServletRequest

HttpServletRequest 是 ServletRequest 的子接口。

在 HTTP 协议环境下,Servlet 容器(如 Tomcat)传给 service() 方法的实际对象是 HttpServletRequest 的实现类

所以:传进来的是子类型,你用父类型接收,再向下转型回子类型,是合法的。

当在Filter中看到这个方法时:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

虽然参数类型是 ServletRequest,但在 HTTP 请求场景下,实际传入的对象并不是一个普通的 ServletRequest,而是 实现了 HttpServletRequest 接口的具体类的实例

所以可以安全的向下转型:

HttpServletRequest httpRequest = (HttpServletRequest) request;

2.为什么设计成ServletRequest 而不是直接用 HttpServletRequest

为了解耦和扩展性:

ServletRequest 是通用接口,适用于任何协议(目前主要是HTTP)

如果将来支持 FTPServlet 或 WebSocketServlet,也可以使用 ServletRequest

但你在处理 HTTP 请求时,就需要使用 HttpServletRequest 提供的特有方法,比如:

  • getMethod():获取请求方法(GET、POST)
  • getHeader():获取请求头
  • getSession():获取会话
  • getCookies():获取 Cookie

这些方法只有 HttpServletRequest 有,ServletRequest 没有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值