• nutz中实现登录验证


    一、nutz是什么

         nutz是一个轻便的web端开发框架。主页如下:http://www.nutzam.com/core/nutz_preface.html

    二、session简单介绍

         大家都知道http是无状态的,即:同一个浏览器发送多个请求,服务端并不知道这些请求是来自于同一个浏览器。所以为了使服务端知道这些请求都是来自于同 一个浏览器,用到了session技术。即浏览器第一次发送请求给服务端时,服务端会生成一个sessionId,将该sessionId返回给浏览器, 浏览器将sessionIdcookie的形式保存在客户端,下一次请求该服务器的时候,会将sessionId带过去,服务端可以根据该 sessionId找到在这个session保存的值,并使用该session中保存的值进行一系列的操作。

        session相关的连接如下:http://www.cnblogs.com/sharpxiajun/p/3395607.html

    三、nutz中登录验证的实现方式

    1、准备工作

        需要有以下准备:/toLogin指向登录页面;/login点击登录后处理登录的方法;/logout指向登出;/test指向一般的业务处理方法。/home指向登录成功后跳转的主页面。

        其中:/toLogin/login是不需要进行登录验证的。

                /logout/test/home是需要进行登录验证的。

        要实现的结果如下:

                点击登录/login时,根据用户名/密码进行验证,若登录成功,则将该user保存到session中,并跳转到/home主页;若登录失败,则跳转到/toLogin

                会为其他进行登录验证的方法,实现一个过滤器,在该过滤器中根据session中的user对象是否存在,进行验证,若存在,跳转到/home主页,否则跳转/toLogin页面。

        负责登录、登出、及登录主页的类代码如下:

     

    package xxx.xxx.module;
    import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.nutz.ioc.loader.annotation.IocBean;import org.nutz.mvc.annotation.At;import org.nutz.mvc.annotation.Filters;import org.nutz.mvc.annotation.Ok;
    
    @IocBeanpublic class LoginDemo {
    
        /**
         * 该方法指向登录页面
         */
        @Filters //配置Filters之后该方法将不执行过滤器
        @At("/toLogin")
        @Ok("")//此处配置登录页面的路径
        public void toLogin(){
        }
        
        /**
         * 该方法为登录时的处理方法
         * 结果以重定向的方式来跳转。
         * 若登录成功,跳转到/home。若登录失败,跳转到/toLogin
         * @param req
         * @param session
         * @return
         */
        @At("/login")
        @Ok("redirect:${obj==true?'/home':'/toLogin'}")
        @Filters
        public boolean login(HttpServletRequest req,HttpSession session){
            String userName=req.getParameter("name");
            String pwd=req.getParameter("pwd");
            boolean result=false;//登录成功与否的结果。默认为false
            
            if(!isBlank(userName) && !isBlank(pwd)){
                /**
                 * 此处根据输入的用户名和密码进行数据库查询验证,查看该用户是否存在。
                 * 一般在用户注册或者新增用户时,都会将密码进行加密。或者将用户名为salt,对密码进行加密并保存到数据库。
                 * 此时需要对用户名和密码进行相同的加密。并以用户名,加密后的密码为条件,从数据库中查询该用户。
                 * 若存在,则登录成功。
                 */
                
                /**
                 * 此处user模拟从数据库中查询出的对象
                 */
                User user=new User();
                
                if(user!=null){
                    result=true;//此时登录成功
                    session.setAttribute("user", user);//将该user保存到session中。            }
            }
            
            return result;
        }
        
        
        /**
         * 登出
         * @param session
         */
        @At("/logout")
        @Ok("redirect:/toLogin")
        public void logout(HttpSession session){
            session.invalidate();//将该session销毁    }
        
        
        /**
         * 判断str是否为空或"" 若是,返回true。 否则返回false
         * @param str
         * @return
         */
        private  boolean isBlank(String str){
            if(str==null || "".equals(str.trim())){
                return true;
            }else{
                return false;
            }
        }
    }
    View Code

     

    2、使用自带的CheckSession.class过滤器

         需要在indexModule主入口类中配置过滤器,如下所示:

     

    package xxx.xxx.module;
    import org.nutz.mvc.annotation.By;
    import org.nutz.mvc.annotation.Filters;
    import org.nutz.mvc.filter.CheckSession;
    //其中:"user"为session中的属性名。"/toLogin"为若该属性不存在时的处理。此处为跳转到登录页面。
    @Filters(@By(type = CheckSession.class,args={"user","/toLogin"}))public class InitModule {
    
    }
    View Code

     

         nutz中的CheckSession.class源代码如下:

    package org.nutz.mvc.filter;import javax.servlet.http.HttpSession;import org.nutz.mvc.ActionContext;import org.nutz.mvc.ActionFilter;import org.nutz.mvc.Mvcs;import org.nutz.mvc.View;import org.nutz.mvc.view.ServerRedirectView;/**
     * 检查当前 Session,如果存在某一属性,并且不为 null,则通过 <br>
     * 否则,返回一个 ServerRecirectView 到对应 path
     * <p>
     * 构造函数需要两个参数
     * <ul>
     * <li>第一个是, 需要检查的属性名称。如果 session 里存在这个属性,则表示通过检查
     * <li>第二个是,如果未通过检查,将当前请求转向何处。 一个类似 /yourpath/xxx.xx 的路径
     * </ul>
     * 
     * @author zozoh(zozohtnt@gmail.com)
     */public class CheckSession implements ActionFilter {
    
        private String name;
        private String path;
    
        public CheckSession(String name, String path) {
            this.name = name;
            this.path = path;
        }
    
        public View match(ActionContext context) {
            HttpSession session = Mvcs.getHttpSession(false);
            if (session == null || null == session.getAttribute(name))
                return new ServerRedirectView(path);
            return null;
        }
    
    }
    View Code

    3、自定义过滤器

        以下为自定义过滤器MyFilter的代码实现:

    package xxx.xxx.filters;import javax.servlet.http.HttpSession;import org.nutz.ioc.loader.annotation.IocBean;import org.nutz.mvc.ActionContext;import org.nutz.mvc.ActionFilter;import org.nutz.mvc.View;import org.nutz.mvc.view.ServerRedirectView;
    /**
     * 自定义的登录验证!
     * @author 
     *
     */
    @IocBeanpublic class MyFilter implements ActionFilter{
    
        @Override
        public View match(ActionContext actionContext) {
            
            HttpSession session=actionContext.getRequest().getSession();
            if(session.getAttribute("user")!=null){
                return null;//执行方法        }
            
            //验证不通过时跳转到别的页面!
            return new ServerRedirectView("/toLogin.html");
        }
    
    }
    View Code

       其实和CheckSession的实现是很类似的。

       自定义Filter的配置和内置的CheckSession.class配置类似,配置如下:

     

    @Filters(@By(type = MyFilter.class ,args={"ioc:myFilter"}))
    View Code

     

    四、注意事项与参考资料

    1、 注意事项

          IOC管理的类,均需在类名前添加@IocBean

          如果在登录时需在session中保存多个属性,需把"user",user 用于登录验证的属性放在最后,以防止各种空指针的问题。参考资料:http://wendal.net/399.html

    2、参考资料

         过滤器相关:http://www.nutzam.com/core/mvc/action_filter.html

         入口函数返回的View相关:http://www.nutzam.com/core/mvc/view.html       

                                           http://wendal.net/436.html

    ===============================================================================================

    以上仅为我个人初学nutz的一点小小的使用经验,如有不正确和不恰当的地方,请大家多多指出,共同进步!

    如有转载,请指明出处。谢谢!

     

     

     

  • 相关阅读:
    MongoDB学习笔记~Mongo集群和副本集
    知方可补不足~写了一个计算数据表占用存储空间的方法
    MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
    MongoDB学习笔记~索引提高查询效率
    MongoDB学习笔记~客户端命令行的使用
    Android动画效果translate、scale、alpha、rotate详解
    CacheHelper工具类的使用
    [置顶] vs2008 编译adb 支持4.2 android 系统(增加push 命令的进度)
    如何在cocos2d项目中enable ARC
    敏捷开发用户故事系列之十一:CSDN博客用户故事分析
  • 原文地址:https://www.cnblogs.com/lindsay-chh/p/4621856.html
Copyright © 2020-2023  润新知