【发布时间】:2012-02-10 16:06:03
【问题描述】:
如何检测它是否是过滤器类要处理的请求/响应?此外,我需要取消对我的 servlet 的请求,并希望创建自己的响应并从 dofilter 方法返回它。有没有办法做到这一点?
【问题讨论】:
-
请说明你想做什么
标签: java jakarta-ee servlet-filters
如何检测它是否是过滤器类要处理的请求/响应?此外,我需要取消对我的 servlet 的请求,并希望创建自己的响应并从 dofilter 方法返回它。有没有办法做到这一点?
【问题讨论】:
标签: java jakarta-ee servlet-filters
每个过滤器都可以不影响请求和响应中的一个、一个或两个。这完全取决于您在调用 chain.doFilter(...) 之前和/或之后是否做了任何事情 - 以及您是否传递了一个包装好的请求和/或响应。
如果您需要在过滤器中创建自己的响应,只需不要调用 chain.doFilter(...) 并提供您自己的过滤器响应。
请参考Filter.doFilter Javadocs,包括:
此方法的典型实现如下 图案:- 1. 检查请求 2. 可以选择使用自定义实现包装请求对象以过滤内容或标题以进行输入过滤 3. 可以选择使用自定义实现包装响应对象以过滤内容或标题以进行输出过滤 4. a) 使用 FilterChain 对象 (chain.doFilter()) 调用链中的下一个实体, 4. b) 或者不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理 5. 调用过滤器链中的下一个实体后,直接在响应上设置标题。
【讨论】:
我已经使用 response.getWriter().write("response data"); 修改了响应。 并通过删除 chain.doFilter(); 避免将响应传递给 servlet;
现在,我正在通过 doFilter 方法验证会话变量(用于身份验证)。 由于请求和响应都在同一个 doFilter 方法中处理,我认为这些会话验证在请求发生时发生了 2 次(1.)和(2.)在响应时发生。 但是,如何找到 doFilter 当前正在处理的内容(请求/响应)? 所以我可以只在请求时进行会话验证。
【讨论】: