美文网首页
Servlet sendRedirect(重定向)与forwor

Servlet sendRedirect(重定向)与forwor

作者: 错对对 | 来源:发表于2021-03-03 14:12 被阅读0次

    首先我们看下 sendRedirect(重定向)与forworld(转发)的具体是指什么:

    一个web资源受到客户端请求后,通知服务器去调用另一个web资源进行处理,称之为请求转发。 一个web资源受到客户端请求后,通知浏览器去调用另一个web资源进行处理,称之为请求重定向。

    根据字面意思上理解,重定向肯定是会重新走filter了,因为重定向是告知浏览器再次发出请求。而请求转发则是服务器内部的逻辑,它还会重新走filter吗?

    我们看下 正常的一个请求是怎么访问到servelte的 ,下面我画了个简图

    image-20210226172231167.png

    到底是不是我们猜测的那样呢?我们用代码说话

    首先创建自己的filter

    public class CharsetEncodingFilter implements Filter {
    
        private String encoding = null;
    
        private ServletContext servletContext;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.encoding = filterConfig.getInitParameter("encoding");
            this.servletContext = filterConfig.getServletContext();
        }
    
        @Override
        public void doFilter(ServletRequest request,
                             ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                HttpServletResponse httpResponse = (HttpServletResponse) response;
                httpRequest.setCharacterEncoding(encoding);
                httpResponse.setCharacterEncoding(encoding);
                servletContext.log("当前编码已设置为:" + encoding);
                // CharsetEncodingFilter -> FrontControllerServlet -> forward -> index.jsp
            }
    
            // 执行过滤链
            chain.doFilter(request,response);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    运行项目查看执行结果:

    访问:http://localhost/user-web/

    日志输出

    三月 03, 2021 2:02:09 下午 org.apache.catalina.core.ApplicationContext log
    三月 03, 2021 2:02:09 下午 org.apache.jasper.compiler.TldLocationsCache tldScanJar
    

    发现并没有咱们刚才打印的日志

    servletContext.log("当前编码已设置为:" + encoding);

    这是未什么呢?

    翻找servlet规范

    [图片上传失败...(image-ee5aab-1614751675752)]

    文字太多 咱们只截图部分说明哈,具体的文档请翻阅《Java™ Servlet 规范》3.1版本

    根据文档中我们发现,设置filter是可以指定拦截的是什么类型的请求。

    根据文档,配置如下

    <filter-mapping>
     <filter-name>CharsetEncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
     <dispatcher>FORWARD</dispatcher>
     <dispatcher>INCLUDE</dispatcher>
     <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    

    再次打包运行,结果如下:

    信息: 当前编码已设置为:UTF-8
    三月 03, 2021 2:02:09 下午 org.apache.jasper.compiler.TldLocationsCache tldScanJar
    

    根据结果得知,无论是转发和重定向都会根据是否配置了拦截的类型而进行拦截的。
    git代码:https://github.com/cuoduidui/geekbanglessons.git

    相关文章

      网友评论

          本文标题:Servlet sendRedirect(重定向)与forwor

          本文链接:https://www.haomeiwen.com/subject/depqqltx.html