1. 程式人生 > >Web開發基礎_Servlet學習_0031_專案練習(十一)

Web開發基礎_Servlet學習_0031_專案練習(十一)

專案名稱:中國電信運營支援系統-網路版(十一)

登入檢查

如果不做登入檢查,會導致任何非法請求都可登入系統,系統安全系會很差。

一般登入檢查都會使用到過濾器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}