Spring的Filter、服务器间跳转和客户端跳转通过示例得到的相关总结

本文通过示例代码展示了Spring MVC中过滤器与控制器的交互,揭示了服务器间跳转和客户端跳转对Filter的影响,以及响应提交状态的变化。测试表明,Spring请求处理方法在服务器间跳转或客户端跳转后,Filter仍会被触发,且在返回到Filter后响应已提交,无法再修改响应头和响应体。
摘要由CSDN通过智能技术生成

先look look演示代码:

package com.test;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "myFilter1", urlPatterns = "/*")
public class TestFilter implements Filter {


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println(((HttpServletRequest)servletRequest).getRequestURI() + " start");
        filterChain.doFilter(servletRequest, servletResponse);
//        ((HttpServletResponse)servletResponse).getWriter().print("111");
        System.out.println("返回到Filter,是否已提交:" + servletResponse.isCommitted());
        System.out.println(((HttpServletRequest)servletRequest).getRequestURI() + " end");
    }
}
package com.test;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
@RequestMapping("test")
public class TestController {


    @RequestMapping("/a")
    public void a(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("/test/b").forward(req, resp);
    }

    @RequestMapping("/b")
    public String b(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("服务器间跳转后,是否已提交:" + resp.isCommitted());
        return "b";
    }

    @RequestMapping("/c")
    public void c(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.sendRedirect("/test/d");
    }

    @RequestMapping("/d")
    public String d(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("客户端跳转后,是否已提交:" + resp.isCommitted());
        return "d";
    }

    @RequestMapping("/e")
    public String e(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        return "e";
    }

    @RequestMapping("/f")
    public void f(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.sendRedirect("/test/g");
    }

    @RequestMapping("/g")
    public void g(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.sendRedirect("/test/h");
    }

    @RequestMapping("/h")
    public String h(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        return "h";
    }

    @RequestMapping("/i")
    public void i(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("/test/j").forward(req, resp);
    }

    @RequestMapping("/j")
    public void j(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("/test/k").forward(req, resp);
    }

    @RequestMapping("/k")
    public String k(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        return "k";
    }
}

访问/test/a,打印如下:

访问/test/c,打印如下:

访问/test/e,打印如下:

访问/test/f,打印如下:

访问/test/i,打印如下:

得到如下总结:

Spring的请求处理方法可服务器间跳转和客户端可跳转3次以上
Spring的请求处理方法返回到Filter后response已commit,不能再修改响应头和响应体
Spring的请求处理方法无论服务器间跳转多少次,都只以第一次请求的URL来回经过一次Filter
Spring的请求处理方法每次客户端跳转,都会来回经过一次Filter
Spring的请求处理方法无论服务端跳转还是客户端跳转,跳转后response都未commit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值