2016-09-21 22 views
0

好的,所以我基本上想要一個會話檢查器,它將請求特定會話名稱屬性並檢查是否存在。如果不存在,則會重定向到登錄頁面。這聽起來很簡單,但我有重定向的問題。Java - 檢查會話並重定向如果不存在

當我刪除重定向,只是打印if語句下的一些文本,它會打印在頁面上。但是當我嘗試重定向時,它不會。 的代碼包含在頁面的開始時,控制器的一個文件下有

<jsp:include page="/radnikSession" /> 

我寫它看起來像這樣的代碼。

String id; 

HttpSession session = request.getSession(false); 
id = (String)session.getAttribute("sessionRadnikID"); 

if(id == null) { 
    //out.println("No session id"); 
    response.sendRedirect("login.jsp"); 
} 

我在做什麼錯?

+0

警惕的是'session'可能爲空! 'getSession'返回當前會話;如果沒有,則會返回null,除非該方法傳遞了'true',這會導致創建並返回全新的會話。無論如何,你看到了什麼行爲,因爲你提供的內容應該可以工作(假設你沒有遇到NullPointerException)。 – nasukkin

+0

你可能不想檢查'null',而且如果它有任何內容。我停止對幾乎所有的字符串進行'null'檢查,並切換到'StringUtils.isBlank(...)'和'StringUtils.isNotBlank(...)'。正如nasukkin所說,如果會話爲空,你也可能會隱藏一個隱藏的錯誤。 –

+0

將'false'傳遞給'request.getSession()'有什麼意義?如果請求不是會話的一部分,那麼你肯定會創建一個,對嗎?否則,登錄頁面將在哪裏存儲會話屬性?如果你傳遞'true'(或者使用'getSession()'的其他版本),那麼你不必擔心返回null。 –

回答

0

事情是這樣:

public class SecurityFilter implements Filter 
{ 
    public SecurityFilter() 
    { 
    } 

    public void init(FilterConfig conf) throws ServletException 
    { 
    } 
    public void destroy() 
    { 
    } 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) { 
     String id; 

     HttpSession session = request.getSession(false); 
     id = (String)session.getAttribute("sessionRadnikID"); 

     if(id == null) { 
      //out.println("No session id"); 
      response.sendRedirect("login.jsp"); 
     } else { 
      chain.doFilter(servletRequest, servletResponse); 
     } 
    } 
} 

然後在你的web.xml配置它,像:

<filter> 
    <filter-name>Security Page Filter</filter-name> 
    <filter-class>com.mystuff.security.SecurityFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Security Page Filter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 
+0

感謝您的幫助,我讓ID以某種方式工作。但是我有關於重定向的問題。 <過濾器映射> SessionFilter /管理/ * 如何有過濾所有的頁面,除了login.jsp的。我想你知道我要去哪裏。管理面板的所有頁面都包含login.jsp。現在我正面臨無限重定向。 –

+0

您可以檢查請求對象以查看頁面請求是否是您的登錄頁面或登錄servlet。您需要將「ServletRequest」轉換爲「HttpServletRequest」,並使用getRequestURL和/或getRequestURI檢查請求的URL是否爲您的登錄頁面,如果是,請執行「chain.doFilter(...)」比重定向。 – slambeth

+0

下面是另一個示例,您可以查看有關如何完成此操作的想法:http://cse.csusb.edu/turner/java_web_programming/security/filter/ – slambeth

相關問題