gpt4 book ai didi

java - 在 servlet 过滤器中保存并重新使用请求?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:40 26 4
gpt4 key购买 nike

我正在编写一个基于 JOID 库的 OpenID 过滤器,以允许应用程序透明地对我们的本地 OpenID 服务器进行身份验证。由于 OpenID 通过 HTTP 重定向工作,我最终会在此过程中丢失原始请求对象,尤其是当它是带有数据主体的 POST 时。在用户通过身份验证后,是否可以以一种我可以在交易中稍后重用它的方式保存请求对象?即使只是保存消息正文本身也应该足够了,因为我可以通过往返重定向(通过使用 OpenID 的 return-to-url)轻松地保留查询 URL。

我想让这对底层 servlet 完全透明,因此无论用户是通过 OpenID 流处理此特定请求还是仅具有有效/经过身份验证的本地 session ,它们的行为都是一样的。

最佳答案

将感兴趣的数据(请求参数、请求属性等)存储在 Map 中在 session 范围内通过唯一 ID 作为您添加到 return-to-url 的键。

String id = UUID.randomUUID().toString();
DataOfInterest data = new DataOfInterest(request);
Map<String, DataOfInterest> map = (Map<String, DataOfInterest) session.getAttribute("dataOfInterest");
map.put(id, data);
returnToUrl += "?token=" + URLEncoder.encode(id, "UTF-8");
// ...

然后当它返回时,使用 HttpServletRequestWrapper包装当前请求,您可以在其中覆盖 getParameter() 并合并以返回感兴趣的原始数据。在 Filter 中执行此操作。

String id = request.getParameter(token);
Map<String, DataOfInterest> map = (Map<String, DataOfInterest) session.getAttribute("dataOfInterest");
DataOfInterest data = map.remove(id);
chain.doFilter(new HttpServletRequestWithDataOfInterest(request, data), response);

HttpServletRequestWithDataOfInterest 可以如下所示:

public class HttpServletRequestWithDataOfInterest extends HttpServletRequestWrapper {

private DataOfInterest data;

public HttpServletRequestWithDataOfInterest(HttpServletRequest request, DataOfInterest data) {
super(request);
this.data = data;
}

public String getParameter(String name) {
return data.getParameter(name);
}

public String[] getParameterValues(String name) {
return data.getParameterValues(name);
}

// Etc, only when necessary.
}

注意:任何明显的 nullcheck 处理等都由您决定。

关于java - 在 servlet 过滤器中保存并重新使用请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com