问题
- 发现在过滤器、拦截器当中注入Service的时候会报null。
Filter
- 因为在Filter中不能直接注入spring容器里面的对象,然后自己从容器里面取出来。
- 代码:
@Configuration
public class UrlFilter implements Filter {
@Autowired
private UserInfoService userInfoService;
@Bean
public FilterRegistrationBean setBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter( new UrlFilter() );
bean.addUrlPatterns("/*");
System.out.println("注入了 filter");
return bean;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
String url = request.getRequestURI() ;
// 获取 servlet上下文
ServletContext sc = request.getSession().getServletContext();
// 获取 spring 容器
AbstractApplicationContext cxt = (AbstractApplicationContext) WebApplicationContextUtils.getWebApplicationContext(sc);
if(cxt != null && cxt.getBean("userInfoService") != null && userInfoService == null){
// 取出 userInfoService
userInfoService = (UserInfoService) cxt.getBean("userInfoService");
}
UserInfo userInfo = new UserInfo();
userInfo.setTitle( url );
userInfo.setPassword("filter");
userInfo.setUsername("filter");
userInfoService.insert(userInfo);
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
HandlerInterceptor拦截器
-
拦截器和过滤器的一个区别,过滤器不支持
@Autowired
注入,但是 拦截器支持@Autowired
注入的 -
在
WebMvcConfigurer
中配置添加@Bean
@Configuration
public class URLHandlerConfig implements WebMvcConfigurer {
// 重点,需要添加Bean
@Bean
public URLHandlerInterceptor setBean2(){
System.out.println("注入了handler");
return new URLHandlerInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
//由于spring boot 2.x依赖的spring 5.x版本,使用spring 5.x时,静态资源也会执行自定义的拦截器
//所有导致静态资源不可访问的问题
String [] exculudes = new String[]{"/*.html","/html/**","/js/**","/css/**","/images/**"};
registry.addInterceptor(setBean2()).addPathPatterns("/**").excludePathPatterns(exculudes);
}
}
HandlerInterceptorAdapter
使用代码
@Configuration
public class URLHandlerInterceptor extends HandlerInterceptorAdapter {
// 这里注入的service可以直接使用
@Autowired
private UserInfoService userInfoService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI() ;
UserInfo userInfo = new UserInfo();
userInfo.setTitle( url );
userInfo.setPassword("handle");
userInfo.setUsername("handle");
userInfoService.insert(userInfo);
// false 前端会显示 200
// true 前端显示 404
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
// 放行
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 放行
super.afterCompletion(request, response, handler, ex);
}
}
文章评论