首页 > 解决方案 > 在 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 从未被调用,我不明白为什么。
那么我在这里错过了什么?

标签: javacookiesjakarta-eeremember-mewebfiltering

解决方案


几次尝试后,我得出的结论是 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();
    }

}

这可能不是最好的解决方案,但它确实有效。
如果有人有更好的方法,请告诉我。


推荐阅读