我配置拦截器用来拦截不经过我登录页面就放行的页面,而登录页面用了很多静态资源,必须放行才可以有页面效果
1首先与Application文件同级建立2个文件config(配置文件)和interceptor(拦截器文件)如下图所示
2其中config文件下的内容如下
import com.cumt.mem.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 1、编写一个拦截器实现HandlerInterceptor接口
* 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
* 3、指定拦截规则【如果是拦截所有,静态资源也会被拦截】
*/
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
/**
* Filter、Interceptor 几乎拥有相同的功能?
* 1、Filter是Servlet定义的原生组件。好处,脱离Spring应用也能使用
* 2、Interceptor是Spring定义的接口。可以使用Spring的自动装配等功能
*
*/
/**
* 定义拦截资源行为
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //所有请求都被拦截包括静态资源
.excludePathPatterns("/","/index","/register" ,"/static/**"); //放行的请求
//ps 或者在配置中写spring.mvc.static-path-pattern=/static/**,然后在本页面改下,后边直接写/static/,
}
/**
* 添加静态资源文件
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
相关说明在代码中已经体现,注意几点
(1)@Configuration注解说明,表面这个文件是配置文件
(2)放行的请求有url路径为"/" "/index" "/register"的为默认页面(默认页面名字index),以及我的注册页面,"/static/**"为静态资源,我把静态资源全部放入这个文件,如下图
(3)或者在配置文件中写spring.mvc.static-path-pattern=/static/**,然后在本页面改下,后边直接写/static/也可以,配置文件就是下图
3其中interceptor文件下的内容如下
package com.cumt.mem.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 登录检查
* 1、配置好拦截器要拦截哪些请求
* 2、把这些配置放在容器中
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("preHandle拦截的请求路径是{}",requestURI);
//登录检查逻辑 你的可能不是这样,我的controller层set过,你用你的逻辑来检查就可以
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){
//放行
return true;
}
//拦截住。未登录。跳转到登录页
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
/**
* 目标方法执行完成以后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}",modelAndView);
}
/**
* 页面渲染以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}",ex);
}
}
相关说明在代码中已经体现,注意几点
(1)@Slf4j日志注解,下面是用在log.info("XXXX",XXX);中,我是用来看是否执行拦截,拦截结果会在Console中显示,可以删掉
(2)我判断页面是否传数据的逻辑可能和你不一样,就是如下部分,你可以在上面代码部分注释中看见
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){
//放行
return true;
}
//拦截住。未登录。跳转到登录页
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/").forward(request,response);
return false;
如果有帮助 点个赞呗