繁体   English   中英

测试是否通过JSP / Spring-MVC登录用户

[英]Testing if a User is Logged in Via JSP/Spring-MVC

使用Spring 3 MVC和JSP,我只想测试用户是否已登录,我对目前使用Spring Security不感兴趣

<jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" />
<c:choose>
    <c:when test="myUser.loggedIn">
        //dostuff
    </c:when>
    <c:otherwise>
        //dootherstuff
    </c:otherwise>
</c:choose>

但问题是,当会话中还没有myAppUser时,jsp:useBean会抛出异常。 现在我意识到我可以拥有JSP:useBean实际上通过给它一个类来实例化该对象,但是我不想知道某个JSP片段中的某个地方我将对象实例化并添加到我的会话中,所以我要么总是为该用户设置一个初始值,并以编程方式控制它,或者我想要一种方法来获取允许它为null或不存在的bean,如果它不存在则返回null

无论哪种方式都没关系

如果我的问题指向我应该做的事情的根本误解,请提供一个文档的链接,将彻底解释这个用例

这不是正确的方法,但实际上您可以使用JSTL <c:catch>解决特定问题。

<c:catch var="e">
    <jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" />
</c:catch>
<c:choose>
    <c:when test="${empty e && myUser.loggedIn}">Logged in</c:when>
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise>
</c:choose>

在回答matt b时描述了正确的方法。 你真的需要在更高的层次上解决它。 有一个像UserManager这样的bean,它有一个User作为子属性,有几个方法,比如login(User)logout()isLoggedIn() 如果用户已登录,则User应该是非空的。 当用户注销时, User应该设置为null。


根据评论进行更新 :作为替代方案,您还可以删除整个jsp:useBean声明并拦截会话中注入${myUser}的MVC框架。

<c:choose>
    <c:when test="${myUser.loggedIn}">Logged in</c:when>
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise>
</c:choose>

EL将透明地“抑制”潜在的nullpointerexceptions并返回false。

测试“这个人登录了吗?” 通过检查View类中的Session对象,模糊了Model,View和Controller的角色之间的界限。

无论找出正确的JSTL语法来使用jsp:useBean不会抛出异常,我建议将登录检查移到控制器端,如果模型中存在“isLoggedIn”属性,则进行视图测试。

  1. Controller检查会话是否包含用户对象,将属性isLoggedIn添加到模型中,其值为truefalse
  2. 视图中的逻辑分支为${isLoggedIn}的值。

换句话说,该视图应被检查对属性/数据模型,而不是直接访问会话或其他状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM