2013-04-04 40 views
1

我使用Struts2框架。在jsp中,我在项目中显示了一个登录框,当用户单击登录按钮时,我将一个名为“loggedin”的cookie设置为一个操作类中的值为“true”的cookie。如何检查用户是否登录或不在Java EE中

然后返回“成功”将再次加载此登录页面。

在登录页面:

<body> 
<% 
Cookie cookie[] = request.getCookies(); 
for(c : cookie) 
{ 
if(c.getName().equals("loggedin")) 
{ 
    if(!c.getValue().equals("true")) 
    { 

%> 
//show login form here. 

<% 

    }//end inner if 

    else //if cookie "loggedin" value is "true" 
    { 

%> 

//show username/profile picture/logout button here 

<% 
    }//end else 
}//end outer if 
}/end for loop 
%> 
</body> 

我有一个问题。当我点击登录表单中的登录按钮时,会设置一个cookie并重新加载页面。但是,而不是一个用户名/个人资料图片,登录表单仍然显示,直到我手动重新加载页面。

  1. 我该如何解决这个问题?
  2. 我认为这不是检查登录或不是正确的方式。有人可以告诉我如何以另一种方式检查此问题吗?
+0

与登录相比,您可能会考虑主动记录其他用户会话。难以跟踪登录信息,但设置“最后登录”以及cookie与身份验证匹配的散列是一种“简单”方法。 – 2013-04-04 01:20:27

+9

这在多个层面上是错误的。最简单的方法是将某个会话值设置为某个事物(比如说,一个“用户”对象),以表明存在已登录的用户,然后检查是否存在该值。 **使用JSTL,而不是SCRIPTLETS。** – 2013-04-04 02:34:03

+2

或Struts2标签和OGNL,而不是JSTL :) – 2013-04-04 09:35:13

回答

6

请!请 !不要使用scriptlets。他们很难维护,每个开发者都讨厌他们。

有很多方法可以跟踪会话。

  • 使用Cookie
  • URL重写
  • 隐藏PARAMS

这些都是很好的网络上documented。生成会话的最快方法是执行HttpSession session = request.getSession(true);。创建后,您可以继续将会话信息附加到此对象。

看一看JSTL primer并在why scriptlets are bad上咆哮。

4

在jsp中使用scriptlet永远不会被推荐。为什么你不使用struts标签或JSTL标签。 使用会话在每次成功登录时设置会话属性,并检查会话以及用于检查用户登录的特定属性。像:

//on successfull login... 
Session session=request.getSession(true); 
session.setAttribute("id",id); //here in place of id you can use something related to user, that can uniquely identify to each user. 


// now to check for user logged in or not 

Session session=request.getSession(false); 
// by providing false value it will try to access a session already available, but it won't create a new session. 
//now you can check like this.. 
if(session!=null) 
{if(((String)session.getAttribute("id")).equals(id)) 
    { 
    // do your stuffs here......... 
    } 

else 
    { 
    // you can send the control to login page or to somewhere else as your requirement. 
    } 



    } 

else{ 

// send the control to login page because session object is null... 
} 

而且最重要的是,不要把所有这些逻辑写在你的jsp中。 Jsp应该只放置视图逻辑。在struts中把所有的商业/主要逻辑放在Action类中。

+1

+1,但不需要getSession(false),然后检查会话是否为空...请参阅会话,if它是新的,该属性不会在那里,所以检查将工作相同(在你的情况下,你应该加倍你的其他部分,发送控制到登录页面,即使会话为空,不仅是当有效但用户没有登录) – 2013-04-04 09:37:50

+0

@AndreaLigios:其实有时候我正在使用,正如你所解释的,但我从未像你所描述的那样专注于差异。我知道了。谢谢你的建议。 – 2013-04-04 09:45:03

+0

@Andrea Ligios:请不要介意。同时考虑你的观点我有一个查询。 如果在某些时候,我们每次都会创建一个新会话,以便不必要地检查用户的会话,它会给服务器带来负担,因为每次它都会在每个用户/客户端/浏览器的服务器端创建一个会话对象。尽我所知,我们需要每次都使会话无效,否则在浏览器关闭或超时时会被销毁。请让我知道如果我错了或提供你的好建议。 – 2013-04-12 06:35:56