SpringBoot中使用拦截器
第一步:自定义一个拦截器
第二步:在配置类或者配置xml文件中注册拦截器和指定拦截哪些路径
1.新建登录拦截器
新建一个intercepors包,用来装拦截器。新建登录拦截器LoginInterceptor.java,用来拦截验证登录(就是说没有登录过的用户必须先登录才能进入网站的其他页面)
记得要加@Component注解,因为我们需要在下一步的WebAppConfig.java类中注入这个拦截器类
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("开始拦截");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2.新建配置类WebAppConfig.java
- 新建config包,用来装初始化文件,在下面新建WebAppConfig.java
- 首先将LoginInterceptor.java注入到WebAppConfig.java中
- 然后在WebAppConfig中注册拦截器,使其生效。
addPathPatterns 用来设置拦截路径,excludePathPatterns 用来设置白名单,也就是不需要触发这个拦截器的路径。
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
// 这个方法是用来注册拦截器,我们自己写好的拦截器是需要添加注册才能生效
@Override
public void addInterceptors(InterceptorRegistry registry) {
//.addPathPatterns("/**") 拦截所有请求
registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
.excludePathPatterns("/login");
}
// 这个方法是用来配置静态资源,比如html,css,js等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
}
3. 测试类
@RestController
public class LoginController {
@RequestMapping("/login")
public String login(){
return "login success";
}
@RequestMapping("/home")
public String home(){
return "hello home";
}
}
运行结果,如果输入http://localhost:8080/home,后台会输出“开始拦截”;如果输入http://localhost:8080/login,不会被拦截,正常输出"login success"
4.登录拦截器的使用
最简单的一个登录拦截器是通过判断session中是否有用户信息,当我们第一次登录成功后,就将自己的信息以键值对的形式记录到session中,第二次登录时,判断session中是否有用户信息,如果有就是已经登录过了,如果没有就是未登录。
@Component
public class LoginInterceptor implements HandlerInterceptor {
//这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。
HttpSession session = request.getSession();
//这里的User是登陆时放入session的
User user = (User) session.getAttribute("user");
//如果session中没有user,表示没登陆
if (user == null){
//这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
//当然你可以利用response给用户返回一些提示信息,告诉他没登陆
return false;
}else {
return true; //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
SSM中使用拦截器
- 拦截器同上
- 配置文件spring.xml
<!--设置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截哪些路径-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<!--注册拦截器-->
<bean class="com.msj.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>