java 手写 拦截器_使用spring拦截器手写权限认证框架

1、新建用户对象封装的实体类

*

* 主体类

* wmy 13:20 2019/8/15

* @param

* @return

**/

public class subject {

private object bean;

private string token;

private date expired;

public string gettoken() {

return token;

}

public void settoken(string token) {

this.token = token;

}

public date getexpired() {

return expired;

}

public void setexpired(date expired) {

this.expired = expired;

}

public object getbean() {

return bean;

}

public void setbean(object bean) {

this.bean = bean;

}

@override

public string tostring() {

return "subject{" +

"bean=" + bean +

", token='" + token + '\'' +

", expired=" + expired +

'}';

}

}

2、使用单例模式创建用户对象的容器

@bean("tokens")

public map gettokens() {

map tokens = new hashmap<>();

return tokens;

}

3、封装成用户对象操作的工具类

@component

public class subjectutil implements beanfactoryaware {

private static beanfactory beanfactory = null;

private static string token = null;

public static string gettoken() {

return token;

}

public static void settoken(string token) {

subjectutil.token = token;

}

@override

public void setbeanfactory(beanfactory beanfactory) throws beansexception {

subjectutil.beanfactory = beanfactory;

}

public static beanfactory getbeanfactory() {

return beanfactory;

}

/*

* 获得当前用户id

* wmy 15:29 2019/8/19

* @param []

* @return java.lang.integer

**/

public static integer getsubjectid() {

return subjectutil.getbean(token,branduserr.class).getid();

}

/*

* 厂商id

* wmy 9:44 2019/8/26

* @param []

* @return java.lang.integer

**/

public static integer getbrandid() {

return subjectutil.getbean(token,branduserr.class).getbrandid();

}

/*

* 获得在线用户封装

**/

public static subject getsubject(string token) {

map beans = (map) beanfactory.getbean("tokens");

return beans.get(token);

}

/*

* 获得在线用户

**/

public static object getbean(string token) {

map beans = (map) beanfactory.getbean("tokens");

subject subject = beans.get(token);

if (subject != null) {

return subject.getbean();

}

return null;

}

//获得在线用户

public static final t getbean(string token, class clazz) {

map beans = (map) beanfactory.getbean("tokens");

subject subject = beans.get(token);

if (subject != null) {

object bean = subject.getbean();

if (clazz.isinstance(bean)) {

return clazz.cast(bean);

}

}

return null;

}

/*

* 添加在线用户

**/

public static void addtokenbean(string token, object bean, date expired) {

object beans = beanfactory.getbean("tokens");

if (beans != null && beans instanceof map) {

map map = (map) beans;

if (!map.containskey(token)) {

subject subject = new subject();

subject.setbean(bean);

subject.setexpired(expired);

subject.settoken(token);

map.put(token, subject);

}

}

}

/*

* 删除用户

**/

public static void removetokenbean(string token) {

map beans = (map) beanfactory.getbean("tokens");

beans.remove(token);

}

/*

* 获得所有在线用户

* wmy 10:53 2019/8/19

* @param []

* @return java.util.map

**/

public static map getbeans() {

object beans = beanfactory.getbean("tokens");

if (beans != null && beans instanceof map) {

map map = (map) beans;

return map;

}

return null;

}

/*

* 清楚所有用户

* wmy 13:02 2019/8/19

* @param []

* @return void

**/

public static void clear() {

object beans = beanfactory.getbean("tokens");

if (beans != null && beans instanceof map) {

map map = (map) beans;

map.clear();

}

}

}

4、拦截器的实现

/*

* 登录拦截器

* wmy 14:02 2019/8/19

* @param

* @return

**/

public class logininterceptor implements handlerinterceptor {

@override

public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {

if (!request.getmethod().equals("options")) {

string token = request.getheader("authorization");

int verify = verify(token);

if (verify == 0) {

printwriter writer = response.getwriter();

writer.write(config.msg_access_denied);

return false;

} else if (verify == 2) {

printwriter writer = response.getwriter();

writer.write(config.msg_access_expired);

return false;

} else if (subjectutil.gettoken() == null) {

printwriter writer = response.getwriter();

writer.write(config.msg_access_denied);

return false;

}

}

return true;

}

@override

public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {

}

@override

public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {

subjectutil.settoken(null);

}

/*

* 认证方法

* wmy 11:29 2019/8/15

* @param [token]

* @return java.lang.boolean

**/

public synchronized int verify(string token) {

if (token != null) try {

subject subject = subjectutil.getsubject(token);

if (subject != null) {

//判断是否过期

if (subject.getexpired().gettime() + config.msg_expired < system.currenttimemillis()) {

return 2;

} else {

if (!token.equals(subjectutil.gettoken())) {

while (true) {

if (subjectutil.gettoken() == null) {

subjectutil.settoken(token);

return 1;

}

system.out.println("********** token切换中 *********");

}

}

return 1;

}

}

} catch (exception e) {

e.printstacktrace();

}

return 0;

}

}

5、把拦截器注入岛spring容器中,配置跨域,使用spring定时器,定时清除过期用户

@configuration

@enablescheduling

public class webmvcconfig extends webmvcconfigureradapter {

@override

public void addinterceptors(interceptorregistry registry) {

registry.addinterceptor(new logininterceptor()).addpathpatterns("/**").excludepathpatterns("/branduser/login");

}

@override

public void addcorsmappings(corsregistry registry) {

registry.addmapping("/**").allowedorigins("*");

}

@bean("tokens")

public map gettokens() {

map tokens = new hashmap<>();

return tokens;

}

@scheduled(fixeddelay = 2 * 60 * 60 * 1000)//两个小时执行一次

private void expiredtokens() {

map beans = subjectutil.getbeans();

set tokens = new hashset<>();

if (beans.size() > 0) {

for (string key : beans.keyset()) {

if (beans.get(key).getexpired().gettime() + config.msg_expired < system.currenttimemillis()) {

tokens.add(key);

}

}

if (tokens.size() > 0) {

tokens.stream().foreach(token -> subjectutil.removetokenbean(token));

}

}

}

}

6、测试

@postmapping("/test")

public result test() {

string token = subjectutil.gettoken();

branduserr bean = subjectutil.getbean(token, branduserr.class);

return result.ok(bean);

}

@postmapping("/test2")

public result test2() {

//subjectutil.clear();

return result.ok(subjectutil.getbean(subjectutil.gettoken()));

}

323ac6e5d9daac5388f8a71b7a543363.png

7becf28711b68ce31d73566a11d77ce5.png

未做压力测试,适合做后台管理系统使用,并发高的项目慎用。

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值