在Struts2下使用[拦截器]配合[session监听器]实现在线会员统计与防止重复登录

在Struts2下使用[拦截器]配合[session监听器]实现在线会员统计与防止重复登录


需求:

1.管理员后台可显示当前在线访客数以及在线会员数(在线会员要求列出详细清单).

2.某个客户端非法退出(直接关闭浏览器或断电啥的)后,接着他重新登录系统.在线统计上要做到保持登录统计的准确性与完整性.

3.防止多个客户端同时使用一个帐户异地登录(后登录者踢掉先登录者,并通知先登录者被迫下线).

1.监听器SessionListener (web.xml的代码略)

Java代码

/**

* 创建session

   */

public void sessionCreated(HttpSessionEvent se) {

     OnlineStatistics.increase();

}

/**

* 服务器销毁session对象

*/

public void sessionDestroyed(HttpSessionEvent se) {

    OnlineStatistics.decrease();

}

/**

* 用户登录时

*/

public void attributeAdded(HttpSessionBindingEvent se) {

    if ("memberInfo".equals(se.getName())) {

        MemberInfo memberInfo = (MemberInfo) se.getValue();

         OnlineStatistics.addAttr(memberInfo);

         se.getSession().setMaxInactiveInterval(60 * 20);// 失效时间SEC * MINS

     }

}

/**

* 用户退出登录(销毁session属性时)

*/

public void attributeRemoved(HttpSessionBindingEvent se) {

     if ("memberInfo".equals(se.getName())) {

        MemberInfo memberInfo = (MemberInfo) se.getValue();

        OnlineStatistics.removeAttr(memberInfo); memberInfo = null;

    }

}

/**

* 待实现

*/

public void attributeReplaced(HttpSessionBindingEvent se) {

    //to be extended

}

2. 统计类OnlineStatistics

Java代码

/**

* @author Arantam

*/

package com.farago.util;

import java.util.Date;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import com.farago.vo.MemberInfo;

/**

* @author Arantam *

*/

@SuppressWarnings("unchecked")

public class OnlineStatistics {

    private static int count = 0;

    private static Set onlineMemberList = new HashSet();

    /**

      * 统计在线总数(递增)

      */

    public static void increase() {

        count++;

    }

   

    /**

       * 统计在线人数(递减)

       */

    public static void decrease() {

        count--;

    }

    /**

      * 统计在线会员(添加)

     * @param memberInfo

     */

    public static void addAttr(MemberInfo memberInfo) {

        // 如果在线会员列表不为空,则迭代该列表,检查当前登录的会员id与列表中的记录id是否一致.

         Iterator itr = onlineMemberList.iterator();

        while (itr.hasNext()) {

            // 先判断该会员是否已有session信息保存在统计对象中.若有,把旧的挤掉,再放入新的.

             MemberInfo temp = (MemberInfo) itr.next();

             String memberName = temp.getName();

             // 保存在统计类中的用户名

             if (memberInfo.getName().equals(memberName)) {

                 itr.remove();

            }

        }

        onlineMemberList.add(memberInfo);

    }

    /**

      * 统计在线会员(清除) *

     * @param memberInfo

      */

     public static void removeAttr(MemberInfo memberInfo) {

        onlineMemberList.remove(memberInfo);

    }

    /**

       * 获取在线访客的数量 *

       * @return the count

       */

     public static int getOnlineVisitors() {

          return count - 1;// 除去管理员本身

     }

     /**

        * 获取在线会员的列表 *

       * @return the onlineMemberList

       */

      public static Set getOnlineMemberList() {

          return onlineMemberList;

     }

     /**

       * 根据登录时间判断登录次序的先后 *

       * @param memberInfo

       * @return

       */

     public static boolean isOld(MemberInfo memberInfo) {

         Iterator itr = onlineMemberList.iterator();

         while (itr.hasNext()) {

             MemberInfo temp = (MemberInfo) itr.next();

             String memberName = temp.getName(); // 保存在统计类中的用户名

             Date loginTime = temp.getLoginTime();// 保存在统计类中的用户登录时间

             if (memberInfo.getName().equals(memberName) && memberInfo.getLoginTime().before(loginTime)) {

                // 如果当前用户的登录时间比统计对象里保存的同名用户的登录时间要早,则返回true

                 return true;

             }

        }

        return false;

     }

}

3. 拦截器代码片断

Java代码
Map sessionMap = invocation.getInvocationContext().getSession();  

Map sessionMap = invocation.getInvocationContext().getSession();

if (sessionMap.get("memberInfo") != null) {

    MemberInfo memberInfo = (MemberInfo) sessionMap.get("memberInfo");

    /**

      *

      */

    if (OnlineStatistics.isOld(memberInfo)) {

         sessionMap.remove("memberInfo");// 清除session

         faragoMessage = "对不起,您的帐号[" + memberInfo.getName() + "]已在别的地方登录,您已被迫退出。若有疑问请联系管理员,谢谢!";

         ctx.put("faragoMessage", faragoMessage);

          return Action.ERROR;

    }...... ...

如果想在前台也显示当前在线人数,可以在sessionCreated和sessionDestroyed方法中处理,把统计数字放入ServletContext里面.然后使用S2的标签直接显示.这样来得方便.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 中,可以使用拦截器防止 XSS 攻击。以下是一些步骤: 1. 创建一个类,继承 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter。 ```java public class XSSFilter extends StrutsPrepareAndExecuteFilter { @Override protected void postInit(FilterConfig filterConfig) throws ServletException { super.postInit(filterConfig); // 添加 XSS 拦截器 addFilter(new FilterHolder(new XSSInterceptor()), "/*", null); } } ``` 这个类的作用是在 Struts2 启动时添加一个 XSS 拦截器。 2. 创建一个 XSS 拦截器。 ```java public class XSSInterceptor implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 对请求参数进行 XSS 过滤 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; filterChain.doFilter(new XSSRequestWrapper(request), response); } @Override public void destroy() { } } ``` 这个拦截器的作用是对请求参数进行 XSS 过滤。 3. 创建一个 XSSRequestWrapper 类,继承 HttpServletRequestWrapper。 ```java public class XSSRequestWrapper extends HttpServletRequestWrapper { public XSSRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { String value = super.getParameter(name); if (value != null) { value = Jsoup.clean(value, Whitelist.basic()); } return value; } } ``` 这个类的作用是重写 getParameter 方法,在获取请求参数时进行 XSS 过滤。 4. 在 web.xml 中添加过滤器配置。 ```xml <filter> <filter-name>xssFilter</filter-name> <filter-class>com.example.XSSFilter</filter-class> </filter> <filter-mapping> <filter-name>xssFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这个配置的作用是将 XSSFilter 拦截器应用于所有的请求。 以上是一个简单的 Struts2 XSS 拦截器的配置。但是需要注意的是,这个拦截器只能对请求参数进行 XSS 过滤,对于响应内容的过滤需要使用其他的方案来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值