java - Spring-Boot:用于重定向的 Web 过滤器

标签 java spring-boot servlet-filters

我有一个过滤器。如果/a 被请求,它应该重定向到/b。

public class WebFilter extends GenericFilterBean
{ 
 @Override
 public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
 {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String path = req.getRequestURI ().toString ();

    if (path.equals ("/a") == true)
    {
        System.out.println ("FILTER: a -> b");
        res.reset ();
        res.resetBuffer();
        res.sendRedirect ("b");
    }

    chain.doFilter (req, res);
  }
}

这是内容的处理程序。
@Component
@Controller
@RequestMapping ("/")
public class WebHandler
{

 @RequestMapping ("/a")
 public String a ()
 {
    System.out.println ("a");
    return "a"; // point to a.jsp
 }

 @RequestMapping ("/b")
 public String b (HttpSession ses)
 {
     System.out.println ("b");
     return "b"; // point to b.jsp
 }
}

如果我在浏览器中请求/a,那就是输出。
FILTER: a -> b
IN a
IN b

为什么方法 a 被调用?
我只期望 b,因为我在 doFilter 中从 a 重定向到 b。
我怎样才能做到这一点?

最佳答案

因此,您实际上是在进行重定向,尽管您似乎只想将请求定向到不同的 Controller 映射。

    res.sendRedirect ("b");

只需将响应代码更改为 302 并添加一个 location 字段,您仍然会遇到第一个 Controller ,这就是为什么您仍然在日志中看到 a 的原因。
然后浏览器确认此重定向指令,并将发送第二个 /b 请求。

实现您似乎想要的一种方法是从提交的请求创建一个新请求,并简单地覆盖 getRequestUri() 方法。
    @Override
    public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String path = req.getRequestURI();


        if (path.equals("/a")) {
            req = new HttpServletRequestWrapper((HttpServletRequest) request) {
                @Override
                public String getRequestURI() {
                    return "/b";
                }
            };
        }

        chain.doFilter (req, res);
    }

然后将其传递给过滤器链,一切都将继续,就好像那是原始请求一样

关于java - Spring-Boot:用于重定向的 Web 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61214313/

相关文章:

java - 求矩阵中元素的最小和

Java从二进制结构化文件中读取错误的值

java - 按水平顺序展开单元格?

spring - 什么是属性 management.health.redis.enabled 以及如何使用它?

java - 如何仅将 servlet 过滤器应用于具有 HTTP POST 方法的请求

http - ServletResponse.reset() 是阻止未经授权(注销)用户访问 servlet 的可行方法吗?

java - 使用 Spring-Test-MVC 对 Spring-Security 进行单元测试 - 集成 FilterChain/ServletFilter

java - 将文档或文件夹从 Documentum 中的一个存储库移动到另一个存储库

java - Controller 中的并行流中没有线程绑定(bind)请求错误

java - 在实体内增加值(likeCount)而不会遇到并发问题