拦截器在springboot项目和ssm架构项目的应用
1.拦截器的主要功能
在访问某节点url前拦截客户端发来的请求,判断该请求是否符合自己定义的要求,如果不符合,返回false,该节点url的对应代码不会被执行;如果符合,返回true,可以执行该节点url。
2.在springboot项目中的应用方法
假设有这么一个场景:某电商网站的商品必须登陆后才能查看内容,否则无法进入商品页,那么处理方法就是使用拦截器,具体如下:
创建一个类,命名LoginIntercepter ,该类实现HandlerInterceptor接口,该类上加上@Component注解,加载进spring容器中
实现接口后,有三个方法需要我们处理,分别是preHandle,postHandle,afterCompletion;其中preHandle是访问controller接口之前执行的,在这里我们要写相关逻辑,判断登录状态;postHandle调用前提是preHandle返回true,它是在controller接口方法执行完毕和DispatcherServlet进行视图的渲染之前进行的;afterCompletion用于DispatcherServlet进行视图的渲染之后,多用于清理资源。这里主要用preHandle方法,代码如下:
//这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
//每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。
HttpSession session = request.getSession();
//这里的User是登陆时放入session的
String user = (String) session.getAttribute("username");
//如果session中没有user,表示没登陆
if (user ==null){
//这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
//可以重定向到登录接口,让为登录的用户去先登录
response.sendRedirect("/luckmoney/nongyebank");
return false;
}else {
return true;//如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
}
}
至于postHandle和afterCompletion可以不写。
下面开始配置拦截器,代码如下:
@Configuration //生命配置类,该类实现WebMvcConfigurer 接口
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private LoginIntercepter loginIntercepter; //注入自己写的拦截器
// 这个方法是用来配置静态资源的,比如html,js,css,等等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效,addPathPatterns("/**")即是添加的拦截路径,也就是拦截controller的所有接口;.excludePathPatterns("/nongyebank","/login")即是放行的controller接口,这些接口不会被拦截,常用的登录接口和注册接口等不必拦截。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginIntercepter).addPathPatterns("/**").excludePathPatterns("/nongyebank","/login");
}
}
这样springboot的拦截器配置完成,这是一个登录的拦截器,目的是防止用户跨过登录直接访问其他内容。
2.在ssm架构项目中的应用方法
ssm架构项目就是spring,springmvc,mybaties的整合,这里的拦截器,主要是在xml中配置的,但是,自己也要定义一下拦截器
假设还是登录拦截的需求,自己写的拦截器和上一个springboot项目的一样,只是在配置上不一样了,springboot用的是注解形式来配置自己的拦截器,而ssm则是在xml中配置,这里是在spring-mvc.xml中配置拦截器:
配置如下
<mvc:interceptors>
<mvc:interceptor>
<!--
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录
-->
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/aileqi/user"/>
<mvc:exclude-mapping path="/aileqi/register"/>
<mvc:exclude-mapping path="/img/*"></mvc:exclude-mapping>
<mvc:exclude-mapping path="/js/*"></mvc:exclude-mapping>
<bean id="commonInterceptor" class="com.ssm.intercepter.MemberIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
这里,放行的仍然是注册登录和js,img等静态资源,用<bean>标签将自己写的拦截器注入spring容器中,运行项目,可以发现只有放行的接口可以访问,其他的需要在登录后才能访问。
这样,拦截器在springboot项目和ssm架构项目的应用就简单实现了。
另外:如果配置多个拦截器,preHandle方法会按照配置的顺序顺序执行,而postHandle和afterCompletion是逆序执行的。