文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:23
字数 482
阅读 278
收藏 0
点赞 0
评论 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 学习资料汇总

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 ⋅ 0

Play 1.x框架学习之二:统一校验机制 (common way to validate in play framework)

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

刀狂剑痴 ⋅ 2015/08/27 ⋅ 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 ⋅ 20

用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)

这里的云计算多租户是指一个web应用,多个数据库。每一个租户对应着一个数据库。 数据库方面,简单分为一个基本库,记录着基本信息与租户的信息,还有租户数据库配置信息。N个租户库,这N个租...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

SpringMVC 3.1集成Spring Security 3.1

这篇算是一个入门文章,昨天看见有网友提问,spring mvc集成spring security 的时候出错,揣测了一下问题木有解决。我就帮忙给搭建了一个集成框架他说可以,他告诉我这样的文章网上少。今天我...

mrliuze ⋅ 2016/11/24 ⋅ 0

Play 1.x 功能测试乱码及编码问题 (Encoded Question In Play 1.x FunctionalTest)

大家在估做功能测试的时候,不知有没有发现,如果统一用utf-8作为编码,POST测试请求中如果带有汉字就会乱码。 {"box":[{"entityId":7,"id":7,"idea":"?????","jPAContext":{"insideTransac...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

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 ⋅ 0

分享一个用Scala Play + Slick 开始写的一个学习的开源web app

好, 最近在學Play,用Play在這些天寫了一個初始的app,用的是Play! framework 2.x + Play slick 1.x,前端用的是,原始的bootstrap。已经开源,https://github.com/hellomaya/scala-connec...

自由之信 ⋅ 2016/01/24 ⋅ 2

【转】play总结性介绍

颠覆臃肿的JavaEE开发框架(bloated Enterprise Java stacks)的Play框架1.0发布,它在很多方面有其革命性的独创,也有助于我们了解现在JavaEE框架的不足。 Play框架吸收PHP RUBY动态语言的特...

mj4738 ⋅ 2011/12/04 ⋅ 2

关于struts2中的拦截器和登陆验证

今天给几个热爱JAVA的同学们讲了Struts2的一些知识,重点讨论了其最具价值的拦截器。 不知道大家还记不记得,在《Struts2之服务器端验证》里我说过这样一句话“在到达Login Action之前,验证已...

长平狐 ⋅ 2012/11/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 38分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 39分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 50分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 52分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 53分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 53分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 57分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部