我有一个带有范围注释的简单控制器。
@Controller
@Scope("session")
@RequestMapping("/")
public class HelloController {
private User user = new User("Bob");
@RequestMapping(method = RequestMethod.GET)
public String printWelcome() {
return "hello";
}
}
和简单的jsp页面
<html>
<body>
<h1>Y=${sessionScope.user}</h1>
<h1>Z=${user}</h1>
</body>
</html>
但当我试图运行这段代码时,我一无所获。结果为空。我不想使用用户的单个bean,也不想将HttpSession的对象传递给controller中的方法或HttpServletRequest对象,以从中检索会话。使用一些注释(SessionAttributes除外)从我的控制器向jsp传递对象,有什么解决方案吗?
我不明白你为什么感到惊讶。您的代码中唯一位于Http会话
中的东西是@Controller
bean。
仅仅因为该对象有一个类型为User的字段,并不意味着在HttpSession中会有一个User属性。
结果是空的。我不想使用User
的单个bean,也不喜欢将HttpSession
的对象传递给控制器中的方法或HttpServletRequest
对象以从中检索会话。有没有什么解决方案可以使用一些注释(除了@SessionAttie tes
)从我的控制器将对象传递给jsp?
您基本上已经列出了所有选项。使用其中任何一种。
HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须
在用户登录时续订HTTP会话是常见的最佳做法。这将强制使用新的会话ID,从而避免会话固定漏洞。 当涉及@SessionScoped bean时,是否有使用CDI实现此功能的首选模式?困难在于,通过使当前HTTP会话无效,您将在下一个请求中获得不同的会话范围bean,但直到下一个请求。 例如,假设一个用于存储用户登录信息的会话bean: 和另一个用于管理登录的bean: 对于托管Bean,这将检索一
问题内容: 一个标准的案例-你有一个带有的控制器()。 通常希望实现会话中放置的类,以便在重新启动服务器的情况下可以物理存储它们,例如 如果控制器实现,这意味着它引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,并引用事务管理器,实体管理器工厂等。 某些服务,甚至控制器,都不太可能通过实现实现对的引用,因此这可以有效地意味着整个上下文都已序列化。并且考虑到它拥有许多连接-即
为了一致性和简单性,我想在我的控制器周围传递一个会话范围的域bean,但这似乎不可能。希望有人能提出建议。 问题:会话范围的bean可以作为MVC控制器参数公开吗 这里似乎有一个注释:@SessionAttributes(“myBean”),但是它只维护一个控制器级别的作用域。 我希望避免与HttpSession交互,而是通过控制器一致地传递域对象图。这似乎是一个相当标准的要求。 这有以下好处:
编辑:下面是LatherupApplication应用程序类: 下面是我家控制器: 下面是pom.xml文件: 下面是home.jsp: 应用程序.属性: