java - 在 Webfilter 中更改 Rememberme-Cookie
问题描述
我正在尝试更改 Webfilter 中 Cookie 的域和路径。
Cookie 由 Soteria RememberMeInterceptor 添加到响应中。
这是我的网络过滤器:
@WebFilter(filterName = "DomainCookieFilter",
urlPatterns = {"/*"},
dispatcherTypes = {DispatcherType.ASYNC, DispatcherType.REQUEST})
public class DomainCookieFilter implements Filter {
private static Logger logger = Logger.getLogger(DomainCookieFilter.class.getSimpleName());
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("DomainCookieFilter invoked!!!");
chain.doFilter(request, new DomainCookieResponseWrapper((HttpServletResponse) response));
}
}
这是 ResponseWrapper:
public class DomainCookieResponseWrapper extends HttpServletResponseWrapper {
private static Logger logger = Logger.getLogger(DomainCookieResponseWrapper.class.getSimpleName());
public DomainCookieResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void addCookie(Cookie cookie) {
logger.info("Add Cookie: " + cookie.getName());
if(cookie.getName().equals("JREMEMBERMEID") && cookie.getMaxAge() != 0) {
cookie.setDomain(".domain.local");
cookie.setPath("/");
logger.info("Add Cookie: changed Domain");
}
super.addCookie(cookie);
}
}
DomainCookieResponseWrapper.addCookie-Method 从未被调用,我不明白为什么。
那么我在这里错过了什么?
解决方案
几次尝试后,我得出的结论是 Authenticationrequests 没有被过滤。
我终于想出了一个不同的方法。
我在默认的之前写了另一个 RemembermeInterceptor,其中 Response 被我的 Responsewrapper 替换。
@Interceptor
@RememberMe
@Priority(PLATFORM_BEFORE + 209)
public class PreRememberMeInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Object[] newParams = { ctx.getParameters()[0],
new DomainCookieResponseWrapper((HttpServletResponse) ctx.getParameters()[1]),
ctx.getParameters()[2] };
ctx.setParameters(newParams);
return ctx.proceed();
}
}
这可能不是最好的解决方案,但它确实有效。
如果有人有更好的方法,请告诉我。
推荐阅读
- ruby-on-rails - Rails:通过belongs_to查询has_one在查询中添加PK null
- python - 来自 XYZ csv 格式的栅格
- dynatrace - 来自 Dynatrace 的 /etc/passwd(或任何 xyz 文件)文件更改警报
- sql-server - 我可以根据全新 proc 中的 Column 对多个存储过程进行分组吗?避免重复结果?
- javascript - 香草javascript中的下拉过滤器
- windows - 使用批处理文件变量值扩展路径注册表项值的正确语法
- swift - 如何在 SwiftUI 中删除列表的左右填充?
- scala - 如何找到与当前日期最近的日期
- git - 在 Google Cloud Source Repositories 上存储大文件
- networking - 如何使用 Scapy 创建带有时间戳字段的 IP 数据包