SSH 单用户登录功能

该博客介绍了如何在SSH框架下实现单用户登录功能,通过使用HashMap存储在线用户,并利用Struts2过滤器检查请求用户是否为最后登录的用户。如果用户合法,则允许操作,否则重定向至登录页面。

用个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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值