close
 
add this into web.xml
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
 

 
雖然作法挺簡單的,但是要用到的時候會用
spring security AuthenticationProvider session  等字眼當成關鍵字,google 資料,
如此較不易找到適用的文章資源,所以在這邊紀錄一下
 
其實正常想在controller中取得 session 都是從 (HttpServletRequest) req.getSession() 取得
但是在 AuthenticationProvider 中傳入的參數並沒有 HttpServletRequest,所以無法用最直覺的方式取得 session
幸運的是,spring 有 RequestContextHolder 統一控管 進入系統的 request ,
所以在AuthenticationProvider 直接
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    // get user data from session
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    HttpSession session= attr.getRequest().getSession(false);
    if(session == null) {
        return null;
    }
   ...
 }
理應就可以取得想要的 session 了,但是...
不論怎樣的request 進入系統,取出來的東西都是 null ,導致進步使用時都會噴 null point exception...
 
於是在亂撒關鍵字的情況下,讓我找到了救星...
大概意思是,要在 web.xml 中加上  RequestContextListener  ,才有辦法取出正常的 request
然後再對 request 做一些後續的操作 (這篇文章裡根本沒講到 session 這個字眼)
 
最後我是在 spring 啟動會掃描的路徑下加一個config 設定檔就可行了
import javax.servlet.annotation.WebListener;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextListener;
 
@Configuration
@WebListener
public class MyRequestContextListener extends RequestContextListener {
}
 
 
我猜應該跟在 web.xml 中加上  RequestContextListener 同理
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
 
 
 
 
 

arrow
arrow

    sonyvsshadow 發表在 痞客邦 留言(0) 人氣()