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里是否有此账户,有的话则不予登录,不需要在过滤器中进行操作了.因为简单,这里就不列代码了
上面只列出简单的用法的代码,如果 对你有帮助的话,点个赞再走吧~