当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot拦截器原理解析及使用方法

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

2020年05月12日  | 移动技术网IT编程  | 我要评论

拦截器简介

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网