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 过滤器都已处理完毕?