一、 nutz 是什么
nutz 是一个轻便的 web 端开发框架。主页如下: http://www.nutzam.com/core/nutz_preface.html
二、 session 简单介绍
大家都知道 http 是无状态的,即:同一个浏览器发送多个请求,服务端并不知道这些请求是来自于同一个浏览器。所以为了使服务端知道这些请求都是来自于同 一个浏览器,用到了 session 技术。即浏览器第一次发送请求给服务端时,服务端会生成一个 sessionId ,将该 sessionId 返回给浏览器, 浏览器将 sessionId 以 cookie 的形式保存在客户端,下一次请求该服务器的时候,会将 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 的一点小小的使用经验,如有不正确和不恰当的地方,请大家多多指出,共同进步!
如有转载,请指明出处。谢谢!