2016-04-07 6 views
2

Я использую Spring 4.1.1. И я должен выполнить обслуживание пользовательской сессии. Каков наилучший способ хранения связанных с сеансом данных пользователя? Я читал так много, но я не понимаю, какой путь является правильным?правильно использовать сеанс весной mvc

это пример того, что мне нужно

@Controller 
@SessionAttributes("user") 
public class PagesController { 
@RequestMapping(value="/sign_in", method = RequestMethod.POST) 
public String getSignIn(@RequestParam(value="user")String user , 
         @RequestParam(value="pass")String password, 
         Model model) { 
    UserDAO dao = new UserDao(); 
    if(dao.isUserValid(user,password) && !model.containsAttribute("user")){ 
     User user = new User(); 
     model.addAttribute("user",user); 
     return USER_PAGE; 
    } 
    return LOGIN_PAGE; 
} 

}

+0

Можете ли вы объяснить, что вы уже пробовали, и каковы были недостатки в этом? –

+0

Я пытаюсь использовать аннотацию @SessionAttributes и хранить данные в классе Model, например. model.setAttribute ("ObjName", объект); или использовать класс ModelAndView ... Но я слушаю, что это нехорошо ... В нашем проекте у нас нет народов, которые работали с весной, и я не могу спросить кого-то – dzrkot

+0

Можете ли вы разместить какой-то код в своем главном посте, который будет помогите лучше понять. –

ответ

1

Прежде всего, сессия Атрибут не является хорошим вариантом для хранения вашего пользовательский объект. Именно весна решает, когда нужно очистить данные атрибута сеанса. Согласно весенней документации весна удаляет атрибут сеанса, когда он понимает, что «разговор» завершен. Вы используете только атрибут сеанса, когда находитесь в области контроллера, и данные временно необходимы для хранения в сеансе.

Что касается объекта входа в систему, то вам нужно использовать http sesison. При входе/входе в приложение вы фактически отправляете учетные данные для входа в контроллер. После проверки вы помещаете объект пользователя (с вашей необходимой информацией - как можно меньше - на объект и сохраняете его на своем сеансе). Этот объект будет оставаться до тех пор, пока он не истечет, или вы очистите его, когда пользователь выйдет из системы.

Кроме того, если вы все еще хотите использовать SessionAttribute для хранения своего пользовательского объекта. Тогда может возникнуть дополнительная проблема при развертывании приложения в кластерной среде. Ваш сеанс должен быть скопирован на каждый экземпляр вашего сервера, если вы не выполните липкий сеанс. Копирование httpsession является самой простой задачей, тогда как копирование одного и того же экземпляра атрибута sessionAttribute не выполняется.

@RequestMapping(value = "login.html", method = RequestMethod.POST) 
    public ModelAndView post(@ModelAttribute("login") LoginEntity login, HttpServletRequest req) { 


... process the data ... 
if passed put it into session: 

HttpSession session = req.getSession(true); 
UserObject userObject=new UserObject(); 
userObject.setName(login.getUserName()); 
... 

session.setAttribute("user",userObject); 
1

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

Другой способ сделать это - поместить некоторую пользовательскую информацию в файлы cookie с некоторым шифрованием и валидацией, но просто не забудьте не добавлять слишком много информации в файлы cookie, потому что куки будут отправляться каждый раз, когда выполняется запрос или ответ. Если есть много информации для отправки, это замедлит время отклика.

И как раз напоминание, вы должны вызвать status.setComplete() для очистки атрибутов внутри сеанса, когда они не нужны.

Does SessionStatus object.setComplete() clears all the session attributes or just work for the controller in which it is used?

и если вы не знаете, как использовать его, вы можете увидеть статью ниже

http://vard-lokkur.blogspot.tw/2011/01/spring-mvc-session-attributes-handling.html

+0

Если я сохраню JSESSIONID в модели, как я могу удалить определенный JSESSIONID, когда сессия будет завершена? Я могу установить таймаут somwhere, или я должен отслеживать его в моем коде в каком-то потоке? – dzrkot

+0

сеанс. недействительными() –

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