需求說明:
1、用戶登錄某頁面一段時間之內,如果無任何操作,跳轉至登錄頁面。
2、用戶在非登錄狀態下,無法訪問項目下的某些頁面。
解決方式:
通過session過濾器實現對請求的過濾,如果未登錄跳轉至登錄頁面,如果已登錄直接放行。在過濾器中不對登錄頁面進行過濾,不對css、js、img資源進行過濾。
如果不是前面說的兩種資源,則判斷記錄用戶信息的session是否為空,空則跳轉至登錄頁面、非空則放行。
方法一:Java過濾器實現(推薦)
解決步驟:
步驟一:在項目下配置web.xml文件中配置session
1、設置session失效時間(時間單位為分鍾)
<session-config> <session-timeout>30</session-timeout> </session-config>
2、配置過濾器
<filter> <description>session過濾器</description> <filter-name>sessionFilter</filter-name> <filter-class>com.filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:這里對所有的請求都進行了過濾。也可以在配置過濾器的時候設置某些請求不進行過濾,這里不進行具體的介紹。
步驟二:編寫過濾器類
package com.filter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.model.user.User;public class SessionFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; res.addHeader("Access-Control-Allow-Origin", "*"); String uri = req.getRequestURI();if (uri.indexOf("login") != -1 || uri.indexOf("Login") != -1) { chain.doFilter(req, res); } else if ((uri.contains(".css") || uri.contains(".js") || uri.contains(".jpg") || uri.contains(".png") || uri.contains(".jpng") && !uri.contains(".jsp")) { chain.doFilter(req, res); } else { HttpSession session = req.getSession(); User user = (User) session.getAttribute("user"); String username = ""; if (user != null && !user.equals("")) { username = user.getLoginName(); } if (username != "" && username != null) { chain.doFilter(req, res); } else { session.invalidate(); res.setContentType("text/html;charset=utf-8"); PrintWriter out = res.getWriter(); out.println("<script language='javascript' type='text/javascript'>"); out.println("window.top.location.href='" + req.getContextPath() + "/jsp/login.jsp'"); out.println("</script>"); } } if (uri.indexOf("redirect") != -1) {
if (null != request.getParameter("userimg")) { chain.doFilter(req, res); } } } public void destroy() {
} }
注意:1、這里使用window.top.location.herf,如果使用window.location.herf有時候無法完成跳轉。2、上面的代碼執行時需要用戶在登錄時將用戶信息放入session中。
方法二:Jsp頁面Java代碼實現(了解)
完成方法一的步驟就可以實現一個session過濾器了,過濾器會對請求想要訪問的頁面進行進行請求判斷。如果我們只想對某一個頁面進行session判斷又不想使用過濾器,可以在頁面上使用java代碼進行判斷。
注意這里只對某一個特定的頁面,其他頁面是不能用的。
<% if(session.getAttribute("user") == null) { %> <script type="text/javascript" language="javascript"> top.location.href="<%=basePath%>jsp/login.jsp"; </script> <% } %>