文档章节

Play 1.x框架学习之六:未登陆拦截机制 (Not Login intercept In play framework)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:23
字数 482
阅读 295
收藏 0

未登录拦截功能,这是web应用中比较常见的,在本文中,我们结合redis来做未登录拦截。其原理是将sessionid作为key,等登陆的用户id作为value(也可能存储一个专门的对象,保存登陆信息等)。每个请求来之时拦截,然后查询redis中是否有,有则放行,没有则跳转到登陆界面。 控制器父类Application中的拦截方法,其中的Before注解中的unless是指拦截白名单方法数组: app.controllers.Application.java

@Before(unless={"Application.index","LoginAction.login"})
public static void LoginedIntercept() {
    String sessionId = Session.current().getId();
    Long userid =  (Long) Redis.getObject(sessionId);
    if(userid == null){
        String msg = "请先登陆";
        render("Application/log.html",msg);
    }
}

登录功能控制器 app.controllers.LoginAction.java

package controllers;

import play.db.jpa.GenericModel.JPAQuery;
import play.mvc.Scope.Session;
import util.Redis;
import models.User;

public class LoginAction extends Application{
    public static void login(String logwords,String pwd){
        JPAQuery query = User.find("pwd = ? and (code = ? or email = ?)", pwd,logwords,logwords);
        User user = query.first();
        if(user != null){
            String sessionId = Session.current().getId();
            Redis.set(sessionId, user.id, 100);
            UserAction.load(user.id);
        }
        String msg = "账号或密码错误";
        render("Application/log.html",msg);
    }
}

redis的封装帮助类 util.Redis.java

package controllers;
package util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;

import play.modules.redis.RedisConnectionManager;

public class Redis{
    public static void set(String key,Object value,int expiretime){
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        ObjectOutputStream oos;
        try {
            oos = new ObjectOutputStream(baos);
            oos.writeObject(value);
            byte[] buf=baos.toByteArray();
            oos.flush();
            RedisConnectionManager.getRawConnection().setex(key.getBytes("UTF-8"),expiretime*60, buf);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	
    public static Object getObject(String key){
        Object objVal=null;
        byte[] value=null;
        try {
            value=RedisConnectionManager.getRawConnection().get(key.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (value!=null) {
            ByteArrayInputStream bais=new ByteArrayInputStream(value);
            try {
                ObjectInputStream ois=new ObjectInputStream(bais);
                objVal=ois.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return objVal;
    }
}

配置redis/mysql conf/application.conf

jpa.dialect=org.hibernate.dialect.MySQLDialect
db.url=jdbc:mysql://localhost:3306/pop?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
db.driver=com.mysql.jdbc.Driver
db.user=root
db.pass=root
db=pop

redis.cache=enabled
redis.url=redis://127.0.0.1:6379
redis.cache.url=redis://127.0.0.1:6379

登陆页面

#{extends 'main.html' /}
#{set title:'Home' /}
<body>
    <div>
    <span style="color: red">${msg}</span>
    <form action="/login" method="post" id="myform">
        <label>账号:</label><input type="text" id="lognameid" name="logwords"/>
        <br/>
        <label>密码</label><input type="password" id="pwdid" name="pwd"/>
        <input type="submit" value="log">
    </form>
    </div>
</body>

route文件就不给了,运行结果: QQ截图20140527163735

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
Play 1.x框架学习之二:统一校验机制 (common way to validate in play framework)

Play框架提供十分便捷的校验注解机制,结合@before拦截器标签可以实现便利的拦截机制,不需要逐个类去编写校验代码了,这里结合上一章的功能测试实现一个增加的校验。 首先要用到两个models类...

奋斗到天明
2015/08/27
0
0
Play 1.x 学习资料汇总

1.Play!Framework学习笔记:初识Play(http://blog.csdn.net/w302974215/article/details/46926007) 2.Play Framework入门引导(http://somefuture.iteye.com/blog/1985667) 3.Play框架1.2.7版......

IT追寻者
2016/07/22
43
0
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

曾沙
2012/11/26
348
0
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

红薯
2012/03/14
13.2K
20
Intellij Idea 配置 Play 1.x Framework 开发环境 (configuration Play 1 x Framework development environmen...

虽然在公司使用的是Eclipse,但是我还是很中意俊俏的Intellij Idea(当然还有风骚的Sublime Text),Play 是一个类ROR的框架(Play 1.x 是比较正统的Java框架,Play 2.x混入Scala血统,个人不...

刀狂剑痴
2015/08/27
132
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
10
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
13
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
18
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
11
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部