grails 的登陆 退出 过滤

1、  现在我们需要为系统设计一个登录页面,使得访问任何需要登录的页面时都会呈现以下页面:

只有当用户登录成功后,才会跳转到先前要访问的页面。

2、  新建域类LoginUser:

LoginUser用于保存登录用户的相关信息,比如帐号和密码。

class LoginUser {//域:登陆用户

static constraints = {

userId(length:6..8,unique:true)//帐号6-8位

password(length:6..8)//密码6-8位

name(nullable:false)//姓名不可为空

level(range:1..10)//用户级别分10级,够了吧?

}

String userId//用户名

String password//密码

String name//用户姓名

int level//用户权限级别

}

3、  为系统配置一个默认的系统管理员:

打开grails-app/conf/BootStrap.groovy,编辑init闭包(我们可以利用init闭包在系统一启动时做一些初始化的工作):

def init = { servletContext ->

final String BACK_ADMIN=‘admin‘

if(!LoginUser.findByUserId(BACK_ADMIN)){

new LoginUser(userId:BACK_ADMIN,password:‘admin88‘,name:‘\u7BA1\u7406\u5458‘,level:10).save()

}

}

这样,只要系统一启动,就会自动添加admin用户,这样无论系统中有没有录入一个用户,我们都有一个admin的管理员帐号可用。

4、  新建登陆页面:

编辑grails-app/views/loginUser/login.gsp:


<g:form action="login"   method="post" >


……


<input type="text"   id="userId" name="userId" value="${loginUserInstance?.userId}" maxlength="8"/>


//用户名输入框


……


<input type="password"   id="password" name="password" maxlength="8"/>


//密码输入框


……


<input class="button"   type="submit" value="登录" />


//若使用<g:submitButton>标签可能无法正常提交,原因不知


……


</g:form>

5、  在loginuser控制器中定义登录/注销action

打开grails-app/controllers/LoginUserController.groovy:


def login={


//action:登录


if(request.method==‘GET‘){//清除session


//若请求方式为get,呈现login.gsp


session.userId=null


session.level=null


def loginUserInstance=new LoginUser()


//定义一个空的LoginUser实例


}else{


//若请求参数为表单提交


def loginUserInstance=LoginUser.findByUserIdAndPassword(


//从根据用户名密码查找已有的用户


params.userId,params.password)


if(loginUserInstance){//添加session


//若找到匹配的用户,进行登录


session.userId=params.userId


//把用户名记入session


session.level=loginUserInstance.level


//把用户级别记入session


def requestParams=session.originReqParams?session.originReqParams:[controller:‘loginUser‘,action:‘login‘]


//从session中取用户先前请求的控制器和action


redirect(requestParams)


//登录成功,转入用户先前请求的页面


}else{//登录帐号或密码错误


//若找不到匹配用户,登录失败


flash[‘message‘]=‘\u767B\u5F55\u5E10\u53F7\u6216\u5BC6\u7801\u9519\u8BEF‘


//显示登录失败信息


}}}


//如果前面都没有转向,则这里呈现默认视图——登录页面login.gsp


def logout={


//action:注销


session.userId=null


//从session中删除用户名


session.level=null


//从session中删除用户级别


flash[‘message‘]=‘\u6210\u529F\u9000\u51FA\u767B\u5F55‘ //成功退出登录


//显示成功注销消息


redirect(controller:‘loginUser‘,action:‘login‘)         //转向登录页


//转向登录页面


}

6、  定义拦截器

我们的要求是系统必须在用户登录后才能访问,用户未登录情况下,只能显示登录页面login.gsp。

这样我们需要一个拦截器,在任何action被处理之前,先处理拦截器指定的内容,比如登录。如果登录成功,返回true,则该action接下来被正常处理,否则返回false,接下来该action的处理被忽略。

由于基本上,所有的控制器都需要一个拦截器,而且这些拦截器需要进行的处理都差不多——都强制要求用户进行登录,所以我们先来定义一个基类BaseController。在这个基类中我们定义好所有拦截器都需要进行的处理,然后让所有的控制器来继承它就可以了。

运行create-controller Base,然后编辑BaseController.groovy:

class BaseController {

def auth(){                  //定义一个 auth 方法

if(!session.userId){        //如果在session中找不到用户id-即未登录

//定义一个map对象

def originReqParams=[controller:controllerName,action:actionName]

originReqParams.putAll(params)  //把用户此时请求的控制器和action放入map对象

session.originReqParams=originReqParams//把map放入session方便下次转向

redirect(controller:‘loginUser‘,action:‘login‘)//调用登录页面要求用户登录

return false      //返回false,则忽略用户原先请求的action

}   }}

然后让所有的控制器都继承BaseController。这样所有的控制器都有一个叫auth的方法可用了。

在所有的控制器中加入:

def beforeInterceptor = [action:this.&auth]

这定义了一个简单的前置拦截器(即在action被处理之前触发)。它简单的要求所有的action被处理之前,先调用auth方法(注意这里使用了指针语法&符号)。

此外,在loginUser控制器中加入拦截器的是:

def beforeInterceptor=[action:this.&auth,except:[‘login‘]]

