nKognito
nKognito

Reputation: 6363

Spring CookieLocaleResolver: set cookiePath

Is it possible to set cookiePath with the value of application name (automatically)? For example I have a test.war so it will be available at bla.com/test/ so I want my cookie's path be /test/ and not / that is default value. Thank you

Upvotes: 4

Views: 3485

Answers (2)

Sam YC
Sam YC

Reputation: 11617

If you use a ServletContainer >= 2.5 and spring annotation, you can use the following code to get the ContextPath, so you don't have to hardcode:

@EnableWebMvc
@Configuration
@ComponentScan("com.controller")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private ServletContext servletContext;

    @Bean
    public LocaleResolver localeResolver(){
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setDefaultLocale(new Locale("en"));
        resolver.setCookieName("locale");
        resolver.setCookiePath(servletContext.getContextPath());
        resolver.setCookieMaxAge(31536000);
        return resolver;
    }

}

Upvotes: 1

Arun P Johny
Arun P Johny

Reputation: 388316

When you create the CookieLocaleResolver you can set the path, but it will be hard coded.

Ex

<bean id="localeResolver" class="CookieLocaleResolver">
    <property name="cookiePath" value="test" />
</bean>

Another possible solution is to override the LocaleResolver

public class MyCookieLocaleResolver extends CookieLocaleResolver {

    @Override
    public void setLocale(HttpServletRequest request,
            HttpServletResponse response, Locale locale) {
        if (locale != null) {
            // Set request attribute and add cookie.
            request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, locale);
            addCookie(response, locale.toString());
        } else {
            // Set request attribute to fallback locale and remove cookie.
            request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME,
                    determineDefaultLocale(request));
            removeCookie(response);
        }
    }

    public void addCookie(HttpServletRequest request,
            HttpServletResponse response, String cookieValue) {
        Cookie cookie = createCookie(request, cookieValue);
        Integer maxAge = getCookieMaxAge();
        if (maxAge != null) {
            cookie.setMaxAge(maxAge);
        }
        if (isCookieSecure()) {
            cookie.setSecure(true);
        }
        response.addCookie(cookie);
        if (logger.isDebugEnabled()) {
            logger.debug("Added cookie with name [" + getCookieName()
                    + "] and value [" + cookieValue + "]");
        }
    }

    protected Cookie createCookie(HttpServletRequest request, String cookieValue) {
        Cookie cookie = new Cookie(getCookieName(), cookieValue);
        if (getCookieDomain() != null) {
            cookie.setDomain(getCookieDomain());
        }
        cookie.setPath(request.getContextPath());
        return cookie;
    }
}

Upvotes: 3

Related Questions