本文執行個體講述了JSP學習之Java Web中的安全控制。分享給大家供大家參考。具體如下:
一、目標:
① 掌握登入之後的一般處理過程;
② 能夠為每個頁面添加安全控制;
③ 能夠共用驗證代碼;
④ 使用過濾器對許可權進行驗證;
⑤ 能夠對檔案的局部內容進行驗證;
⑥ 掌握安全驗證碼的基本實現方式;
⑦ 通過異常處理增強安全性。
二、主要內容:
① 通過修改前面的登入功能,分別對管理員和普通使用者的登入進行處理;
② 為管理員才能訪問的頁面添加控制;
③ 共用各個頁面中的控制碼,使用專門的檔案,然後在需要的時候調用;
④ 使用過濾器降低重複驗證代碼;
⑤ 通過標準標籤庫完成頁面局部資訊的安全控制;
⑥ 介紹安全驗證碼的基本實現方式;
1、完善登入功能
正常情況下,管理員登入成功之後跳轉到管理員預設工作介面;普通使用者登入之後跳轉到普通使用者預設工作介面;使用者登入失敗後跳轉到登入介面重新登入。
為了完成這個功能,需要編寫管理員介面和普通使用者介面。
管理員介面對應的檔案為manager.jsp,代碼如下:
manager.jsp代碼:
複製代碼 代碼如下:
<%@ page contentType="text/html;charset=gb2312"%>
管理員操作介面
普通使用者介面對應的檔案為commonuser.jsp,代碼如下:
commonuser.jsp代碼:
複製代碼 代碼如下:
<%@ page contentType="text/html;charset=gb2312"%>
普通使用者介面
修改登入的Servlet,修改後的代碼如下:
LoginProcess.java代碼:
package servlet;import javabean.User;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginProcess extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 擷取資訊 String username = request.getParameter("username"); String userpass = request.getParameter("userpass"); // 調用JavaBean User user = new User(); user = user.findUserByName(username); String forward; if(user==null){ forward="failure.jsp"; }else if(user.getUserpass().equals(userpass)){ if(user.getUsertype().equals("1")){ forward="manager.jsp"; } else{ forward="commonuser.jsp"; } }else{ forward="failure.jsp"; } RequestDispatcher rd = request.getRequestDispatcher(forward); rd.forward(request,response); }}
2、為每個介面添加安全控制
上面的執行個體中登入成功後會跳轉到管理員介面或者普通使用者介面,但是如果使用者直接輸入管理員介面,就會跳過登入介面。例如使用者可以直接輸入:http://127.0.0.1:8080/ch11/manager.jsp。
為瞭解決這個問題,在每個有安全限制的介面都應該增加安全控制。需要完成兩項工作:
① 在登入之後把使用者的資訊寫入到session中;
② 在每個頁面中,從session中擷取資訊進行驗證;
在登入之後把使用者資訊寫入到session中,下面是修改後的LoginProcess.java代碼:
LoginProcess.java代碼:
package servlet;import javabean.User;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginProcess extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 擷取資訊 String username = request.getParameter("username"); String userpass = request.getParameter("userpass"); // 調用JavaBean User user = new User(); user = user.findUserByName(username); // 得到session對象 HttpSession session = request.getSession(true); String forward; if(user==null){ forward="failure.jsp"; }else if(user.getUserpass().equals(userpass)){ if(user.getUsertype().equals("1")){ // 在session對象中儲存資訊 session.setAttribute("usertype","1"); forward="manager.jsp"; } else{ session.setAttribute("usertype","0"); forward="commonuser.jsp"; } }else{ forward="failure.jsp"; } RequestDispatcher rd = request.getRequestDispatcher(forward); rd.forward(request,response); }}
以commonuser.jsp為例介紹如何在每個檔案中進行安全控制,下面是修改後的代碼:
commonuser.jsp代碼:
<%@ page contentType="text/html;charset=gb2312"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><c:if test="${usertype!=/"0/"}"> <jsp:forward page="login.jsp"/></c:if>
普通使用者介面
這樣,如果不登入而直接存取commonuser.jsp就會跳轉到登入介面。
3、採用專門的檔案進行驗證
因為很多頁面都要編寫驗證的代碼,所以可以把這些代碼放在一個檔案中進行共用,需要的使用調用共用檔案。下面仍然以commonuser.jsp為例介紹如何?驗證代碼的共用。
使用專門的檔案存放共用代碼:
check.jsp代碼:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><c:if test="${usertype!=/"0/"}"> <jsp:forward page="login.jsp"/></c:if>
在需要驗證的檔案中匯入這個專門的檔案。以commonuser.jsp為例:
commonuser.jsp代碼:
<%@ page contentType="text/html;charset=gb2312"%><%@ include file="check.jsp" %>
普通使用者介面
使用include指令包含目標檔案,在把JSP轉換成Java檔案的時候,會把目標檔案的代碼拷貝到當前檔案。
再運行測試,結果是相同的。
4、使用過濾器對許可權進行驗證
把具有相同許可權要求的檔案放在相同的檔案夾下,對檔案夾的訪問進行統一的過濾。
編寫用於過濾的Servlet,代碼如下:
CommonCheck.java代碼:
package servlet;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.HttpServlet;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CommonCheck extends HttpServlet implements Filter {public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // 得到session HttpSession session = ((HttpServletRequest)arg0).getSession(true); // 得到使用者類型 String usertype = (String)session.getAttribute("usertype"); // 進行判斷 if(usertype==null || usertype.equals("1")){ ((HttpServletResponse)arg1).sendRedirect("./../login.jsp"); } // 繼續調用其他的過濾器 try{ arg2.doFilter(arg0, arg1); }catch(Exception e){}}public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub}}
配置過濾器,過濾器的配置與Servlet的配置非常類似,在web.xml中添加如下代碼:
<filter> <filter-name>CommonCheck</filter-name> <filter-class>servlet.CommonCheck</filter-class></filter> <filter-mapping> <filter-name>CommonCheck</filter-name> <url-pattern>/commonuser/*</url-pattern> </filter-mapping>
url-pattern中使用/commonuser/*,這樣只要訪問commonuser這個檔案夾,就會訪問這個過濾器,如果使用者沒有登入,將不能訪問目標檔案。
測試:為了測試需要建立一個檔案夾commonuser,把commonuser.jsp拷貝到commonuser檔案中。
測試過程如下:
先直接存取:http://127.0.0.1:8080/ch11/commonuser/commonuser.jsp,你會發現顯示的是登入介面,就是因為沒有登入而訪問了commonuser中的檔案,過濾器進行處理,然後跳轉到登入介面了。
然後在登入介面輸入正確的使用者名稱和口令,然後再次在地址欄中輸入上面的地址,這時候會看到commonuser.jsp檔案的內容。表示驗證通過。
5、對檔案局部內容的安全進行控制
前面介紹的都是檔案層級的安全控制,有時候需要對檔案中部分內容進行安全控制,例如物品資訊列表這樣的介面,如果目前使用者是管理員,則可以在其中完成管理功能,而對於普通使用者來說,而不可以,這就需要進行局部的控制。局部控制主要是通過標準標籤庫中的<c:if>標籤來完成。
6、安全驗證碼的基本實現方式
為了增強網站的安全性,很多網站採用了很多安全措施。例如SSL方式的訪問、U盾和口令卡(工商銀行)、資訊加密等。安全驗證碼是現在比較流行的有效一個安全措施,能夠有效解決使用者通過遍曆所有可能的組合來破解密碼的問題。
基本工作原理如下:每次Client Access Server的時候,伺服器會產生驗證碼,以圖形的形式顯示給使用者,同時在伺服器上保留備份,使用者在提交資訊的時候需要把驗證碼同時提交道伺服器,伺服器接收到驗證碼之後與伺服器端的驗證碼進行比較,如果相同則進行處理。如果不同,則讓使用者重新輸入。因為每次都變化,所有使用者如果想破解密碼,首先要應付變化的安全驗證碼,所以加大了破解的難度。
7、通過異常處理增強安全性
有時候使用者的攻擊是根據網站所使用的伺服器來進行了,因為很多伺服器都有自己的bug。如果不能對異常進行有效處理,錯誤資訊會顯示在用戶端,從錯誤資訊中可以讓客戶探索服務器的版本資訊,這樣就為使用者的惡意攻擊提供了便利條件。
例如,用於輸入:http://127.0.0.1:8080/ch11/abc.jsp
而abc.jsp是一個不存在的檔案,這時候如果不進行處理,會在用戶端顯示伺服器的資訊。
如果能夠對各種異常進行處理,不讓使用者看到你所使用技術和伺服器,這樣客戶進行攻擊的難度就加大了。
曾經有一個學生作了這樣一件事情:使用JSP技術完成了一個網站,然後通過配置之後,用戶端訪問的時候,使用的檔案尾碼名都是php,給人的感覺就像是採用php技術編寫的網站。
希望本文所述對大家的JSP程式設計有所協助。