Java用Filter制作登录限制-踢下线防踢等

Hello, 我是Shendi, 这次我给大家带来了 JavaWeb登录 限制登录 防踢  挤下线的功能实现

如题,很简单,我们需要编写一个Filter,就叫LoginFilter  实现javax包下的Filter接口,并且 实现方法

public class LoginFilter implements Filter {
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
	}
}

在web.xml中配置Filter 过滤器(或者用注解的方式)

filter-class是对应的类 在Eclipse中写好后按Ctrl+鼠标左键能点进此类的话则没问题
<filter>
  	<filter-name>LoginFilter</filter-name>
  	<filter-class>shendi.filter.LoginFilter</filter-class>
</filter>
这里的filter-name与上面定义的要一致 url-pattern是映射的路径 /是所有,也就代表了这个项目的所有路径都会执行这个filter
<filter-mapping>
  	<filter-name>LoginFilter</filter-name>
  	<url-pattern>/</url-pattern>
</filter-mapping>

配置好后现在就可以写功能了

首先,我们要限制登录的话则需要判断用户是否登录没,这里就需要用到 session

在用户登录成功后将 account存入 session

req.getSession().setAttribute("account", value);

这样, 我们就能很简单在过滤器中判断 是否有此session 如果没有就代表没有登录

public class LoginFilter implements Filter {
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String account = (String) req.getSession().getAttribute("account");
		if (account == null) {
			System.out.println("您没有登录,请登录!");
			return;
		}
		//放行
		chain.doFilter(request, response);
	}
}

这样就实现了限制登录

但是 如果想要实现有两个用户用同一个账号登录,先登录的应该被挤下线或者后登陆的登录不上则这样达不到效果

因为用的是session,所以每个用户的session中都会有个sessionid, 要实现踢下线或者防踢的效果则 

要实现挤下线的效果:使用一个HashMap<String,String>,利用HashMap的唯一性,登录后将key(账号),value(sessionid)添加进HashMap,然后只需要在LoginFilter中判断此账号对应的sessionid是否相同,不相同则重新登录.

//登陆的类 登录操作 将账号和sessionId保存到map中
String account = 用户的账号;
String sessionId = request.getSession().getId();
map.put(account,sessionId);

//LoginFilter中 实现挤下线的代码
private static HashMap<String,String> map = new HashMap<String,String>();
public static HashMap<String,String> getMap() {
	return map;
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		//先判断是否登录了
		String account = (String) req.getSession().getAttribute("account");
		if (account == null) {
			System.out.println("您没有登录,请登录!");
			return;
		}
		String mapSessionId = map.get(account);
		//如果map里没有Sessionid则放行
		if (mapSessionId == null) {
			chain.doFilter(request, response);
			return;
		}
		String sessionId = req.getSession().getId();
		//判断Sessionid是否相同 不同则代表被挤出
		if (!mapSessionId.equals(sessionId)) {
			System.out.println("您的账号已被他人登录,请重新登录!");
			return;
		}
		//放行
		chain.doFilter(request, response);
	}

 要实现防挤的效果:使用HashMap<String,String>,在用户登录的时候直接判断是list里是否有此账户,有的话则不予登录,不需要在过滤器中进行操作了.因为简单,这里就不列代码了

上面只列出简单的用法的代码,如果 对你有帮助的话,点个赞再走吧~

发布了38 篇原创文章 · 获赞 23 · 访问量 9067

猜你喜欢

转载自blog.csdn.net/qq_41806966/article/details/102887220