Как сделать резьбу для пружин jsp безопасной? - PullRequest
1 голос
/ 23 августа 2011

У меня есть приложение jsp (использующее Spring), которое использует несколько глобальных переменных.Однако мне нужно несколько человек, чтобы иметь возможность использовать эту программу одновременно.Каков наилучший способ сделать его поточно-ориентированным, чтобы каждый экземпляр программы не зависел от других?

:: EDIT :: Я в порядке, если я просто не использую какие-либо одноэлементные объекты

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Каждый запрос обрабатывается в своем собственном потоке. Этими потоками управляет контейнер сервлета. Не рекомендуется использовать статические глобальные переменные в сервлете. Все переменные экземпляра являются общими для всех потоков, поэтому это может привести к неоднозначному состоянию.

Я рекомендую сохранять информацию этого типа в переменной области (приложение, сеанс, запрос, страница и т. Д.).

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

2 голосов
/ 23 августа 2011

В типичном контейнере используется модель потока на запрос, поэтому у вас встроена легко распознаваемая граница. Общее правило - никогда не сохранять состояние в каком-либо объекте, который виден нескольким запросам (потокам), если только государство эффективно неизменным. Например, одноэлементный контроллер, подобный этому

@Controller
@RequestMapping("/schedule")
class MyController {
    private Scheduler scheduler;

    @RequestMapping(method = RequestMethod.POST)
    public void scheduleSomething(Foo foo) {
        scheduler.schedule(foo);
    }
}

является состоящим - поле расписания содержит состояние - но состояние инициализируется при запуске и остается постоянным во всех запросах / потоках. Если у вас был такой одноэлементный контроллер, с другой стороны:

@Controller
@RequestMapping("/schedule")
class MyController {
    private Scheduler scheduler;
    private Foo foo;

    @RequestMapping(method = RequestMethod.POST)
    public void scheduleSomething(Foo foo) {
        this.foo = foo;
        scheduler.schedule(this.foo);
    }
}

Это абсолютно небезопасно для одновременного доступа, потому что все запросы поступают на один и тот же контроллер, и foo будет постоянно меняться не потокобезопасным способом. Следуйте этой линии рассуждений через все ваше приложение, и вы будете в безопасности.

...