Web開發基礎_Servlet學習_0031_專案練習(十一)
阿新 • • 發佈:2018-12-10
專案名稱:中國電信運營支援系統-網路版(十一)
登入檢查
如果不做登入檢查,會導致任何非法請求都可登入系統,系統安全系會很差。
一般登入檢查都會使用到過濾器Filter。基於此我們新增此功能。
案例演示:
工程案例目錄結構
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>netctoss</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>main</servlet-name> <servlet-class>web.MainServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>main</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- 每頁顯示行數 --> <context-param> <param-name>size</param-name> <param-value>5</param-value> </context-param> <!-- 錯誤頁面:當伺服器捕獲到此類異常時, 它會自動轉發到對應的錯誤頁面。 伺服器在做此轉發行為時,會自動補充專案名, 因此轉發頁面的絕對路徑不需要加專案名了。 --> <!-- 1.指定某型別的異常對應某錯誤頁面 --> <!-- <error-page> <exception-type> java.lang.Exception </exception-type> <location>/WEB-INF/error.jsp</location> </error-page> --> <!-- 2.指定某編號的錯誤對應某錯誤頁面 --> <error-page> <error-code>404</error-code> <location>/WEB-INF/error.jsp</location> </error-page> <error-page> <error-code>405</error-code> <location>/WEB-INF/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/error.jsp</location> </error-page> <!-- 登入檢查過濾器 --> <filter> <filter-name>login</filter-name> <filter-class>web.LoginFilter</filter-class> <!-- 宣告不需要檢查的路徑 --> <init-param> <param-name>ignorePath</param-name> <param-value> /toLogin.do,/createImg.do,/login.do </param-value> </init-param> </filter> <filter-mapping> <filter-name>login</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> </web-app>
LoginFilter.java
package web; import java.io.IOException; 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; /** * 登入檢查過濾器: * 在所以的(不包括登入相關的請求)請求前, * 判斷使用者是否已登入,若已登入則請求繼續, * 否則拒絕使用者的請求,重定向到登入頁。 * @author Cher_du * */ public class LoginFilter implements Filter{ private String[] paths; public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //Tomcat傳入的引數是HTTP相關引數, //就是當前引數的子型別,可以強轉。 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; //刪除掉不需要校驗的請求 // String[] paths = new String[]{ // "/toLogin.do", // "/createImg.do", // "/login.do" // }; for(String path:paths){ if(path.equals(request.getServletPath())){ //如果當前路徑等於排查的路徑, //則當前路徑不需要檢驗了,放行 chain.doFilter(req, res); return; } } System.out.println("過濾放行。。。下面將校驗登入狀態。。"); //從session中獲取adminCode, //以此來判斷使用者是否已登入。 HttpSession session = request.getSession(); Object adminCode= session.getAttribute("adminCode"); if(adminCode == null){ System.out.println("未登入。。。"); //未登入,重定向到登入頁 response.sendRedirect(request.getContextPath()+"/toLogin.do"); }else{ System.out.println("已登入。。。"); //已登入,請求繼續 chain.doFilter(req,res); System.out.println("登入狀態過濾後。。。"); } } public void init(FilterConfig cfg) throws ServletException { String ignorePath = cfg.getInitParameter("ignorePath"); paths =ignorePath.split(","); } }
將netctoss工程部署到Tomcat上,執行Tomcat啟動案例工程,
由於處於未登入狀態 所以被重定向到登入頁
對應【退出】按鈕旁邊的賬號 caocao 在每個功能頁新增如下賬號資訊info.jsp頁面即可
info.jsp
<%@page pageEncoding="utf-8"%>
<span>${cookie.adminCode.value }</span>
<a href="/netctoss/logout.do">[退出]</a>
findCost.jsp、add.jsp、update.jsp 查詢頁面的 Logo區域 新增 info.jsp
點選退出按鈕的請求 logout.do 對應後臺
MainServlet.java 中新增紅線圈中的程式碼即可:
點選退出按鈕後即可退出重定向到登入頁面:
A. A
B.
拓展:
在JSP上獲取專案名
JSP表示式
- <%=request.getContextPath()%>
- 修改info.jsp
EL表示式
- ${contextPath} -> request.getAttribute("contextPath")
- ${pageContext.request} -> request
- ${pageContext.request.contextPath}