当然,这个拦截器在拦截action时,把login排除在外(因为对用户的登录动作要求行强制的登录本身就是多余的)。

现在,我们可以尝试访问所有的controller和action,如果我们没有事先登录,则所有的请求都会转到登录页面。只有当我们输入用户名密码进行登录之后,才会转入我们要访问的action。

7、   由于我们要求用户一开始访问系统时,显示的就是产品编号列表,则我们应该修改系统首页:

打开grails-app/views/index.gsp,在其中加入:

<%

response.sendRedirect(request.getContextPath()+"/productionNo/index");

%>

则当用户访问http://localhost:8080/IronwareProcess这个地址看到的将是登录页面,等用户登录后,才显示产品编号列表:

时间: 2024-10-10 23:28:41

grails 的登陆 退出 过滤的相关文章

phpcms v9和discuz X3.1实现同步登陆退出论坛(已实现)

网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄的安装步骤,留着自己用,有安装过的可跳过. 第一步:安装 phpcms V9 .安装 Discuz! X3.1 (同时安装 UCenter). 第二步:在 UCenter 中添加“phpsso 应用”. 1.管理员登录 Discuz! X3.1 管理中心,进入“UCenter”,点击“应用管理”.     2.

phpcms 2008和discuz X3.1实现同步登陆退出论坛(已实现)

网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄的安装步骤,留着自己用,有安装过的可跳过. 第一步:安装 phpcms V9 .安装 Discuz! X3.1 (同时安装 UCenter). 第二步:在 UCenter 中添加"phpsso 应用". 1.管理员登录 Discuz! X3.1 管理中心,进入"UCenter",点

iframe 的使用和登陆退出的实现——整个页面跳转

iframe中如果只是页面跳转的话,我们依然只是部分的加载的了,为了实现整个页面的所有内容跳转,下面提供了整个页面跳转的方法. iframe例子 1.总的iframe页面(访问就访问这个)  all.html <frameset rows="45%,*" frameborder=0 framespacing=10> <frame src="top.html" noresize/> <frameset cols="20%,*&q

web day24 小项目练习图书商城, 用户,模块(注册,激活,登陆,退出),分类/图书模块

图书商城 模块 用户模块 分类模块 图书模块 购物车模块 订单模块 功能分析 前台 用户模块:注册/激活/登陆/退出 分类模块:查看所有分类 图书模块:查询所有图书/按分类查询图书/查询图书详细(id) 购物车模块:添加/清空/删除购物车条目 /我的购物车(按用户查询) 订单模块:生成订单/我的订单(按用户查询)/按id查询订单/确认收货/ /付款功能(只跳转到银行页面)/付款回调功能 后台 管理员:登陆 分类管理:增/删/改/查 图书管理(我的):增(上传图片)/删/改/查 订单模块:查询所有

Yii2 前后台登陆退出分离、登陆验证

这里用的yii2高级模板, 基本模板的配置文件在一个文件里,方法基本没什么区别, 1.用户表要有两个用户表, 当然一个也行,分开是省得麻烦,既然是分离了就彻底分开, 前台表user,后台表user_backend,表结构这里不再说明了,只列出字段 id username auth_key password_hash password_reset_token email status created_at updated_at 2.配置文件分别将frontend/config/main.php和b

netMVC 搭建Ucenter 同步登陆退出discuz

先看一下效果 首先准备材料: 1.ucenter for net :https://github.com/dozer47528/UCenter-API-For-DotNet or http://pan.baidu.com/s/1i3znQV7 2.uc.ashx  下面是具体代码 using DS.Web.UCenter; using DS.Web.UCenter.Api; using DS.Web.UCenter.Client; using log4net; using pc_manishi.

登陆退出问题

dtcms安全退出: Session[DTKeys.SESSION_ADMIN_INFO] = null; Utils.WriteCookie("AdminName", "DTcms", -14400); Utils.WriteCookie("AdminPwd", "DTcms", -14400); Response.Redirect("login.aspx"); 过程:清空session,设置cookie

Mysql 登陆&amp;退出、创建&amp;删除&amp;选择数据库、基本数据类型、创建&amp;删除表格

登陆数据库使用登陆命令: shell>mysql [-h host] -u user -p [-D database] Enter password: -h指定的是远程主机,登陆本地数据库可以不用,-D 用于指定登陆之后选择的数据库,如果没有指定数据库,则不进行数据库选择.进入数据库之后,每一条命令之前会有 mysql> 的提示符.mysql中的命令都严格以分号(;)作为命令结束.如果在一条命令没输入完之前换行,会出现 -> 的提示符. 退出数据库的命令: mysql>exit 或

MySQL登陆退出

单实例登陆MySQL: mysql/mysql -uroot 适合刚安装后无密码 mysql -uroot -p 标准登陆的方法 mysql -uroot -p'password' 密码明文会泄露密码,一般用于脚本中,脚本权限root 700 多实例登陆MySQL: mysql -S /data/3307/mysql.sock 适合无密码 mysql –uroot –p111 –S /data/3306/mysql.sock mysql –uroot –p –h 127.0.0.1 –P3306