Подтвердить что ты не робот

Передача атрибута модели при перенаправлении в spring MVC и избегая того же в URL-адресе

Я новичок в Весне
Я также просматривал веб-страницы и связанные с ними сообщения в stackoverflow. Я не нашел тот, который мне действительно нужен.
Моя цель - передать атрибуты модели с контроллера на страницу jsp во время перенаправления и избежать отображения атрибута в URL-адресе.
Ниже приведена проверка входа в систему из хранилища данных с помощью jdo.

Мой контроллер:

@Controller
public class LoginController {
    int count;
    PersistenceManager pm = PMF.get().getPersistenceManager();

    //Instance of data class
        User user;
    ModelAndView modelAndView=new ModelAndView();

    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public ModelAndView loginValidate(HttpServletRequest req){

        //Getting login values
        String uname=req.getParameter("nameLogin");
        String pswd1=req.getParameter("pswdLogin");
        count=0;


        user=new User();

        //Generating Query
        Query q = pm.newQuery(User.class);
        q.setFilter("userName == userNameParam");
        q.declareParameters("String userNameParam");

        try{
            List<User> results = (List<User>) q.execute(uname);  
            for (User u: results) {

                String userName=u.getUserName();

                if(userName.equals(uname)){

                    System.out.println(u.getPassword());

                    if(u.getPassword().equals(pswd1)){
                        count=count+1;
                        modelAndView.setViewName("redirect:welcome");
                        modelAndView.addObject("USERNAME",uname);
                        return modelAndView;

                    }
         //rest of the logic 
    }

JSP:

 <h1>Welcome ${USERNAME} </h1>

Мой URL-адрес /welcome?USERNAME=robin
Моя цель - показать его /welcome
Кроме того, моя страница должна отображать "Welcome robin", тогда как на ней отображается только приветствие. Пожалуйста, дайте мне знать, как я могу это решить.
Заранее спасибо!

4b9b3361

Ответ 1

Вы должны использовать средство атрибута flash Spring MVC. Когда вы хотите, чтобы данные были доступны после перенаправления, вы не добавляете их в модель (Model, ModelMap или ModelAndView), а в RedirectAttributes, которые вы получаете как параметр в своем методе контроллера.

@RequestMapping(value="/Login",method = RequestMethod.POST)
public ModelAndView loginValidate(HttpServletRequest req, RedirectAttributes redir){
...

    modelAndView.setViewName("redirect:welcome");
    redir.addFlashAttribute("USERNAME",uname);
    return modelAndView;
}

Эти flash-атрибуты передаются через сеанс (и уничтожаются сразу после их использования). Подробнее см. в справочном руководстве Spring). Это имеет два интереса:

  • они не отображаются в URL
  • Вы не ограничены строкой, но можете передавать произвольные объекты.

Ответ 2

Вы должны быть осторожны здесь, потому что я думаю, что вы пытаетесь сделать, не поддерживается по уважительной причине. Директива "перенаправить" выдаст вашему контроллеру запрос GET. Запрос GET должен получать только существующее состояние с использованием параметров запроса, это контракт метода. Этот запрос GET не должен полагаться на предыдущее взаимодействие или на любой объект, который хранится где-то в сеансе в результате этого. Запрос GET предназначен для извлечения существующего (сохраняемого) состояния. Ваш исходный запрос (POST) должен был сохранить все, что вам нужно, GET, чтобы получить состояние.

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

Ответ 3

Все объекты, которые отправляются с использованием переадресации, могут быть переданы в самом URL-адресе из контроллера как -

String message = "Hi Hello etc etc"
return new ModelAndView("redirect:" + "welcome", "message", message);

Эта переменная сообщения будет доступна в URL как запрос GET -

http://localhost:8080/Demo/welcome?message=Hi Hello etc etc

Теперь вы можете получить доступ к переменной на своем JSP через Scriptlet -

<%= request.getParameter("message") %>