拦截器在springboot项目和ssm架构项目的应用

2020-04-02  本文已影响0人  青青子衿zq

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是逆序执行的。

上一篇下一篇

猜你喜欢

热点阅读