欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot 中拦截器的简介及使用方式

程序员文章站 2022-03-08 14:14:03
拦截器简介 拦截器通常通过动态代理的方式来执行。 拦截器的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便。 过滤器配置使用方式 实现拦截器接口: 将拦截器加入到配置中: 备注: 由于 preHandle、postHandle、afterCompletion 是不同的 ......

拦截器简介

  • 拦截器通常通过动态代理的方式来执行。
  • 拦截器的生命周期由ioc容器管理,可以通过注入等方式来获取其他bean的实例,使用更方便。

过滤器配置使用方式

实现拦截器接口:

import java.io.ioexception;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;

private class authenticationinterceptor implements handlerinterceptor {
	// 在请求处理之前进行调用(controller方法调用之前)
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws ioexception{
    	system.out.println(request.getrequesturl());
    	user user = (user)request.getsession().getattribute("user");
        if(user != null){
        	return true;
        }else {
        	system.out.println("no login...");
        	// request.getrequestdispatcher("/index.html").forward(request, response);
        	response.sendredirect(request.getcontextpath()+"login.html");
        	return false;
        }
        return false;
    }
    
    // 在请求处理之后视图被渲染之前进行调用(controller方法调用之后)
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) {
        system.out.println("posthandle...");
    }

	// 在请求结束之后、也就是视图被渲染之后进行调用(主要是用于进行资源清理工作)
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) {
        system.out.println("aftercompletion...");
    }
}

将拦截器加入到配置中:

import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.interceptorregistration;
import org.springframework.web.servlet.config.annotation.interceptorregistry;
import org.springframework.web.servlet.config.annotation.webmvcconfigurer;

@configuration
public class websecurityconfig implements webmvcconfigurer{
    @override
    public void addinterceptors(interceptorregistry registry){
        registry.addinterceptor(new authenticationinterceptor())
        		//所有路径都被拦截
        		.addpathpatterns("/**")
        		//添加不拦截的路径
        		.excludepathpatterns("/userlogin", "/css/**", "/images/**", "/js/**", "/login.html");
        registry.addinterceptor(new otherinterceptor())
                .addpathpatterns("/**");
    }
}

备注:

由于 prehandle、posthandle、aftercompletion 是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。