Java 测试用户是否通过JSP/SpringMVC登录

Java 测试用户是否通过JSP/SpringMVC登录,java,jsp,spring-mvc,jstl,jsp-tags,Java,Jsp,Spring Mvc,Jstl,Jsp Tags,使用Spring3MVC和JSP,我只想测试用户是否登录,目前我对使用SpringSecurity不感兴趣 <jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" /> <c:choose> <c:when test="myUser.loggedIn"> //dostuff </c:when> &l

使用Spring3MVC和JSP,我只想测试用户是否登录,目前我对使用SpringSecurity不感兴趣

<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语法来使用以不获取
jsp:useBean
抛出异常,我建议将登录检查移到控制器端,并在模型中是否存在“isLoggedIn”属性时进行视图测试

  • 控制器检查会话是否包含用户对象,向模型添加属性
    isLoggedIn
    ,值为
    true
    false
  • 视图中的逻辑在
    ${isLoggedIn}
    的值上分支

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

    这不是正确的方法,但事实上,您可以通过JSTL解决特定问题


    EL将透明地“抑制”潜在的NullPointerException,只返回false。

    解决方案的问题意味着,与页面相关联的每个控制器都有在该逻辑上分支的逻辑(实际上,每个页面都至少有一个组件,需要用户名等)需要在模型中包含它,所以基本上控制器每次都必须包含它,这意味着可能更容易直接从视图中访问它,这实际上是一样的,这将是一个首选参数。我同意,如果不是每个页面都会出现这种情况,如果其他人编写了控制器方法,而他们忘记了包括用户登录状态、姓名、昵称等,那么就会抛出异常,如果我要走这条路,我想让它成为默认行为。你不必在控制器中这样做。您还可以让servlet过滤器来完成这项工作。拦截器对于从多个控制器将公共逻辑应用于ModelAndView非常有用。或者您可以有一个基本控制器类。不管怎样,你都有这个问题,不是吗?在原始方法中,每个视图都需要相同的样板代码来检查会话。至少您应该考虑将此代码放在一个地方,这样,如果您更改了用户的存储位置,就不必更改每个视图。假设我将myAppUser的名称更改为myAppUserManager,这是否使我更容易获得解决方案?我很抱歉,如果这是一个挫折,它不是,只是试图得到一个答案,通过在我的用户对象上放置“isLoggedIn”,我可以稍后更改该方法,这将是它需要更改的地方这是我想要的,但我不知道如何做,你所描述的实际上正是我正在做的。。myAppUser对象是我的业务用户代码的一个复合对象,我想控制它何时被实例化以及如何实例化,如果你重新阅读这个问题,你会发现我所要求的是你所描述的,但问题是我不确定如何实现它。您还会注意到,您的psuedo解决方案也存在同样的问题,如果我需要说注销(用户),用户来自哪里?没有
    logout(用户)
    ,只是
    logout()
    UserManager
    本身已经将登录的
    User
    作为属性引用,由
    login(User)
    传入。你是说UserManager,我刚才称它为User,但它们是一样的,我的控制器发出一个服务调用,返回用户对象,该对象中包含业务代码,用于抽象当前的内容“已登录“事实上,这意味着很多其他事情,我想我可以称之为经理,但我的问题仍然是完全一样的。管理器可能尚未定义,因为如果他们尚未登录,则创建管理器并将其放置在会话中的代码尚未运行。听起来您的意思是在spring配置中创建会话范围的bean在我的示例中,
    UserManager
    始终被创建并显示,无论用户是否登录。否则,完全不需要创建
    jsp:useBean
    。我将更新我的答案,以包含一个替代示例。“他总是创建一个用户管理器”这正是我想看到的,谢谢!
    <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>
    
    <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>