Interceptor(拦截器)
传统拦截器的写法:
SpringBoot实现自定义拦截器方法:
相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebMvcConfigurerAdapter。
第一步创建一个类实现HandlerInterceptor接口,重写接口的方法,只是多了一个@Component注解,这个注解是为后面的使用时进行注入。例:
1.SessionInterceptor
package com.example.demo;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by 20160216 on 2018/2/8.
*/
public class SessionInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println("uri="+request.getRequestURI());
//登录不做拦截
if(request.getRequestURI().equals("/userbg/login") || request.getRequestURI().equals("/user/login_view"))
{
return true;
}
//验证session是否存在
Object obj = request.getSession().getAttribute("_session_user");
if(obj == null)
{
response.sendRedirect("/user/login_view");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
2.SessionConfiguration
package com.example.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* Created by 20160216 on 2018/2/8.
*/
@Configuration
public class SessionConfiguration extends WebMvcConfigurerAdapter
{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(newSessionInterceptor()) //指定拦截器类
.addPathPatterns("/**"); //指定该类拦截的url
}
}
小结:
通过对比我们可以明确的看到,SpringBoot实现自定义拦截器跟传统不一样的地方只是将XML配置变更为JAVA配置而已。
Filter(过虑器)
传统过虑器的写法:
SpringBoot实现自定义过虑器方法:
@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
MsgUtils.println("自定义过滤器->doFilter");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
也可以不要@WebFilter(urlPatterns = "/*")这个注解,另外在Application文件或者另外建立一个配置文件进行配置就可以了。
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filterRegist() {
FilterRegistrationBean frBean = new FilterRegistrationBean();
frBean.setFilter(new CustomFilter());
frBean.addUrlPatterns("/*");
return frBean;
}
}
如果需要配置多个过滤器,需要添加 registration.setOrder(i);这一句,括号中是优先级,数值越大优先级越高。具体可参考http://blog.csdn.net/mzh1992/article/details/66970924
AOP(面向切面编程)
传统面向切面编程写法:
SpringBoot实现自定义面向切面编程方法:
小结
服务器接受到的请求都会被filter首先拦截,并可以预处理request, 而拦截器可以调用IOC容器中的各种依赖,filter就不能获取注解信息并拦截,因为它和框架无关,但拦截器不能修改request,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,而@Aspect与Interceptor的都是基于spring aop的实现,@Aspect粒度更细 。他们的拦截顺序:filter—>Interceptor—->@Aspect 、