Файлы cookie в нескольких файлах WAR - PullRequest
1 голос
/ 25 августа 2009

Я создаю шаблон facelets для всех внутренних приложений моей компании. Его внешний вид основан на скине, который выбирает пользователь (например, темы Gmail).

Имеет смысл сохранить предпочитаемый скин пользователя в файле cookie.

Мой WAR с пользовательскими настройками может видеть этот файл cookie. Однако другие мои приложения не могут найти cookie. Они находятся в том же домене / поддомене, что и пользовательские настройки WAR.

Есть ли какая-то причина для этого?

Вот мой бин, который используется для создания / поиска предпочтительного скина. Этот же файл используется во всех проектах:

// BackingBeanBase is just a class with convenience methods. Doesn't 
// really affect anything here.
public class UserSkinBean extends BackingBeanBase {

    private final static String SKIN_COOKIE_NAME = "preferredSkin";

    private final static String DEFAULT_SKIN_NAME = "classic";


    /**
     * Get the name of the user's preferred skin. If this value wasn't set previously, 
     * it will return a default value.
     * 
     * @return
     */
    public String getSkinName() {

        Cookie skinNameCookie = findSkinCookie();

        if (skinNameCookie == null) {
            skinNameCookie = initializeSkinNameCookie(DEFAULT_SKIN_NAME);
            addCookie(skinNameCookie);
        }

        return skinNameCookie.getValue();

    }


    /**
     * Set the skin to the given name. Must be the name of a valid richFaces skin.
     *     
     * @param skinName
     */
    public void setSkinName(String skinName) {

        if (skinName == null) {
            skinName = DEFAULT_SKIN_NAME;
        }

        Cookie skinNameCookie = findSkinCookie();

        if (skinNameCookie == null) {
            skinNameCookie = initializeSkinNameCookie(skinName);
        }
        else {
            skinNameCookie.setValue(skinName);    
        }

        addCookie(skinNameCookie);
    }

    private void addCookie(Cookie skinNameCookie) {
        ((HttpServletResponse)getFacesContext().getExternalContext().getResponse()).addCookie(skinNameCookie);
    }

    private Cookie initializeSkinNameCookie(String skinName) {

        Cookie ret = new Cookie(SKIN_COOKIE_NAME, skinName);
        ret.setComment("The purpose of this cookie is to hold the name of the user's preferred richFaces skin.");

        //set the max age to one year.
        ret.setMaxAge(60 * 60 * 24 * 365);
        ret.setPath("/");
        return ret;
    }


    private Cookie findSkinCookie() {
        Cookie[] cookies = ((HttpServletRequest)getFacesContext().getExternalContext().getRequest()).getCookies();

        Cookie ret = null;
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(SKIN_COOKIE_NAME)) {
                ret = cookie;
                break;
            }
        }

        return ret;
    }
}

Кто-нибудь может увидеть, что я делаю не так?

Обновление: я немного его сузил ... он хорошо работает в FF, но IE все еще не нравится (конечно). Спасибо, Zack

Ответы [ 2 ]

0 голосов
/ 18 сентября 2009

Я нашел решение.

Я просто использовал javascript на стороне клиента для создания файлов cookie.

Это сработало нормально.

0 голосов
/ 25 августа 2009

Я думаю, вам необходимо назначить домен / поддомен для файлов cookie.

Как, (Обратите внимание, что домен должен начинаться с точки)

ret.setDomain(".test.com");
ret.setDomain(".test.co.uk");

http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Cookies.html

...