因为拦截器在 Bean 初始化之前进行,所以在拦截器中无法像这样注入 Bean
- @Autowired
- private UserRepository userRepository;
为了解决这个问题,我们在拦截器方法里,创建一个 BeanFactory 的实例,然后调用其 getBean() 方法来获取我们需要的 Bean 实例。
比如我们这里需要获取 userRepoditory 对象,可以这样(37-38行)
- public class SessionInterceptor implements HandlerInterceptor {
- @Autowired
- private UserRepository userRepository;
- /**
- * 在请求处理之前进行调用(Controller方法调用之前)
- */
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- return true;
- }
- /**
- * 在请求处理之后调用,但是在视图被渲染之前(Controller方法调用之后)
- *
- * @param request
- * @param response
- * @param handler
- * @param modelAndView
- * @throws Exception
- */
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
- System.out.println("拦截了");
- if(request.getSession().getAttribute("user") == null) {
- //如果用户授权存在,添加Session
- try {
- SecurityContext securityContext = SecurityContextHolder.getContext();
- Authentication authentication = securityContext.getAuthentication();
- Object principal = authentication.getPrincipal();
- if (principal != null && principal instanceof UserDetails) {
- String username = ((UserDetails) principal).getUsername();
- if(userRepository == null) {
- BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
- userRepository = (UserRepository) factory.getBean("userRepository");
- User user = userRepository.findByUsername(username);
- request.getSession().setAttribute("user", user);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 在整个请求调用之后被调用,也就是在 DispatcherServlet 渲染了对应的视图后执行(主要用于资源清理)
- *
- * @param request
- * @param response
- * @param handler
- * @param ex
- * @throws Exception
- */
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
- }
- }
- 微信
- 赶快加我聊天吧
-
- 博客/Java交流群
- 资源分享,问题解决,技术交流。群号:590480292
-