[英]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.