• Struts2+DAO层实现实例03——添加监听器跟踪用户行为


    实例说明

      根据上两次的成品进行二次加工。

      加入Listener,监听用户的登陆注销情况。

    所用知识说明

      采用SessionBindingListener对Session进行监听。

      同时,Action中获取Application,Session,request的方法(在此只列出一种)更多方法

        public class LoginAction {  
            private Map request;  
            private Map session;  
            private Map application;  
              
            public String execute() {  
                request = (Map)ActionContext.getContext().get("request");  
                session = ActionContext.getContext().getSession();  
                application = ActionContext.getContext().getApplication();  
                request.put("username1", "jingjing1");  
                session.put("username2", "jingjing2");  
                application.put("username3", "jingjing3");  
                return "success";  
            }  
        }  

     代码实例

      登陆控制UserManagment

    package UserBlock;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import javafx.application.Application;
    import org.apache.struts2.views.util.ContextUtil;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;
    import java.util.ArrayList;
    import java.util.Map;
    
    /**
     * Servlet监听器,控制记录用户的登陆注销信息
     * Created by Richard on 2017/6/16.
     */
    public class UserManagment {
        class Userlistener implements HttpSessionBindingListener{
            private  String username;
    
    
            public String getUsername() {
                return username;
            }
    
            public void setUsername(String username) {
                this.username = username;
            }
    
    
            @Override
            public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
                    ActionContext context = ActionContext.getContext();
                    Map application = context.getApplication();
                    ArrayList online= (ArrayList) application.get("online");
                if(online==null){
                        online=new ArrayList();
                    }
                online.add(username);
                application.put("online",online);
            }
    
            @Override
            public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
                ActionContext context = ActionContext.getContext();
                Map application = context.getApplication();
                ArrayList online= (ArrayList) application.get("online");
                online.remove(username);
            }
    
    
        }
    
        /*
                登陆
                    首先判别是否登陆
                    已经登陆---->return
                    没有登陆---->获取对应的Session,存入对应用户名的listener
         */
    
        public void login(String username){
            if(islogin(username)){
                return;
            }else{
                Userlistener newUser=new Userlistener();
                newUser.setUsername(username);
                ActionContext actionContext=ActionContext.getContext();
                Map session=actionContext.getSession();
                session.put("username",newUser);
            }
    
        }
    
        /*
                判断是否登陆:
                    判别条件Session中是否有对应的该用户名的Listener
                    有--->已经登陆,未注销
                    无--->没有登陆
         */
        public  boolean islogin(String username){
            ActionContext actionContext=ActionContext.getContext();
            Map session=actionContext.getSession();
            Userlistener judge= (Userlistener) session.get("username");
            if(judge!=null){
                return true;
            }else {
                return false;
            }
        }
    
        /*
                  注销
                        首先判断是否登陆
                        已经登陆--->移除Listener--->true
                        没有登陆--->false
    
         */
    
        public boolean logoff(String username){
            if(islogin(username)){
                ActionContext actionContext=ActionContext.getContext();
                Map session=actionContext.getSession();
                session.remove(username);
                return true;
            }else {
                return false;
            }
        }
        /*
                人数统计
                     返回Session中List的Size。
         */
    
        public int returnNum(){
            ActionContext actionContext=ActionContext.getContext();
            Map session=actionContext.getSession();
            ArrayList online= (ArrayList) session.get("online");
            if(online==null){
                online=new ArrayList();
            }
            return online.size();
        }
    
        /*
                list返回
         */
        public ArrayList  returnlist(){
            ActionContext actionContext=ActionContext.getContext();
            Map session=actionContext.getSession();
            ArrayList online= (ArrayList) session.get("online");
            if(online==null){
                online=new ArrayList();
            }
            return online;
        }
    }

    主页in.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Richard
      Date: 2017/6/16
      Time: 21:38
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
        <title>Welcome</title>
    </head>
    <body>
    <h1>WelCome to My Struts Page</h1>
    <hr>
    当前登录的用户:${param.username}<br>
    <hr>
    当前所有登陆的用户:
    <table border=1 width=200>
        <s:iterator value="#application.online" var="user">
            <tr <s:if test="#user.odd"> style="background-color: dimgray"  </s:if> >
                <td><s:property value="#user.count"></s:property> </td>
                <td><s:property value="#user"></s:property></td>
            </tr>
        </s:iterator>
    
    </table>
    
    <a href="login.jsp">注销</a>
    </body>
    </html>

    Action:

    package UserBlock;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.logging.LogManager;
    
    /**
     * Created by Richard on 2017/6/16.
     * 继承ActionSupport实现一个Action
     * 登陆界面通过loginuser.action调用login()方法来处理数据
     *          login()方法中通过ActionContext调用Session对象,存入输入错误的数据
     *          通过addActionMessage()方法向页面输出相关信息
     * 注册页面通过reguser.action调用reg()方法来处理数据
     */
    public class UserAction extends ActionSupport {
        private String INDEX="index";
        private String LOGIN="login";
        private  String REG="register";
        private String username;
        private String password;
        private String compassword;
        private UserDao user;
        private UserManagment managment;
    
        public String getCompassword() {
            return compassword;
        }
    
        public void setCompassword(String compassword) {
            this.compassword = compassword;
        }
    
    
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    
        public String login(){
            try{
                managment=new UserManagment();
                user=new UserDao();
                ArrayList result=user.up_select(username);
                if(result.size()>0){
                    User aim= (User) result.get(0);
                    if(aim.getPassword().equals(password)){
                        /*登陆成功*/
                        managment.login(username);
                        return INDEX;
                    }else{
                        ActionContext applicton=ActionContext.getContext();
                        Map session=applicton.getSession();
                        int count;
                        if(session.get("count")==null){
                            count=0;
                        }else{
                            count= (int) session.get("count");
                        }
                        if(count>=3){
                            addActionMessage("错误次数过多");
                            count=0;
                            session.put("count",count);
                            return LOGIN;
                        }else{
                            count++;
                            addActionMessage("您输入的用户名或密码错误"+count);
                            session.put("count",count);
                            return LOGIN;
                        }
    
                    }
                }else{
                    addActionMessage("该用户不存在,已经跳转到注册页面");
                    return REG;
                }
            }catch (Exception e){
                addActionError(e.getMessage());
                System.out.println(e.getMessage());
                e.printStackTrace();
                return LOGIN;
            }
        }
    
    
        public String reg(){
            try{
                managment=new UserManagment();
                user=new UserDao();
                ArrayList result=user.up_select(username);
                if(result.size()>0)
                {
                    addActionMessage("该用户已经存在");
                    return REG;
                }
                else{
                    if(user.insert(username,password)){
                        managment.login(username);
                        return INDEX;
                    }else{
                        addActionMessage("发生未知错误,请重试!");
                        return REG;
                    }
    
                }
            }catch (Exception e){
                    addActionError(e.getMessage());
                    return REG;
            }
        }
    }

     Git源码

      ---->更新注销,注销的效果可以在列表中观察。 

           ----->程序源码

    作者:Rekent
    出处:http://www.cnblogs.com/rekent/
    本文版权归作者和博客园共有,欢迎转载、点赞,但未经作者同意必须保留此段申明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    2016年3月iOS面试总结
    iOS常用公共方法
    让你的App说出多国语言——iOS开发之本地化(国际化)
    开发中遇到的坑
    Git简明教程
    iOS-打包成ipa的4种方法
    iOS-最全的App上架教程
    android 开源项目
    android 文件缓存工具类
    android 聊天通讯源码
  • 原文地址:https://www.cnblogs.com/rekent/p/7069753.html
Copyright © 2020-2023  润新知