Я прихожу на 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, чтобы пользователь был доступен в других компонентах (т. Е. Сохранить идентификатор зарегистрированного пользователя в сеансе, а затем перезагрузить пользователя после доступа к переменная сеанса пользователя в разных компонентах)?
Я все об этом не так? Есть ли более простой способ, которого я пропускаю.
Спасибо ... Было бы лучше использовать CDI, т. Е. '@Produces @ UsrNode' в loginController, а затем' @UsrNode @ Inject'code в другом компоненте? Существуют ли какие-либо проблемы с производительностью при выполнении таких действий (с использованием CDI или ManagedProperty), о которых я должен знать? – simono71
Это кажется излишне сложным. Просто используйте '@ Named' и' @ Inject' таким же образом.CDI предлагает только дополнительное преимущество, заключающееся в том, что приемник не обязательно должен иметь одинаковую или более короткую область действия, чем инжектируемый объект (CDI действует именно как прокси). Кстати, если ваша конечная цель состоит в том, чтобы получить текущего пользователя непосредственно в качестве управляемого свойства, не имея свойства 'LoginController', просто используйте' @ManagedProperty ("# {loginController.currentUser}") частный пользователь пользователя; '. – BalusC
Удивительно, как бы я использовал '@ Inject', чтобы получить пользователя? Я думал, что должен использовать '@ Produces' и т. Д. – simono71