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

Posted

技术标签:

【中文标题】Spring-Boot:用于重定向的 Web 过滤器【英文标题】:Spring-Boot: Web-Filter for Redirection 【发布时间】:2020-07-27 13:43:24 【问题描述】:

我有一个过滤器。如果请求 /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。 我怎样才能做到这一点?

【问题讨论】:

你在使用spring security吗? 不,我知道。 【参考方案1】:

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

    res.sendRedirect ("b");

只需将响应代码更改为302 并添加location 字段,您仍然会点击第一个控制器,这就是为什么您仍然在日志中看到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);
    

然后将其传递给过滤器链,一切都继续进行,就像原来的请求一样

【讨论】:

以上是关于Spring-Boot:用于重定向的 Web 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

(spring-boot) http 到 https 重定向,405 方法不允许消息

使用过滤器类的重定向过多

htaccess 重定向适用于邮递员而不适用于 chrome (CORS)

重定向是不是保证会延迟到所有 servlet 过滤器都已处理完毕?

Java Web 应用程序中的会话过期时如何重定向到登录页面?

tomcat可以通过过滤主机别名来进行ssl重定向吗?