如何更改哪些资源回应来自Servlet过滤器的请求?

时间:2015-08-05 21:56:29

标签: redirect jersey servlet-filters shiro

我有一个ServletFilter(恰好是GuiceShiroFilter),它在进入Jersey 1.x资源之前处理传入的Web请求。

但是,在某些情况下(即当Shiro发现请求未经过身份验证时),我想更改哪个Jersey资源回应了我的请求,而没有 已经回答的资源,即使能够回应。

这就是我所拥有的(在我的Shiro中AuthenticatingFilteronLoginFailure()):

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修改(ServletRequestFilter的现有实例,以便以后只有重定向资源可以回答?< /强>

1 个答案:

答案 0 :(得分:0)

我稍微深入研究了这个问题,我意识到我在这里做的很少,因为我无法控制如何进一步处理过滤链。

在通用Filter中,实现者可以将当前ServletRequest(在doFilter()中包含在HttpServletRequestWrapper实现中。然后,此包装器可以覆盖请求URI。这要求实现者控制过滤器链如何继续(这是包装请求可以反馈到执行路径的位置),但在我的情况下情况不是这样,Shiro控制它。

使用Shiro,过滤器链延续在AdviceFilter.doFilterInternal()中控制,比我自己的AuthenticatingFilter实现更多层。

所以现在,我最好的办法是做我上面已经描述过的事情:使用RequestDispatcher调用另一个资源 - 没有过滤器 - 并在最后返回false来停止过滤器链我的AuthenticatingFilter onLoginFailure()