一、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;
}
}
}

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 { }

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;
} }

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");
} }

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

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

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

四、注意事项与参考资料

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的一点小小的使用经验,如有不正确和不恰当的地方,请大家多多指出,共同进步!

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

nutz中实现登录验证的更多相关文章

  1. Linux登录验证机制、SSH Bruteforce Login学习

    相关学习资料 http://files.cnblogs.com/LittleHann/linux%E4%B8%AD%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E8%AE% ...

  2. SSM项目使用拦截器实现登录验证功能

    SSM项目使用拦截器实现登录验证功能 登录接口实现 public User queryUser(String UserName, String Password,HttpServletRequest ...

  3. Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制

    1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...

  4. SQLServer 中的身份验证及登录问题

    SQLServer 中的身份验证及登录问题 by:授客 QQ:1033553122 身份验证 SQL Server 支持两种身份验证模式,即Windows 身份验证模式和混合模式. Windows 身 ...

  5. Django-rest_framework中利用jwt登录验证时,自定义返回凭证和登录校验支持手机号

    安装 pip install djangorestframework-jwt 在Django.settings中配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATIO ...

  6. Asp.net MVC访问框架页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

    一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是 ...

  7. Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)

    在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...

  8. Spring Security在登录验证中增加额外数据(如验证码)

    在使用Spring Security框架过程中,经常会有这样的需求,即在登录验证时,附带增加额外的数据,如验证码.用户类型等.下面将介绍如何实现. 注:我的工程是在Spring Boot框架基础上的, ...

  9. C# mvc中为Controller或Action添加定制特性实现登录验证

    在本文开始前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomA ...

随机推荐

  1. 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. 莫队&&分块

    今天兔哥讲了一波莫队,比较有趣,先加一个链接,这是她的教程 rabbithu.cnblogs.com 这里就不详细说了,其实就是两个指针来优化的暴力.一开始排序函数有问题,没用上莫队的核心思想:把查询 ...

  3. 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务

    一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...

  4. 2019手机号码JS正则表达式

    前端的正则表达式验证往往是最繁多最复杂的,所以整理了一些最近自己常用的正则表达式,希望能对大家有所帮助! /* 合法uri */ export function validateURL(textval ...

  5. Blender之Property

    目标 [x] 总结Blender插件之属性bpy.props 总结 bpy.props bpy.props模块用来扩展Blender内置数据的属性. 这些函数的结果用于为用Blender注册的类分配属 ...

  6. POJ 1082---->一个神一般的题

    代码只有10行,反正我是看了题解才知道的. 嗯 首先 看到这个题, BFS+一堆判断(什么平年闰年跨年各种乱搞肯定能搞出来,但是Code length就不一定了)... 然后呢 就看到了这个题解 从后 ...

  7. vue-pdf的使用方法及解决在线打印预览乱码

    最近在用vue做项目的时候,页面中需要展示后端返回的PDF文件,于是便用到了vue-pdf,其使用方法为 : npm install --save vue-pdf 官网地址:https://www.n ...

  8. 《java数据结构与算法》系列之“快速排序"

    部门没人了,公司动作好快...算了,不想了!还是学知识吧,只有它不会让自己失望. 继续我的算法学习,快速排序是应用很广的算法,看了一早上才看懂些,感觉比冒泡之类的难理解,可能主要是递归那块自己不是很理 ...

  9. Microsoft SQL Server数据库学习(一)

    数据库的分类: 1.关系型数据库: 数据库名称 类型 公司 平台 Access 小型数据库 微软 Windows Mysql 小型数据库 AB--sun--甲骨文 Windows/linux/mac ...

  10. vs2017 创建项目推送到Git上

    地址 在从本地往云上推送的时候遇到了这样的问题 将分支推送到远程存储库时遇到错误: rejected Updates were rejected because the remote contains ...