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

SpringBoot拦截器原理解析及使用方法

程序员文章站 2022-03-20 13:43:46
拦截器简介拦截器通常通过动态代理的方式来执行。拦截器的生命周期由ioc容器管理,可以通过注入等方式来获取其他bean的实例,使用更方便。拦截器配置使用方式实现拦截器接口:import java.io....

拦截器简介

拦截器通常通过动态代理的方式来执行。

拦截器的生命周期由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 是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。