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

SpringBoot拦截器的使用与配置

程序员文章站 2022-06-19 16:55:29
SpringBoot拦截器的配置使用一、新建拦截器二、新建WebConfigurer配置拦截器方法一:实现WebMvcConfigurer接口方法二:继承WebMvcConfigurationSupport类方法三:继承WebMvcConfigurerAdapter 类一、新建拦截器判断是否登录的拦截器package com.briup.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.ht...

一、新建拦截器实现HandlerInterceptor接口

判断是否登录的拦截器

package com.briup.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;

public class isLoginInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HttpSession session = request.getSession();
		Object obj = session.getAttribute("customer");
		System.out.println("isLoginInterceptor");
		if(obj!=null) {
			return true;
		}else {
			request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
			return false;
		}
	}
}

二、新建WebConfigurer配置拦截器

- - 方法一:实现WebMvcConfigurer接口

推荐使用

package com.briup.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

	@Autowired
	private isLoginInterceptor isLoginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		 registry.addInterceptor(isLoginInterceptor).addPathPatterns("/user/*");
	}
}

注意: 使用@Autowired注入,拦截器isLoginInterceptor上必须有 @Component 注解
否则会出现如下错误:
Could not resolve view with name ‘index’ in servlet with name ‘dispatcherServlet’

Description:

Field isLoginInterceptor in com.briup.interceptor.InterceptorConfig required a bean of type 'com.briup.interceptor.isLoginInterceptor' that could not be found.

- - 方法二:继承WebMvcConfigurationSupport类

非常不推荐使用,在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,
自动配置的静态资源路径(classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。

原因:
容易出现问题
这是因为在 springboot的web自动配置类 WebMvcAutoConfiguration 上有条件注解

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时该自动配置类才会生效

使用:

package com.briup.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebConfigurer extends WebMvcConfigurationSupport {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		 registry.addInterceptor(new isLoginInterceptor()).addPathPatterns("/user/*");
	}
}

注意: WebMvcConfigurationSupport 类使用 @Autowired 或者 @bean 自动注入页面可能出现如下错误,直接new对象也可能出现如下错误,并且可能会失去css样式:
Could not resolve view with name ‘index’ in servlet with name ‘dispatcherServlet’

Could not resolve view with name 'index' in servlet with name 'dispatcherServlet'

- - 方法三:继承WebMvcConfigurerAdapter 类

不推荐使用,在spring5.0版本后这个类WebMvcConfigurerAdapter被丢弃了 ,虽然还可以用,但是看起来不好

package com.briup.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfigurer extends WebMvcConfigurerAdapter {

	@Bean
	public isLoginInterceptor isLoginInterceptor() {
		 return new isLoginInterceptor();
	};

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(isLoginInterceptor()).addPathPatterns("/user/*");
	}
}

注意: 使用Bean,拦截器类上不能有@Component注解,否则会出现如下错误:
Description:
The bean ‘isLoginInterceptor’, defined in class path resource [com/briup/interceptor/InterceptorConfig.class], could not be registered. A bean with that name has already been defined in file [F:\sts\estore_spingboot\target\classes\com\briup\interceptor\isLoginInterceptor.class] and overriding is disabled.

Description:
The bean 'isLoginInterceptor', defined in class path resource [com/briup/interceptor/InterceptorConfig.class], could not be registered. A bean with that name has already been defined in file [F:\sts\estore_spingboot\target\classes\com\briup\interceptor\isLoginInterceptor.class] and overriding is disabled.

本文地址:https://blog.csdn.net/qq_48225834/article/details/112644887