java重定向和转发的区别是什么
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇"java重定向和转发的区别是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2025年12月03日java重定向和转发的区别是什么
这篇"java重定向和转发的区别是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"java重定向和转发的区别是什么"文章吧。
定义
首先来看两者的javadoc。
sendRedirect()
/**
* Sends a temporary redirect response to the client using the
specified redirect location URL. This method can accept relative URLs; the servlet container must convert the relative URL to an absolute URL before sending the response to the client. If the location is relative without a leading '/' the container interprets it as relative to the current request URI.
If the location is relative with a leading '/' the container interprets it as relative to the servlet container root.
*/
public void sendRedirect(String location) throws IOException;
重定向是向客户端发送一个指定URL的临时重定向的响应。
forward()
/**
* Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. This method allows one servlet to do preliminary processing of a request and another resource to generate the response.
The request and response parameters must be either the same objects as were passed to the calling servlet's service method .
*/
public void forward(ServletRequest request, ServletResponse response);
转发,则是将一个请求转到服务器的另一个资源。在处理完初步请求另外的资源之后生成响应。
定义基本说明了转发操作为何可以保持request内的parameter,attribute这些值都可以保留,而重定向操作却会丢弃的原因:
转发是在服务端完成的,并没有经过客户端
转发整个操作完成后才生成响应
重定向是服务端向客户端发送指定的URL
重定向是在客户端完成的
我们再来看Tomcat内部,对于两者是怎样一种实现方式。
2. 容器实现
我们在servlet内部一般对于这两者的使用形式也相当直观,例如对于hello.jsp的请求:
sendRedirct方法
response.sendRedirect("/hello.jsp");
此时,内部的处理方式如下:
public void sendRedirect(String location, int status) throws IOException {
// Generate a temporary redirect to the specified location
try {
String absolute = toAbsolute(location);
setStatus(status); //这里,重定向是返回302状态码以及Location和对应的url
setHeader("Location", absolute);
} catch (IllegalArgumentException e) {
setStatus(SC_NOT_FOUND);
}}
即根据Location,浏览器最终再发起新的请求,最终展现在浏览器中的即为新请求的URL,也就是大家常说的重定向会显示最终的URL。
有上这些并不能造成重定向操作将之前request中已经绑定的一系列parameter和attribute丢掉。最根本的原因是一个请求完整处理完成之后,整个请求会有一个release的过程,即CoyoteAdapter的service方法执行完的finally块中执行release这一过程,基本如下:
finally { if (!comet && !async || error.get()) {
request.recycle(); //注意这两行代码
response.recycle();
}
}
具体request的recycle部分代码如下:
/**
* Release all object references, and initialize instance variables, in preparation for reuse of this object.
*/
public void recycle() {
attributes.clear();
requestedSessionId = null;
requestedSessionURL = false;
parameterMap.clear();
pathParameters.clear();
}我们看到用于存储setAttribute方法设置的和setParameter方法设置的数据在这里都clear掉了。这也是重定向不能够保留数据的真正原因。
forward方法
forward方法一般使用如下:
request.getRequestDispatcher("/hello.jsp").forward(request, response);
forward方法内部最终会调用dispatcher的doForward方法
void doForward(ServletRequest request, ServletResponse response){
// Set up to handle the specified request and response
State state = new State(request, response, false);
wrapResponse(state);
ApplicationHttpRequest wrequest =
(ApplicationHttpRequest) wrapRequest(state); String contextPath = context.getPath();
HttpServletRequest hrequest = state.hrequest;
if (hrequest.getAttribute(
RequestDispatcher.FORWARD_REQUEST_URI) == null) {
wrequest.setAttribute(RequestDispatcher.FORWARD_PATH_INFO,hrequest.getPathInfo());
wrequest.setAttribute(RequestDispatcher.FORWARD_QUERY_STRING, hrequest.getQueryString());}
wrequest.setContextPath(contextPath);
wrequest.setRequestURI(requestURI);
wrequest.setServletPath(servletPath);
wrequest.setPathInfo(pathInfo);
if (queryString != null) {
wrequest.setQueryString(queryString);
wrequest.setQueryParams(queryString);
}
processRequest(request,response,state); //进行第二个资源的请求
}
}第二个资源的请求处理与一般的请求处理类似,只是在第一个请求之上,并没有返回响应时继续发起第二个请求,此时第一个请求的各类参数会继续向后传递,最终数据全部处理完成之后,整个响应发送回客户端。此时上面的release流程也依然会走,但并没有什么影响,毕竟第二个资源已经请求处理完成。
而由于浏览器发请求的时候是一个固定的URL,整个重定向是服务端内部进行的,浏览器并没有感知到,因此也不会显示出来。
以上就是关于"java重定向和转发的区别是什么"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
方法
处理
内容
客户
客户端
资源
浏览器
服务
浏览
原因
数据
代码
文章
方式
是在
知识
篇文章
过程
生成
直观
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云数据库kvstore是什么
网络编程和网络安全哪个更好
服务器连接状态异常怎么回事
网络安全经费预算情况
网络安全专业人员实用书籍
网络安全模板的优点
搭建硬件 软件开发环境
投抖加说服务器打瞌睡了
饥荒为什么进服务器卡
ae网络技术促销模板
网络安全工作由国家什么负责
灵武市政务软件开发排行榜
网络安全证书有效吗
慕克网络技术有限公司
阿里嵌入式软件开发笔试
杭州传维网络技术有限公司
一个实体对应两张数据库表
安徽存储服务器机箱采购云主机
web服务器搭建常见问题
c 获取服务器
红色档案数据库建设
制定网络安全策略需那些内容
金华公司网络安全准入控制哪家好
网络数据库技术实训准备
高校网络安全的问题与思考
中专二年级网络技术考试
护苗网络安全课打黄扫非
数据库审计价格
数据库oracle查询工具
网络安全股份公司