文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:23
字数 482
阅读 288
收藏 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
43
0
Play 1.x框架学习之二:统一校验机制 (common way to validate in play framework)

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

奋斗到天明
2015/08/27
0
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
12.7K
20
用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)

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

刀狂剑痴
2015/08/27
104
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
132
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
12
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
14
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部