我有一个ServletFilter
(恰好是GuiceShiroFilter
),它在进入Jersey 1.x资源之前处理传入的Web请求。
但是,在某些情况下(即当Shiro发现请求未经过身份验证时),我想更改哪个Jersey资源回应了我的请求,而没有 已经回答的资源,即使能够回应。
这就是我所拥有的(在我的Shiro中AuthenticatingFilter
。onLoginFailure()
):
ServletRequest request = ...;
RequestDispatcher disp = request.getRequestDispatcher("/resource/that/always/responsds/with/a/403");
try {
disp.forward(request, response);
} catch (ServletException | IOException e) {
e.printStackTrace();
}
// this is needed to prevent the woud-be resource from responding as well
return false;
此服务器端重定向的问题是,不返回false
将调用我的"/resource/that/always/responsds/with/a/403"
资源和原始的可能响应,并且在最好的情况下,响应正文包含两个响应级联。
有没有办法从Http
修改(ServletRequest
)Filter
的现有实例,以便以后只有重定向资源可以回答?< /强>
答案 0 :(得分:0)
我稍微深入研究了这个问题,我意识到我在这里做的很少,因为我无法控制如何进一步处理过滤链。
在通用Filter
中,实现者可以将当前ServletRequest
(在doFilter()
中包含在HttpServletRequestWrapper
实现中。然后,此包装器可以覆盖请求URI。这要求实现者控制过滤器链如何继续(这是包装请求可以反馈到执行路径的位置),但在我的情况下情况不是这样,Shiro控制它。
使用Shiro,过滤器链延续在AdviceFilter.doFilterInternal()
中控制,比我自己的AuthenticatingFilter
实现更多层。
所以现在,我最好的办法是做我上面已经描述过的事情:使用RequestDispatcher
调用另一个资源 - 没有过滤器 - 并在最后返回false
来停止过滤器链我的AuthenticatingFilter
onLoginFailure()