api-session-token
をdbに対してチェックするインターセプタを作成しました。それは、私は、コントローラにそれらの値にアクセスしていますインターセプタでreq.setAttributeを使用して設定した値がnullになることがあります。
req.setAttribute("userId", userId);
req.setAttribute("userRole", userRole);
を使用して要求オブジェクトにuserId
とuserRole
対応する設定します。これは何度かしか働かない。同じタイプ、同じ値の2つの連続した要求に対して1つは値が異なる間に値を修正すると評価しますnull
私はsetAttribute
を他の場所で使用していないことを確認しました。私はdbから取得している値とreqオブジェクトの設定がnull
ではないことも確認しました。私が正しくあなたを理解している場合
public class ApiSessionInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if(request.getMethod().matches(RequestMethod.OPTIONS.name())) {
return true;
}
setRequest(request);
setResponse(response);
if (!checkSession()) {
throw new HttpUnauthorizedException();
}
return true;
}
private boolean checkSession() {
String sessionKey = getHeaderSessionKey();
if (sessionKey != null) {
Map<String, String> result = apiSessionService.getUserIdAndRoleBySessionKey(sessionKey);
if(result!=null) {
this.setUserId(result.get("user_id"));
this.setUserRole(CommonMethods.getRoleNameFromId(result.get("role_id")));
request.setAttribute("userId", this.getUserId());
request.setAttribute("role", this.getUserRole());
return true;
}
}
return false;
}
}
コントローラは単に
public class SampleController{
@RequestMapping(value = "/process", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public ModelAndView downloadProcess(Model model,
@RequestBody FileDownloadProcessDto fileDownloadProcessDto,
HttpServletRequest req, HttpServletResponse res){
LOGGER.debug("userId:"+ req.getAttribute("userId");
return null;
}
}
詳細を要求添加しました。 –
返事をありがとう。 この特定のAPIには適用されないcors(クロスオリジンリクエスト)フィルタのみがあります。 もう少しテストをしました。これは、同じクライアントから2 **の連続したリクエストが数秒以内に行われた場合にのみ発生します。** –