私はSpring MVCプロジェクトを開発しています。私は独自の認証インターセプタを実装したいと思います。それは次のようになります。インターセプタの現在のユーザを取得し、コントローラ内のリソースを取得する方法
@Component
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
@Autowired
private UsersRepo usersRepo;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) return true;
HandlerMethod handlerMethod = (HandlerMethod) handler;
if (handlerMethod.getMethodAnnotation(Authenticated.class) == null) return true;
HttpSession session = request.getSession(false);
if (session == null) return reject(response);
Long id = (Long) session.getAttribute("userId");
if (id == null) return reject(response);
User user = usersRepo.findOne(id);
if (user == null) return reject(response);
RequestContext.CURRENT_USER.set(user);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
RequestContext.CURRENT_USER.remove();
}
private boolean reject(HttpServletResponse response) {
response.setStatus(403);
return false;
}
}
RequestContext.CURRENT_USER
はThreadLocal<User>
です。コントローラで
、私は、現在のユーザーの注文を取得したい:
@RestController
@RequestMapping("/orders")
public class OrdersController {
@RequestMapping(method = RequestMethod.GET)
@Authenticated
public Collection<Order> index() {
Collection<Order> orders = RequestContext.CURRENT_USER.get().getOrders();
return orders;
}
}
それは私にCould not write content: failed to lazily initialize a collection of role: myapp.models.User.orders, could not initialize proxy - no Session
を与えます。
私はそれが迎撃に現在User
を見つける仕事をしていたときに、Hibernateは、データベースのセッションを閉じたので、それは別のセッションでOrder
SをロードするためにUser
ことを使用することができませんだからそれはだと思います。しかし、私は本当にデータベースをもう一度打つことは望まない。現在のユーザーをインターセプターにロードして、そのユーザー・インスタンスを再利用してより多くのリソースをロードするにはどうすればよいですか?
_ _ _ "どのように私は迎撃に現在のユーザーを読み込むことができます「しかし、私は本当に。再びデータベースをヒットしたくない」と、よりロードするために、そのユーザーのインスタンスを再利用しますリソース "_それはかなりの矛盾です。 – zeroflagL