Java 控制器中的会话属性为null,但在jsp中它具有值

Java 控制器中的会话属性为null,但在jsp中它具有值,java,spring,jsp,session,model-view-controller,Java,Spring,Jsp,Session,Model View Controller,这是一个控制器登录操作 @RequestMapping(value = "/login_action") public ModelAndView login_action(@RequestParam("email") String email,@RequestParam("password") String password,RedirectAttributes redir){ ModelAndView model=new ModelAndView("WEB-IN

这是一个控制器登录操作

    @RequestMapping(value = "/login_action")
    public ModelAndView login_action(@RequestParam("email") String email,@RequestParam("password") String password,RedirectAttributes redir){
        ModelAndView model=new ModelAndView("WEB-INF/view/index");
        Configuration con = new Configuration().configure().addAnnotatedClass(Users.class);
        SessionFactory sf=  con.buildSessionFactory();
        Session session = sf.openSession();
        Query q=session.createSQLQuery("SELECT User_ID,User_First_Name,User_Last_Name,Email,User_Type,Program,Level,Gender FROM Users  WHERE Email=:email AND Password=:password");
        q.setParameter("email",email);
        q.setParameter("password",password);
        Object u = (Object) q.uniqueResult();
        if(u==null) {
            model.addObject("view","login");
            model.addObject("errorMsg","Incorect Email or Password");
        }else {
                model=new ModelAndView("redirect:/profile");
                redir.addFlashAttribute("user",u);
        }
        return model;
    }
它将用户设置为会话,并在匹配电子邮件和密码后重定向到配置文件

    @RequestMapping(value="/profile")
    public ModelAndView profile(HttpSession session){
        Object [] o=(Object[])session.getAttribute("user");
        if(o==null){
            ModelAndView model =new ModelAndView("redirect:/login");
            return model;
        }
        ModelAndView model=new ModelAndView("WEB-INF/view/index");
        model.addObject("title",o[1]+" "+o[2]+" - Profile");
        model.addObject("view","profile");
        return model;
    }
当它被重定向到配置文件时,用户属性为空。所以它重定向到登录,即使我已经在会话中设置了用户

    @RequestMapping(value="/login")
    public ModelAndView login(){
        ModelAndView model=new ModelAndView("WEB-INF/view/index");
        model.addObject("title","Login");
        model.addObject("view","login");
        return model;
    }
但在myheader.jsp中,用户是在会话中设置的

    <c:choose>
    <c:when test="${user!=null}">
        <a>
            Welcome, ${user[1]} ||<a href="profile">profile</a></a> <a href="logout"/>Logout</a>
        </div>
    </c:when>
    <c:otherwise>
        <div>
            <a href="/"/>Home</a>||<a href="login"/>Login</a>||<a href="signup"/>Sign Up</a>
        </div>
    </c:otherwise>
    </c:choose>
    <hr>

||||

但是,当我点击链接到个人资料,它的工作 为什么? 登录页面:-

登录后,页面被重定向到配置文件并再次登录,因为用户在控制器中为空 但是页眉会改变,因为在jsp中,user中有值

当我点击profile时,它就工作了


您没有在会话中添加任何内容,而是在flash属性中添加了一些内容。但在jsp中,它正在从会话打印用户名。不,不是。它从flash变量中打印用户,这些变量在重定向后被添加为请求属性。在执行类似于
${user.property}
的操作时,首先检查请求范围、页面范围、会话范围,最后检查应用程序范围(检查servlet规范)。然后,请解释为什么在登录后单击配置文件时,它没有重定向到登录页面。如果用户为null或未设置,则配置文件控制器应重定向到登录页面,因为会话中没有任何内容。。。