2015-01-06 6 views
3

Я пытаюсь сохранить Cookie по запросу пользователя и позже использовать этот файл cookie для заполнения текстового поля. Я использую Java CDI и логин. Я новичок во всех трех. Для интернет-ресурсов все, что я могу найтиСохранение и использование файла cookie с CDI

@Inject @CookieParam 
private String username; 

и

@Inject @CookieParam("username") 
private Instance<String> usernameResolver; 
... 
String username = usernameResolver.get(); 

Для первого сообщения об ошибке говорит " Unsatisfied dependencies for type [String] with qualifiers [@Default]"

Для второго единственной ошибки я получаю говорит "Failed to start context"

Как исправить эту проблему?

Благодаря

+0

"login bean"? Боб? Что это за класс? Кто управляет этим классом? Какую веб-инфраструктуру вы используете на самом деле? '@ CookieParam' - это как подсказки имени пакета, специфичные для JAX-RS, среды RESTful Java EE и, очевидно, не будут работать над классами, управляемыми другой инфраструктурой Java EE, такими как JSF, Servlet и т. Д. – BalusC

+0

О, хорошо , ya структура - JSF. Я бы не знал, что они несовместимы. Однако я не могу найти никаких ресурсов. – user1795370

ответ

3

Как @CookieParam package name намеков, это специфично для JAX-RS, другой framefork Java EE для RESTful веб-служб. Это будет работать только в управляемом ресурсе JAX-RS в аннотации @Path. Это не будет работать в управляемом компоненте JSF или CDI как аннотируется @ManagedBean или @Named.

Если вы используете JSF @ManagedBean для управления компонентом, то он доступен EL-оценкой #{cookie.username} как @ManagedProperty.

@ManagedBean 
public class Bean { 

    @ManagedProperty("#{cookie.username}") 
    private String username; 

    // ... 
} 

Если вы используете КДИ-х @Named управлять бобом, то вы либо прибегать к пользовательской аннотации, или захват его как Cookie из текущего FacesContext. Как бывший не тривиально (но на самом деле хорошая идея для OmniFaces, хотя), я покажу только последний:

@Named 
public class Bean { 

    private String username; 

    @PostConstruct 
    public void init() { 
     Cookie cookie = (Cookie) FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap().get("username"); 

     if (cookie != null) { 
      username = cookie.getValue(); 
     } 
    } 

    // ... 
} 

Тогда для того, чтобы сохранить его, единственный способ использует ExternalContext#addResponseCookie().

FacesContext.getCurrentInstance().getExternalContext().addResponseCookie("username", username, properties); 

Не забудьте принять во внимание, что значение cookie является очень ограничительным по отношению к допустимым символам. Возможно, вам понадобится URL-encode и -decode при сохранении и извлечении. Библиотека утилиты JSF OmniFaces предлагает вспомогательные методы, которые делают это неявно.

username = Faces.getRequestCookie("username"); 
Faces.addResponseCookie("username", username, -1); 

Unrelated к конкретной проблеме, сохранение чего-то чувствительное как "имя пользователя", как печенье страшно. Знаете ли вы, что файлы cookie манипулируют конечным пользователем? Что человек, посещающий вашу веб-страницу, может легко отредактировать значение cookie, представляющее «имя пользователя», для кого-то другого?

+0

Хорошо, что полезно знать. Я изменю имя в своем коде. – user1795370

+0

Также для второго блока кода вы имели в виду Named вместо ManagedBean? Я использую Named – user1795370

+0

Да, '@ Named'.Я уже исправил это. И, поскольку вы новичок здесь, не забывайте отмечать ответ, принятый, когда это помогло (наиболее) в понимании и решении конкретной проблемы. См. Также [Как принимается ответ?] (Http://meta.exetchange.com/a/5235) Сделайте то же самое для [вопросов, которые вы задали ранее] (http://stackoverflow.com/users/1795370/user1795370 ? tab = questions), где это применимо. – BalusC

Смежные вопросы