2017-06-01 10 views
0

api-session-tokenをdbに対してチェックするインターセプタを作成しました。それは、私は、コントローラにそれらの値にアクセスしていますインターセプタでreq.setAttributeを使用して設定した値がnullになることがあります。

req.setAttribute("userId", userId); 
req.setAttribute("userRole", userRole); 

を使用して要求オブジェクトにuserIduserRole対応する設定します。これは何度かしか働かない。同じタイプ、同じ値の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; 
} 

} 

答えて

0

であるあなたが正しい、あなたが要求する属性を設定するHandlerInterceptorAdapterを拡張しようとしていますか?

コントローラのリクエスト属性にアクセスしている場所とインターセプタの部分を共有できますか?

[編集]

私は、次の春ブートアプリケーションを作成し、それが例100%で動作します。あなたの属性は実際にはnullではなく、正しく設定されていますか? 一部のフィルタでリクエストがラップされたり置き換えられたりしていませんか?

インターセプタマッピング:

package com.example.demo; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.HandlerInterceptor; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

@Configuration 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    @Autowired 
    HandlerInterceptor userHandlerInterceptor; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(userHandlerInterceptor); 

    } 
} 

インターセプター:

package com.example.demo;

import org.springframework.stereotype.Component; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@Component 
public class UserHandlerInterceptor extends HandlerInterceptorAdapter { 

    public boolean preHandle(HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler) throws Exception { 
     if(request.getMethod().matches(RequestMethod.OPTIONS.name())) { 
      return true; 
     } 
     request.setAttribute("userId", "USER_ID"); 
     return true; 
    } 


} 

コントローラ:

package com.example.demo;

import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@Controller 
public class SampleController { 

    @RequestMapping(value = "/process", method = RequestMethod.GET) 
    @ResponseBody 
    public String downloadProcess(Model model, HttpServletRequest req, HttpServletResponse res){ 
     System.out.println(req.getAttribute("userId")); 
     return ""; 
    } 

} 

+0

詳細を要求添加しました。 –

+0

返事をありがとう。 この特定のAPIには適用されないcors(クロスオリジンリクエスト)フィルタのみがあります。 もう少しテストをしました。これは、同じクライアントから2 **の連続したリクエストが数秒以内に行われた場合にのみ発生します。** –

関連する問題