ServletRequest对象向下转型HttpServletRequest调用子类方法为何不报错

转:https://www.cnblogs.com/gwyy/p/9078135.html
前情提要:学习servlet的时候,学到了用令牌机制防止用户恶意登录的时候(即:只在网站的index.html或者是网站的登录界面),给用户发令牌(即是用户账号密码验证无误登陆成功后request.getSession()),其他所有的servlet中,如果要操作该用户session,则都使用request.getSession(false);这样就能保证用户只有通过合法的登录渠道才能访问除了登录页外的动态资源。
但是这样做,需要在网站内的每一个servlet,都对用户的令牌进行一个判断,操作复杂,并且无法防止用户直接访问网站的静态资源文件,因此,想到了用过滤器,对所有的请求进行一次身份验证再放行。
但是在javax.servlet这个包下的Filter接口中,doFilter(ServletRequest reques, ServletResponse respinse)方法中的两个参数,他们是HttpServletRequest和HTTPServletResponse的父类,而ServletRequest接口中,并没有提供getSession()方法,无法获取到用户令牌获取身份。于是在这个地方考虑到了把这两个参数强转为他的子类HttpServletRequest,来调用getSession()方法,问题解决,此时,问题就产生了,众所周知,java中的向下转型是不安全的,此处,却通过强转,调用了request对象中的getSession方法,却没有报错,是为什么呢?
转载的这篇文章完美的回答了这个问题,因此转载记录,给作者点赞!
简单描述一下:作者通过instanceof关键词,验证了这个方法上的参数request并不是有tomcat通过ServletRequest request = new ServletRequest(); 这种方法得来,而应该是由ServletRequest request = (ServletRequest)new HttpServletRequest();这种方法得来,也就是说,这个参数中的request对象,其实是HttpServletRequest这个接口的上转型实例对象,因此,只是隐藏了子类中的方法,所以我们拿到这个对象之后,把他向下转型之后,只是还原了这个对象应有的方法,并不存在安全问题,也不会在调用getSession方法时报错。详见转载文章。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值