java 使用过滤器实现登录拦截处理
程序员文章站
2022-03-12 11:35:24
目录loginfliter滤器实现登录拦截处理一、什么是过滤器过滤器是处于客户端与服务器资源文件之间的一道过滤网(驻留在服务器端的web组件),在访问资源文件之前,通过一系列的过滤器对请求进行修改、判...
滤器实现登录拦截处理
一、什么是过滤器
过滤器是处于客户端与服务器资源文件之间的一道过滤网(驻留在服务器端的web组件),在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应
二、工作原理及生命周期
举个例子 当我们登录系统可以访问到页面,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作用。当我们访问某个接口时,过滤器会拦截请求,判断当前用户是否是登录状态,若登录则放行访问,若未登录则返回指定页面(通常为登录页或一个客户友好的提示页)
这个过程包含了过滤器的生命周期:
1.实例化
2.初始化
3.执行过滤操作(包括访问前对request操作和返回时对response的操作处理)
4.销毁
三、过滤器使用
在springboot项目简单使用过滤器进行登录拦截处理
1.实现过滤器
public class myfilter implements filter { private static final string current_user = "current_user"; //配置白名单 protected static list<pattern> patterns = new arraylist<pattern>(); //静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次 static { patterns.add(pattern.compile("/index")); patterns.add(pattern.compile("/login")); patterns.add(pattern.compile("/register")); } @override public void init(filterconfig filterconfig) throws servletexception { } @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { httpservletrequest httprequest = (httpservletrequest) servletrequest; httpservletresponse httpresponse = (httpservletresponse) servletresponse; httpservletresponsewrapper wrapper = new httpservletresponsewrapper(httpresponse); string url = httprequest.getrequesturi().substring(httprequest.getcontextpath().length()); if (isinclude(url)) { //在白名单中的url,放行访问 filterchain.dofilter(httprequest, httpresponse); return; } if (sessionutils.getsessionattribute(current_user) != null) { //若为登录状态 放行访问 filterchain.dofilter(httprequest, httpresponse); return; } else { //否则默认访问index接口 wrapper.sendredirect("/index"); } } @override public void destroy() { } //判断当前请求是否在白名单 private boolean isinclude(string url) { for (pattern pattern : patterns) { matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } }
2.注册过滤器
@configuration public class webconfig { /** * 配置过滤器 * @return */ @bean public filterregistrationbean somefilterregistration() { filterregistrationbean registration = new filterregistrationbean(); registration.setfilter(myfilter()); //拦截/*的访问 多级匹配(springboot 过滤器/*以及匹配 /**多级匹配) registration.addurlpatterns("/*"); registration.setname("myfilter"); return registration; } /** * 创建一个bean * @return */ @bean(name = "myfilter") public filter myfilter() { return new myfilter(); } }
3.运行项目
访问/index,会发现没有被拦截,返回正确结果
在未登录状态,访问/update接口,会被拦截跳转至/index页
在登录状态,访问/update接口,可以访问
这里也可以在程序debug看下。简单的过滤器功能完成。
常用过滤器及其使用后续再来学习。
filter简易实现登录功能拦截
暑期项目实习第八课, filter简易实现登录功能拦截
loginfliter
public class loginfliter implements filter { @override public void init(filterconfig filterconfig) throws servletexception { } @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { httpservletrequest request = (httpservletrequest) servletrequest; httpservletresponse response = (httpservletresponse) servletresponse; httpsession session = request.getsession(); user user = (user)session.getattribute("user"); string uri = request.getrequesturi(); system.out.println(uri.indexof("findall.do")); system.out.println(uri.indexof("login.do")); if(user==null && uri.indexof("login.do")==-1){ response.sendredirect(request.getcontextpath()+"/"); }else { filterchain.dofilter(request,response); } } @override public void destroy() { } }
controller
@requestmapping("/login.do") public modelandview login(user user, httpsession session){ boolean flag = userservice.login(user.getname(),user.getpassword()); modelandview modelandview = new modelandview(); if(flag){ session.setattribute("user",user); modelandview.setviewname("../ok"); }else { modelandview.setviewname("../failure"); } return modelandview; }
结果图
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 关于“数据分析”如何快速入门一些基本思路