用个HashMap来记录在线用户,使用struts2的过滤器来判断是不是最后登录的用户(只允许最后登录的用户进行操作),是则放行,不是则跳到登陆界面。
pojo类:
public class User {
private String user;
private String pass;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}在线用户类:
import java.util.HashMap;
import java.util.Map;
public class OnLineUser {
private static Map<String,String> users = new HashMap<String,String>();
public static void putUser(String user, String sessionId) {
users.put(user, sessionId);
}
public static boolean isMyLogin(String user, String sessionId) {
String _sessionId = users.get(user);
if (_sessionId != null && _sessionId.equals(sessionId)) {
return true;
}
return false;
}
public static boolean removeUser(String user, String sessionId) {
String _sessionId = users.get(user);
if (_sessionId.equals(sessionId)) {
users.remove(user);
return true;
}
return false;
}
}过滤器(检查是否登录,以及是否是最后登录此帐号的用户):
package com.action.Interceptor;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.action.UserAction;
import com.bean.User;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.tools.OnLineUser;
public class OneUserLoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
Map session = invocation.getInvocationContext().getSession();
User user = (User) session.get("userInfo");
String actionName = invocation.getInvocationContext().getName();
if ("login".equals(actionName) || "logout".equals(actionName)) {
// 如果是login或logout则放行
return invocation.invoke();
} else {
if (s_toperator != null) {
if (OnLineUser.isMyLogin(user.getUser(), ServletActionContext
.getRequest().getSession().getId())) {
// 该user的sessionId没有变过,是该用户最后登录的用户
return invocation.invoke();
}
// 如果sessionId已经改变过,则表示该用户在别处登录过(只允许最后登录的在线)
session.remove("userInfo");
UserAction userAction = (UserAction) invocation.getAction();
userAction.addFieldError("user", "抱歉,您的帐号已在别处登录");
return "toLogin";
}
UserAction userAction = (UserAction) invocation.getAction();
userAction.addFieldError("user", "抱歉,登录超时");
return "toLogin";
}
}
}struts2 action:
package com.action;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.bean.User;
import com.opensymphony.xwork2.ModelDriven;
import com.service.UserService;
import com.tools.Encrypt;
import com.tools.OnLineUser;
@Controller("userAction")
@Scope("prototype")
public class UserAction extends BaseAction implements ModelDriven {
@Autowired
private UserService userService;
private User user = new User();
public String login() {
// MD5加密,如果不需要请忽略
String md5UserPass = Encrypt.encodeMD5(toperator.getUser(),
toperator.getPass());
if (md5UserPass == null) {
this.addFieldError("user", "请输入用户名和密码");
} else {
User db_user = userService.login(User.getUser(), md5UserPass);
if (db_user != null) {
session.put("userInfo", db_user);
// 记录当前用户的 sessionId
OnLineUser.putUser(db_user.getUser(), ServletActionContext
.getRequest().getSession().getId());
return "login_success";
}
this.addFieldError("user", "用户名或密码错误");
}
return "toLogin";
}
public String logout() {
User s_user = (User) session.get("userInfo");
if (s_user != null) {
OnLineUser.removeUser(s_user.getUser(), ServletActionContext
.getRequest().getSession().getId());
session.remove("userInfo");
}
return "toLogin";
}
public String test() {
return "isLogin";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return this.user;
}
}struts配置文件:
<span style="white-space:pre"> </span><package name="default" namespace="/" extends="json-default">
<interceptors>
<interceptor name="onUserLoginInterceptor" class="com.action.Interceptor.OneUserLoginInterceptor"></interceptor>
<interceptor name="authInterceptor" class="com.action.Interceptor.AuthInterceptor"></interceptor>
<interceptor-stack name="onUserLogin">
<interceptor-ref name="onUserLoginInterceptor" />
<interceptor-ref name="authInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="toLogin">
<param name="namespace">/</param>
<param name="location">/index.jsp</param>
</result>
</global-results>
</package><span style="white-space:pre"> </span><package name="user" namespace="/user" extends="default">
<action name="*" class="userAction" method="{1}">
<interceptor-ref name="onUserLogin" />
<result name="login_success">/WEB-INF/pages/main.jsp</result>
<result name="input">/debug.jsp</result>
<result name="isLogin">/WEB-INF/pages/main.jsp</result>
</action>
</package>
该博客介绍了如何在SSH框架下实现单用户登录功能,通过使用HashMap存储在线用户,并利用Struts2过滤器检查请求用户是否为最后登录的用户。如果用户合法,则允许操作,否则重定向至登录页面。
1177

被折叠的 条评论
为什么被折叠?



