簡體   English   中英

Spring-Boot:用於重定向的 Web 過濾器

[英]Spring-Boot: Web-Filter for Redirection

我有一個過濾器。 如果請求 /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,那就是 output。

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);
    }

然后將其傳遞給過濾器鏈,一切都繼續進行,就好像那是原始請求一樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM