在Spring MVC中重定向期间传递模型属性,并在URL中避免相同

Cha*_*dni 23 java redirect jsp spring-mvc

我是Spring的新手
我也在stackoverflow中搜索过web和相关帖子.我找不到我真正需要的那个.
我的目标是在重定向期间将模型属性从控制器传递到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 
    }
Run Code Online (Sandbox Code Playgroud)

JSP:

 <h1>Welcome ${USERNAME} </h1>
Run Code Online (Sandbox Code Playgroud)

我的URL是/welcome?USERNAME=robin
我的目标是将其显示为/welcome
此外,我的页面应该显示"欢迎知识",而它只显示欢迎.请让我知道如何解决它.
提前致谢!

Ser*_*sta 61

您应该使用Spring MVC 的flash属性工具.如果希望在重定向后可以访问数据,则不要将其添加到模型(__CODE__,__CODE__或__CODE__)中,而是添加到__CODE__控制器方法中作为参数获取的数据.

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

    redirectView= new RedirectView("/foo",true);
    redir.addFlashAttribute("USERNAME",uname);
    return redirectView;
}
Run Code Online (Sandbox Code Playgroud)

这些flash属性通过会话传递(并在使用后立即销毁 - 有关详细信息,请参阅Spring参考手册).这有两个好处:

  • 它们在URL中不可见
  • 您不限于String,但可以传递任意对象.

  • 但是,如何从JSP页面访问值呢? (2认同)

Dha*_*rNz 6

你需要在这里小心,因为我认为你想要做什么并不是有充分理由支持的.在"重定向"指令将发出GET请求控制器.的GET请求只应使用请求参数检索现有状态,这是该方法的合同.该GET请求不应该依赖于先前的交互,也不应该依赖于存储在会话中的某些对象的任何对象.GET请求旨在检索现有(持久)状态.您的原始(POST)请求应该保留您需要的所有内容GET请求以检索状态.

在这种情况下,RedirectAttributes并不是为了支持你而设计的,即使你设法正确使用它,它也只能工作一次,然后它们就会被销毁.如果您随后刷新浏览器,则会出现应用程序错误,因为它无法再找到您的属性.