关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)
2016-11-25 21:32
459 查看
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
}
因为要用到HttpServletRequest中的方法,我对ServletRequest进行了强转,然后问题解决。可是后来一想不对啊,我们知道我们对子类实现进行向上转型得到父类对象是安全的,因为子类会完全继承父类的方法,我们向上转型为父类,当我们调用父类的方法其实在子类实现中是能完全找到的。反之向下转型是不安全的,我们子类除了完全继承父类的方法外还会拓展自己的方法,所以我们在调用子类方法时可能在父类实现中是找不到的,所以向下转型不安全。
可是本例中的实现却让我们困惑,我们不仅实现了向下转型,同时还调用了子类拓展的方法,是父类没有的,可是却实现了。这不是和我们所学矛盾吗?后来看了API和一些资料我终于明白了,这和我们所学其实并不冲突!我们先看API:
public interface HttpServletRequest extends ServletRequest
终于找到原因了,原来HttpServletRequest和ServletRequest都是接口,他们都只是定义了方法却没有提供相关实现。所以我们看到的ServletRequest request中的request对象其实并不是我们ServletRequest 的一个具体实现。
这里我们要看我们提出的问题是否安全,其实主要看request 对象的具体实现类究竟是继承的哪个接口,如果继承自HttpServletRequest接口那么我们向下转型使用HttpServletRequest接口的方法就是安全的。测试如下:
if(request instanceof HttpServletRequest){
System.out.println("我是右边类的实例");
}
输出:我是右边类的实例,证明我们的request对象的确是HttpServletRequest的一个实例。
原地址:http://blog.csdn.net/huan_mie/article/details/6114427
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
}
因为要用到HttpServletRequest中的方法,我对ServletRequest进行了强转,然后问题解决。可是后来一想不对啊,我们知道我们对子类实现进行向上转型得到父类对象是安全的,因为子类会完全继承父类的方法,我们向上转型为父类,当我们调用父类的方法其实在子类实现中是能完全找到的。反之向下转型是不安全的,我们子类除了完全继承父类的方法外还会拓展自己的方法,所以我们在调用子类方法时可能在父类实现中是找不到的,所以向下转型不安全。
可是本例中的实现却让我们困惑,我们不仅实现了向下转型,同时还调用了子类拓展的方法,是父类没有的,可是却实现了。这不是和我们所学矛盾吗?后来看了API和一些资料我终于明白了,这和我们所学其实并不冲突!我们先看API:
public interface HttpServletRequest extends ServletRequest
终于找到原因了,原来HttpServletRequest和ServletRequest都是接口,他们都只是定义了方法却没有提供相关实现。所以我们看到的ServletRequest request中的request对象其实并不是我们ServletRequest 的一个具体实现。
这里我们要看我们提出的问题是否安全,其实主要看request 对象的具体实现类究竟是继承的哪个接口,如果继承自HttpServletRequest接口那么我们向下转型使用HttpServletRequest接口的方法就是安全的。测试如下:
if(request instanceof HttpServletRequest){
System.out.println("我是右边类的实例");
}
输出:我是右边类的实例,证明我们的request对象的确是HttpServletRequest的一个实例。
原地址:http://blog.csdn.net/huan_mie/article/details/6114427
相关文章推荐
- 关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)
- 关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)
- 采用Filter的方法解决HttpServletRequest.getParameter乱码的问题
- Eclipse开发web项目中关于HttpServletRequest包的问题
- HttpServletRequest&HttpServletResponse&乱码问题
- HttpServletRequest与HttpServletResponse处理中文问题
- ServletRequest,HttpServletRequest ServletResponse,HttpServletResponse的区别:
- 关于httpservletRequest碰到的一个问题
- HttpServletRequestWrapper,HttpServletResponseWrapper在过滤器Filter中的使用
- 关于XMLHttpRequest.responseXML.documentElement=null的问题
- 关于HttpServletRequest.getParameterMap()方式取数报错问题
- 关于使用HttpWebRequest和HttpWebResponse时中文乱码问题
- 关于Servlet中的HttpServletRequest和HttpServletResponse
- HttpServletRequest/HttpServletResponse乱码问题解决
- Spring学习笔记(二十三):关于STS提示"javax.servlet.http.HttpServletRequest cant be resolved"的问题
- Filter处理HttpServletRequest & HttpServletResponse 笔记
- 关于警告: No mapping found for HTTP request with URI [/spMVC/] in DispatcherServlet with name 'spMVC'的问题
- HttpServletResponse响应头与HttpServletRequest请求头及编码问题
- ServletRequest,HttpServletRequest,ServletResponse,HttpServletResponse区别
- Struts2 Filter 和 HttpServletRequestWrapper出现的问题