我有一个过滤器。如果/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。
我怎样才能做到这一点?
最佳答案
因此,您实际上是在进行重定向,尽管您似乎只想将请求定向到不同的 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);
}
然后将其传递给过滤器链,一切都将继续,就好像那是原始请求一样
关于java - Spring-Boot:用于重定向的 Web 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61214313/