2012-02-18 4 views
2

Я прихожу на Java из Rails и PHP, поэтому мое мышление здесь может быть испорчено. Я хотел бы реализовать систему входа в систему, подобную той, которую я сделал в других системах (я понимаю, что вы можете управлять логином и т. Д., Используя встроенные свойства Java EE, я просто хочу понять, как я могу это сделать вручную и обмениваться объектами среди фасоли.)JSF 2.0 управляет пользователем

С рельсами или php легко поддерживать переменную сеанса, которая содержит идентификатор зарегистрированного пользователя. Затем глобальная переменная в PHP или свойство на контроллере приложений в рельсах могут быть предварительно загружены с помощью объекта пользователя, что позволяет использовать его во всех контроллерах/страницах. Таким образом, вошедший в систему статус пользователя и другие параметры легко доступны для всех страниц/контроллеров.

Я не знаю, как это сделать с помощью JSF.

Я знаю, как создать пользовательский объект с помощью JPA, а затем создать управляемый компонент с областью сеанса, содержащий ссылку на объект пользователя после входа в систему с использованием метода loggin из формы входа. Та часть я понимаю:

@ManagedBean 
@SessionScope 
public class LogginController { 

// inject persistence context, or use EJB to do actual loading etc 
private User currentUser;  //JPA Entity 

void loginAction() { 
    // action from login form 
    // authenticates user and loads user object into currentUser property 

Где я застреваю, что, хотя управляемый компонент, который содержит свойство CurrentUser имеет объем сессии, как бы я получить доступ, что собственность в других управляемых компонентах для получения текущего пользователя? Управляемые бобы, похоже, существуют изолированно друг от друга.

Является ли следующий код приемлемым?

@ManagedBean 
public class SomeOtherBean { 

@ManagedProperty 
LoginController loginController; 

public void someOtherMethod() { 
User myUser = loginController.getCurrentUser(); 
    // 
    // etc 

Будет ли класс, в который вводится фасоль, также иметь SessionScope? Является ли это неправильным подходом, мне нужно будет вручную установить сеанс, используя базовый ServletContext, чтобы пользователь был доступен в других компонентах (т. Е. Сохранить идентификатор зарегистрированного пользователя в сеансе, а затем перезагрузить пользователя после доступа к переменная сеанса пользователя в разных компонентах)?

Я все об этом не так? Есть ли более простой способ, которого я пропускаю.

ответ

1

Является ли следующий код приемлемым?

Да (при условии, что это псевдо, в реальном коде должно быть private собственность, и вы должны указать, управляемое значение свойства как так @ManagedProperty("#{loginController}") и обеспечить, по меньшей мере, метод установки).


бы класс, имеющий боб впрыскиваемого также должны иметь SessionScope тоже?

Не обязательно. Он вполне может быть объектом запроса или представления, но не компонентом, включенным в приложение (это приведет к исключению). По крайней мере, вы должны быть очень осторожны с выбором области бобов. Не выбирайте слишком широкую область для данных, которые она хранит. См. Также How to choose the right bean scope?.

+0

Спасибо ... Было бы лучше использовать CDI, т. Е. '@Produces @ UsrNode' в loginController, а затем' @UsrNode @ Inject'code в другом компоненте? Существуют ли какие-либо проблемы с производительностью при выполнении таких действий (с использованием CDI или ManagedProperty), о которых я должен знать? – simono71

+0

Это кажется излишне сложным. Просто используйте '@ Named' и' @ Inject' таким же образом.CDI предлагает только дополнительное преимущество, заключающееся в том, что приемник не обязательно должен иметь одинаковую или более короткую область действия, чем инжектируемый объект (CDI действует именно как прокси). Кстати, если ваша конечная цель состоит в том, чтобы получить текущего пользователя непосредственно в качестве управляемого свойства, не имея свойства 'LoginController', просто используйте' @ManagedProperty ("# ​​{loginController.currentUser}") частный пользователь пользователя; '. – BalusC

+0

Удивительно, как бы я использовал '@ Inject', чтобы получить пользователя? Я думал, что должен использовать '@ Produces' и т. Д. – simono71