gpt4 book ai didi

使用 Tiles 时,Spring Session 无法在 Tomcat 8 上运行 - SESSION Cookie 未设置,因为已包含响应

转载 作者:行者123 更新时间:2023-11-28 22:27:17 24 4
gpt4 key购买 nike

我在 Spring Boot 项目上使用 Spring Session 1.2.0.RELEASE。这个打包成war,部署在Tomcat 8上。

我已经按照 Spring Session 文档进行了正确配置。问题是应用程序的入口点是一个 Controller ,它在 session 上设置了一些值,但 SESSION cookie 没有发送到浏览器。

调试我看到了:

  1. org.springframework.session.web.http.CookieHttpSessionStrategy.onNewSession()尝试写入 cookie:

    this.cookieSerializer
    .writeCookieValue(new CookieValue(request, response, cookieValue));

  2. org.springframework.session.web.http.DefaultCookieSerializer.writeCookieValue()在响应中设置 cookie:

    response.addCookie(sessionCookie);

  3. cookie 实际上并没有被写入。底层响应对象是 org.apache.catalina.core.ApplicationHttpResponse .它的addCookie()方法是:

    /**
    * Disallow <code>addCookie()</code> calls on an included response.
    * @param cookie The new cookie
    */
    @Override
    public void addCookie(Cookie cookie) {

    if (!included)
    ((HttpServletResponse) getResponse()).addCookie(cookie);

    }

问题是 included属性,在某些时候设置为 true,防止添加 cookie。

当服务 jsp(使用 tile)时会发生这种情况:

enter image description here

更新:

这是响应被标记为包含的时刻(当 standard.jsp tile 布局插入属性时:

<tiles:insertAttribute name="header" ignore="false"/>

enter image description here

最佳答案

为了解决这个问题,我最终创建了一个过滤器来强制创建 session 。

正如所看到的,对 Controller 的第一次调用没有添加 cookie,因为在 Tiles-JSP 呈现期间响应已经被标记为包含。我所做的是强制在过滤器中创建 session 并重定向询问完全相同的 requestURI。这样,由于调用不涉及渲染 cookie 的图 block ,因此可以在下一次调用中立即使用。

@Bean
@ConditionalOnExpression("${sessionEnforcerFilter.enabled:true}")
public FilterRegistrationBean sessionEnforcerFilter(){
logger.info("Registering sessionEnforcerFilter");
FilterRegistrationBean frb = new FilterRegistrationBean();
frb.setName("sessionEnforcerFilter");
frb.setFilter(new SessionEnforcerFilter());
frb.setUrlPatterns(Arrays.asList(new String[]{"/*"}));
return frb;
}

public class SessionEnforcerFilter implements Filter{

@Override
public void init(FilterConfig filterConfig) throws ServletException {}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
if(httpServletRequest.getSession(false)==null){
logger.debug("sessionEnforcerFilter.doFilter () - Session is null - forcing its creation");
httpServletRequest.getSession();
String requestURI = httpServletRequest.getRequestURI();
logger.debug("sessionEnforcerFilter.doFilter () - Repeating request [{}]", requestURI);
httpServletResponse.sendRedirect(requestURI);
}else{
chain.doFilter(httpServletRequest, response);
}
}

@Override
public void destroy() {}

}

关于使用 Tiles 时,Spring Session 无法在 Tomcat 8 上运行 - SESSION Cookie 未设置,因为已包含响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368151/

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