java 使用过滤器实现登录拦截处理

2022-07-21,,,

目录
    • loginfliter

滤器实现登录拦截处理

一、什么是过滤器

过滤器是处于客户端与服务器资源文件之间的一道过滤网(驻留在服务器端的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;
    }

结果图

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

《java 使用过滤器实现登录拦截处理.doc》

下载本文的Word格式文档,以方便收藏与打印。