Play 1.x框架学习之六:未登陆拦截机制 (Not Login intercept In play framework)
Play 1.x框架学习之六:未登陆拦截机制 (Not Login intercept In play framework)
刀狂剑痴 发表于2年前
Play 1.x框架学习之六:未登陆拦截机制 (Not Login intercept In play framework)
  • 发表于 2年前
  • 阅读 227
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

未登录拦截功能,这是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

标签: play 1.x
共有 人打赏支持
粉丝 18
博文 111
码字总数 82582
×
刀狂剑痴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: