SpringBoot登录拦截的实现

先编写拦截器类

拦截器类有两种实现方式(参考自https://blog.csdn.net/u013905744/article/details/78335001):
1.一种是实现HandlerInterceptor 接口


public class MyInterceptor1 implements HandlerInterceptor {
    //该方法在action执行前执行,可以实现对数据的预处理,
    // 比如:编码、安全控制等。如果方法返回true,则继续执行action。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
            Exception {
        System.out.println("MyInterceptor1 action之前执行!!!");
        return true;  //继续执行action
    }
 
    ////该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
            modelAndView) throws Exception {
        System.out.println("MyInterceptor1 action执行之后,生成视图之前执行!!");
    }
 
    //最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。
    //因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1 最后执行!!!一般用于释放资源!!");
    }
}

2.另一种是继承HandlerInterceptorAdapter:


public class MyInterceptor2  extends HandlerInterceptorAdapter{
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
            Exception {
        System.out.println("MyInterceptor2.preHandle()");
        return true;  //继续执行action
    }
}

举一个我自己写的登录拦截器:

@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {

	
	// 请求之前的处理
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if (user == null) {
			// 没登陆则转到/admin,即会访问登录页面
			request.setAttribute("message", "您还没有登录,请先登录!");
			request.getRequestDispatcher("/admin").forward(request, response);
			return false;
		}
		
		return true;
	}


	
	
}

个人感觉区别在于继承拦截器的适配器可以使重写的方法少一些,对于只需要preHandle方法的功能如登录拦截,使用继承适配器可能使代码更简洁。

接下来在配置类中配置拦截的路径

我这里因为做的博客项目,只需要拦截后台管理界面(/admin),前台展示界面是不需要拦截的,可根据实际需要设置。

@Configuration
public class LoginInterceptorConfiguration implements WebMvcConfigurer {
	
	@Autowired
	private LoginInterceptor loginInterceptor;
	

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(loginInterceptor)
		.addPathPatterns("/admin/**") // 这个是拦截的路径
		.excludePathPatterns("/admin") // 下面两个是不拦截的路径
		.excludePathPatterns("/admin/login");
	}

	
	
	
}

另外,在SSM项目中可能需要配置xml文件去配置拦截路径。这里就不展示了,都比较类似。

发布了14 篇原创文章 · 获赞 15 · 访问量 522

猜你喜欢

转载自blog.csdn.net/CodingNO1/article/details/104407802