思路说明:首先创建一个map,因为map是不可重复的键值对。使用登录用户的id作为key,当用户登录的时候,就产生一个session作为value。将其保存一起。此时改账号在别处登录的时候,会产生一个相当的key,但是不同的value。这是使用拦截器写代码清楚上一次的map。然后保存这一次的。这样已登录的用户就会被当前用户挤下来。
核心代码如下:
1.登录的时候创建map
ServletContext application=request.getSession().getServletContext();
String userIdSession = String.valueOf(user.get(0).getUserid());
@SuppressWarnings("unchecked")
Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
if(loginMap==null){
loginMap = new HashMap<String, String>();
}
loginMap.put(userIdSession,request.getSession().getId());
application.setAttribute("loginMap", loginMap);
2.写一个全局拦截器,实现Filter接口,在doFiter方法里面写如下代码
// 获取request
HttpServletRequest request=(HttpServletRequest)args0;
SessionInfo sessionInfo=SessionHelper.getSessionInfo(request);
SessionInfo adminSession = SessionHelper.getAdminSessionInfo(request);
HttpServletResponse response=(HttpServletResponse)args1;
String uri = request.getRequestURI();
if(uri.indexOf("login")!=-1 || uri.indexOf("changeImage")!=-1){
chain.doFilter(request, response);
return;
}
//前台同时只能一个账号在线
ServletContext application=request.getSession().getServletContext();
Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
if(loginMap!=null && !StringUtils.isNull(sessionInfo)){
for(String key:loginMap.keySet()) {
if (String.valueOf(sessionInfo.getUser().getUserid()).equals(key)) {
if(!request.getSession().getId().equals(loginMap.get(key))) {
String content_path = request.getContextPath();
request.removeAttribute("loginMap");
response.sendRedirect(content_path+"/visitor/users/login.do?flag=VALID");
System.out.println(content_path+"/visitor/users/login.do?flag=VALID");
return;
}
}
}
}
3.web.xml里面配置
<listener>
<description>spring监听器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener </listener-class>
</listener>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecurityInvalidate</filter-name>
<filter-class>com.project.filter.EmallAntiSqlInjectionfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecurityInvalidate</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>