文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:23
字数 482
阅读 1K
收藏 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

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
极速博客引擎--Gor

gor 是使用 golang 实现的类Ruhoh静态博客引擎(Ruhoh like),基本兼容ruhoh 1.x规范. 相当于与ruhoh的官方实现(ruby实现), 有以下优点: 速度完胜 -- 编译wendal.net近200篇博客,仅需要1秒 安装...

wendal
2013/01/20
3.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

没有指定分支的“git push”的默认行为 - Default behavior of “git push” without a branch specified

问题: I use the following command to push to my remote branch: 我使用以下命令推送到我的远程分支: git push origin sandbox If I say 如果我说 git push origin does that push ch......

技术盛宴
40分钟前
15
0
为什么在允许某些Unicode字符的注释中执行Java代码?

问题: The following code produces the output "Hello World!" 以下代码生成输出“Hello World!” (no really, try it). (不,真的,试试吧)。 public static void main(String... args......

富含淀粉
今天
18
0
字符串格式:%与.format - String formatting: % vs. .format

问题: Python 2.6 introduced the str.format() method with a slightly different syntax from the existing % operator. Python 2.6引入了str.format()方法,其语法与现有的%运算符略有不......

javail
今天
22
0
什么是按位移位(位移)运算符以及它们如何工作? - What are bitwise shift (bit-shift) operators and how do they work?

问题: I've been attempting to learn C in my spare time, and other languages (C#, Java, etc.) have the same concept (and often the same operators) ... 我一直在尝试在业余时间学习......

法国红酒甜
今天
32
0
OSChina 周二乱弹 —— 卧槽 李荣浩的契约兽啊

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《红色的回忆》- 痛仰乐队 手机党少年们想听歌,请使劲儿戳(这里) 动弹, 又好多...

小小编辑
今天
69
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部