关于request和response的一个疑点

SunsetFeng 2018-11-02 11:21:08
疑点:使用sendRedirect跳转页面之后,request对象和response对象的hashcode没改变,它们的类也没有重写过hashCode方法,我怀疑是同一对象,但设置的参数取不到,为null,堆栈上发现每次访问request和response对象是new的,明显不是同一对象,但这就不知道为什么hashCode能相等。
测试代码:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.setHeader("Cache-Control","no-store,no-cache");
resp.setHeader("Expires","0");
resp.setHeader("Pragma","no-cache");
req.setAttribute("param","test");
resp.sendRedirect("/MyServlet/HTML/Test.jsp");
System.out.println(req.hashCode());
System.out.println(resp.hashCode());
}
jsp:
<%
System.out.println(request.getParameter("param"));
System.out.println(request.hashCode());
System.out.println(response.hashCode());
%>
输出:
堆栈上追踪发现创建request对象和response对象的方法,在AbstractProcessor类里面
public AbstractProcessor(Adapter adapter) {
this(adapter, new Request(), new Response());
}
跪求大佬们给个解释
...全文
98 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
H-arry 2018-11-04
  • 打赏
  • 举报
回复
看到你说的这个问题,我记得有个方法,后端设置request.setAttribute(key,value)的时候,前端可以根据request.getAttribute(key)方式获取到这个值,也就是说,你前端获取的请求其实就是后端发的request本身,所以你两次取到的hashcode值是一样的,也就是前后两个request其实是同一个request,我意思是,这个方法的作用应该是,后端反馈给前端的请求需要重新new,也就是如果你截取到前端发往后端的request,和后端发往前端的request,那么这两个request是不同的,后者是重新创建的,但是你代码中获取的hashcode本身已经是后端重新创建好的request了,那么你前端通过jsp获取的请求request,其实就是后端发的这个request,所以二者的hashcode是一样的。
SunsetFeng 2018-11-02
  • 打赏
  • 举报
回复
引用 7 楼 qq_41979009 的回复:
我觉得转发之后的request对象以及response对象已经被重新赋值了

我开始也有这样想过,但重定向相当于2次访问,在堆栈上找到request和response的创建源头,我就瞬间否认了
后面的对象传递过程中,如果我没有漏看的话,一直就是这2个对象了
JackYang1024 2018-11-02
  • 打赏
  • 举报
回复
我觉得转发之后的request对象以及response对象已经被重新赋值了
SunsetFeng 2018-11-02
  • 打赏
  • 举报
回复
引用 3 楼 ToughPZG 的回复:
我觉得转发之后的request对象以及response对象已经被重新赋值了

我最开也怀疑过tomcat容器将废弃的response对象和request对象存起来复利用,但知道发现新请求是直接new的新对象时,很明显就不是一个对象了
ToughPZG 2018-11-02
  • 打赏
  • 举报
回复
我记得我测过,转发后,下一个请求执行完毕后,还会接着执行转发之后的代码
ToughPZG 2018-11-02
  • 打赏
  • 举报
回复
我觉得转发之后的request对象以及response对象已经被重新赋值了
ToughPZG 2018-11-02
  • 打赏
  • 举报
回复
把转发之后那两句输出语句,换到在转发之前执行试试
十八道胡同 2018-11-02
  • 打赏
  • 举报
回复
hashCode 一样就是同一个对象

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