Spring-Boot: веб-фильтр для перенаправления - PullRequest
1 голос
/ 14 апреля 2020

У меня есть фильтр. Он должен перенаправить на / b, если запрашивается / a.

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

Почему метод вызывается? Я ожидал бы только b, потому что я перенаправляю в doFilter от a до b. Как я могу это сделать?

1 Ответ

1 голос
/ 14 апреля 2020

Итак, вы на самом деле делаете перенаправление, хотя кажется, что вы просто хотите перенаправить запрос на сопоставление другого контроллера.

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

Затем он передается в цепочку фильтров, и все продолжается, как если бы это был исходный запрос

...