Можем ли мы быть уверены в том, что Spring и JSF или какая-либо инъекция bean-компонентов фреймворка видима и безопасна с точки зрения публикации?
Допустим, 10 запросов поступило на сервер Tomcat.
И сказать теоретически, что сервер Tomcat обрабатывает такие запросы
private static final Executor exec = Executors.newFixedThreadPool(10);
ServerSocket socket = new ServerSocket(80);
while (true) {
exec.execute(() -> handleTheRequest(socket.accept());
}
Вот xhtml для представления. Пожалуйста, представьте, что <и> добавлены и добавлены к каждой строке. Stackru не позволяет им
h:inputText value="#{login.username}"/
h:inputSecret value="#{login.password}"/
h:commandButton action="#{login.validateLogin}" value="Log in"/
Вот также соответствующие части кода для Login ManagedBean, LoginDao и RootContextConfiguration
@ManagedBean
public class Login implements Serializable {
@ManagedProperty("#{loginDao}")
private LoginDao loginDao;
public void setLoginDao(LoginDao loginDao) {
this.loginDao = loginDao;
}
// ... the password and username field and getter/setter are excluded but
//pretend they are here
}
@Component
public class LoginDao {
@Autowired
private JdbcTemplate jdbcTemplate;
// do something with the jdbcTemplate
}
@Configuration
@ComponentScan(basePackages = "com.augment")
@PropertySource("classpath:config.properties")
public class RootContextConfiguration {
@Bean
public BasicDataSource basicDataSource() {
final BasicDataSource ds = new BasicDataSource();
//ds.set(relevantStuff)
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(basicDataSource());
}
}
Так что же теперь происходит в одной из тем, когда мы отправляем какую-либо форму, нажав кнопку "Войти"? Это процесс, который идет мне в голову, и поэтому использование @Managedbean и @managedproperty или любого другого типа инъекций (включая @Autowired) может не быть потокобезопасным и не быть полностью видимым для потока, который обрабатывает запрос, а также для других потоков этот поток обработки запросов может появиться. Однако, пожалуйста, поправьте меня, если это не так.
- Во-первых, к моменту нажатия кнопки входа в систему уже есть отдельный поток, который берется из пула потоков для обработки запроса, вызвав exec.execute(() -> handleTheRequest(socket.accept()), так как клиент должен был установить сокетное соединение, чтобы даже нажать кнопку входа в систему.
- Внутри этого потока уже есть управляемый экземпляр (класса Login) в памяти, для которого будут заданы имя пользователя и пароль независимо от того, какое поле h:inputSecret установлено, а также вызовет login.validateLogin при нажатии кнопки "Вход в систему".,
А теперь интересная часть. HandleTheRequest делает что-то подобное эффективно. Некоторые псевдокод включены
handleTheRequest() {
//these next lines below correspond to Step 2 until line X Login login; if (Login.isRequestScoped) { login = new Login(); } else { login = JSFContainer.getBean(Login.class); } LoginDao loginDao = JSFContainer.getBean(LoginDao.class); // since its a managed property login.setLoginDao(loginDao); // Line X: // possibly new threads created and used that uses these // login and loginDao object references }
Отсюда каким-то образом устанавливаются значения для входа в систему, когда пользователь вводит что-то в поля ввода, и инфраструктура также заботится о том, что происходит при нажатии кнопки отправки.
Однако что, если эти поля ввода и логика отправки в приведенном выше комментарии происходят в разных потоках, которые ссылаются на эти объекты login и loginDao?
Могут ли они увидеть, что ссылка для входа в систему хороша, но поля в них пусты, поскольку логин мог быть опубликован неправильно? Объект входа не был создан с использованием конструктора с последним полем LoginDao, поэтому loginDao может быть нулевым для других потоков при публикации через объект Login. Эта идея сводится к loginDao, поскольку, хотя loginDao внутри Login может не быть нулевым для других потоков, JdbcTemplate внутри LoginDao может быть. Это может пойти еще дальше, когда basicDataSource jdbcTemplate может быть нулевым.
Можем ли мы доверять этой Spring of Jsf или какой-либо другой среде, которая заботится об этих вещах?