nutz中实现登录验证
一、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中实现登录验证的更多相关文章
- 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% ...
- SSM项目使用拦截器实现登录验证功能
SSM项目使用拦截器实现登录验证功能 登录接口实现 public User queryUser(String UserName, String Password,HttpServletRequest ...
- Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
- SQLServer 中的身份验证及登录问题
SQLServer 中的身份验证及登录问题 by:授客 QQ:1033553122 身份验证 SQL Server 支持两种身份验证模式,即Windows 身份验证模式和混合模式. Windows 身 ...
- Django-rest_framework中利用jwt登录验证时,自定义返回凭证和登录校验支持手机号
安装 pip install djangorestframework-jwt 在Django.settings中配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATIO ...
- Asp.net MVC访问框架页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页
一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是 ...
- Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)
在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...
- Spring Security在登录验证中增加额外数据(如验证码)
在使用Spring Security框架过程中,经常会有这样的需求,即在登录验证时,附带增加额外的数据,如验证码.用户类型等.下面将介绍如何实现. 注:我的工程是在Spring Boot框架基础上的, ...
- C# mvc中为Controller或Action添加定制特性实现登录验证
在本文开始前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomA ...
随机推荐
- Android入门之文件系统操作(一)简单的文件浏览器
版权声明:本文为博主原创文章,未经博主允许不得转载. import java.io.File; import java.util.*; import android.app.Activit ...
- (转)dp动态规划分类详解
dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...
- codeforces 899F Letters Removing set+树状数组
F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- bzoj4078
二分+2-sat 枚举第一个权值,二分第二个权值,然后2-sat检查,当第一个权值已经不能形成二分图时,再往下没意义,因为没法分成两个点集.(双指针好像跑得慢) #include<bits/st ...
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- ★Java语法(六)——————————分支语句
1. if 语句 格式用法: if(布尔表达式) { 语句: } 2. if……else 语句 格式用法: if(表达式) { 语句1: } else { 语句2: } 3.if……else i ...
- jquery radio、 checkbox、 select 操作
转载:http://www.haorooms.com/post/checkandselect $("input[id^='code']");//id属性以code开始的所有inpu ...
- git与pycharm结合使用
一.配置pycharm 在pycharm中选择file-->setting,在弹出的窗口中选择version control,选择git,配置git的路径 将当前项目关闭 在弹出的窗口中选择ch ...
- web开发——在网页中引用字体包(.ttf),即嵌入特殊字体
在写html时,有点时候需要显示一些特殊字体,不过这些特殊字体是系统一般不自带的,这时就需要我们自行加载要用的字体.方法如下: 1.首先在style里添加: @font-face { font-fam ...
- Java RMI之HelloWorld经典入门案例
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...