JSP學(xué)習(xí)之Java Web中的安全控制實(shí)例詳解
本文實(shí)例講述了JSP學(xué)習(xí)之Java Web中的安全控制。分享給大家供大家參考。具體如下:
一、目標(biāo):
① 掌握登錄之后的一般處理過(guò)程;
② 能夠?yàn)槊總€(gè)頁(yè)面添加安全控制;
③ 能夠共享驗(yàn)證代碼;
④ 使用過(guò)濾器對(duì)權(quán)限進(jìn)行驗(yàn)證;
⑤ 能夠?qū)ξ募木植績(jī)?nèi)容進(jìn)行驗(yàn)證;
⑥ 掌握安全驗(yàn)證碼的基本實(shí)現(xiàn)方式;
⑦ 通過(guò)異常處理增強(qiáng)安全性。
二、主要內(nèi)容:
① 通過(guò)修改前面的登錄功能,分別對(duì)管理員和普通用戶的登錄進(jìn)行處理;
② 為管理員才能訪問(wèn)的頁(yè)面添加控制;
③ 共享各個(gè)頁(yè)面中的控制代碼,使用專門的文件,然后在需要的時(shí)候調(diào)用;
④ 使用過(guò)濾器降低重復(fù)驗(yàn)證代碼;
⑤ 通過(guò)標(biāo)準(zhǔn)標(biāo)簽庫(kù)完成頁(yè)面局部信息的安全控制;
⑥ 介紹安全驗(yàn)證碼的基本實(shí)現(xiàn)方式;
1、完善登錄功能
正常情況下,管理員登錄成功之后跳轉(zhuǎn)到管理員默認(rèn)工作界面;普通用戶登錄之后跳轉(zhuǎn)到普通用戶默認(rèn)工作界面;用戶登錄失敗后跳轉(zhuǎn)到登錄界面重新登錄。
為了完成這個(gè)功能,需要編寫管理員界面和普通用戶界面。
管理員界面對(duì)應(yīng)的文件為manager.jsp,代碼如下:
manager.jsp代碼:
管理員操作界面
普通用戶界面對(duì)應(yīng)的文件為commonuser.jsp,代碼如下:
commonuser.jsp代碼:
普通用戶界面
修改登錄的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"); // 調(diào)用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、為每個(gè)界面添加安全控制
上面的實(shí)例中登錄成功后會(huì)跳轉(zhuǎn)到管理員界面或者普通用戶界面,但是如果用戶直接輸入管理員界面,就會(huì)跳過(guò)登錄界面。例如用戶可以直接輸入:http://127.0.0.1:8080/ch11/manager.jsp。
為了解決這個(gè)問(wèn)題,在每個(gè)有安全限制的界面都應(yīng)該增加安全控制。需要完成兩項(xiàng)工作:
① 在登錄之后把用戶的信息寫入到session中;
② 在每個(gè)頁(yè)面中,從session中獲取信息進(jìn)行驗(yàn)證;
在登錄之后把用戶信息寫入到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"); // 調(diào)用JavaBean User user = new User(); user = user.findUserByName(username); // 得到session對(duì)象 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對(duì)象中存儲(chǔ)信息 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為例介紹如何在每個(gè)文件中進(jìn)行安全控制,下面是修改后的代碼:
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>
普通用戶界面
這樣,如果不登錄而直接訪問(wèn)commonuser.jsp就會(huì)跳轉(zhuǎn)到登錄界面。
3、采用專門的文件進(jìn)行驗(yàn)證
因?yàn)楹芏囗?yè)面都要編寫驗(yàn)證的代碼,所以可以把這些代碼放在一個(gè)文件中進(jìn)行共享,需要的使用調(diào)用共享文件。下面仍然以commonuser.jsp為例介紹如何實(shí)現(xiàn)驗(yàn)證代碼的共享。
使用專門的文件存放共享代碼:
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>
在需要驗(yàn)證的文件中導(dǎo)入這個(gè)專門的文件。以commonuser.jsp為例:
commonuser.jsp代碼:
<%@ page contentType="text/html;charset=gb2312"%> <%@ include file="check.jsp" %>
普通用戶界面
使用include指令包含目標(biāo)文件,在把JSP轉(zhuǎn)換成Java文件的時(shí)候,會(huì)把目標(biāo)文件的代碼拷貝到當(dāng)前文件。
再運(yùn)行測(cè)試,結(jié)果是相同的。
4、使用過(guò)濾器對(duì)權(quán)限進(jìn)行驗(yàn)證
把具有相同權(quán)限要求的文件放在相同的文件夾下,對(duì)文件夾的訪問(wèn)進(jìn)行統(tǒng)一的過(guò)濾。
編寫用于過(guò)濾的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"); // 進(jìn)行判斷 if(usertype==null || usertype.equals("1")){ ((HttpServletResponse)arg1).sendRedirect("./../login.jsp"); } // 繼續(xù)調(diào)用其他的過(guò)濾器 try{ arg2.doFilter(arg0, arg1); }catch(Exception e){} } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
配置過(guò)濾器,過(guò)濾器的配置與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/*,這樣只要訪問(wèn)commonuser這個(gè)文件夾,就會(huì)訪問(wèn)這個(gè)過(guò)濾器,如果用戶沒(méi)有登錄,將不能訪問(wèn)目標(biāo)文件。
測(cè)試:為了測(cè)試需要?jiǎng)?chuàng)建一個(gè)文件夾commonuser,把commonuser.jsp拷貝到commonuser文件中。
測(cè)試過(guò)程如下:
先直接訪問(wèn):http://127.0.0.1:8080/ch11/commonuser/commonuser.jsp,你會(huì)發(fā)現(xiàn)顯示的是登錄界面,就是因?yàn)闆](méi)有登錄而訪問(wèn)了commonuser中的文件,過(guò)濾器進(jìn)行處理,然后跳轉(zhuǎn)到登錄界面了。
然后在登錄界面輸入正確的用戶名和口令,然后再次在地址欄中輸入上面的地址,這時(shí)候會(huì)看到commonuser.jsp文件的內(nèi)容。表示驗(yàn)證通過(guò)。
5、對(duì)文件局部?jī)?nèi)容的安全進(jìn)行控制
前面介紹的都是文件級(jí)別的安全控制,有時(shí)候需要對(duì)文件中部分內(nèi)容進(jìn)行安全控制,例如物品信息列表這樣的界面,如果當(dāng)前用戶是管理員,則可以在其中完成管理功能,而對(duì)于普通用戶來(lái)說(shuō),而不可以,這就需要進(jìn)行局部的控制。局部控制主要是通過(guò)標(biāo)準(zhǔn)標(biāo)簽庫(kù)中的<c:if>標(biāo)簽來(lái)完成。
6、安全驗(yàn)證碼的基本實(shí)現(xiàn)方式
為了增強(qiáng)網(wǎng)站的安全性,很多網(wǎng)站采用了很多安全措施。例如SSL方式的訪問(wèn)、U盾和口令卡(工商銀行)、信息加密等。安全驗(yàn)證碼是現(xiàn)在比較流行的有效的一個(gè)安全措施,能夠有效的解決用戶通過(guò)遍歷所有可能的組合來(lái)破解密碼的問(wèn)題。
基本工作原理如下:每次客戶端訪問(wèn)服務(wù)器的時(shí)候,服務(wù)器會(huì)生成驗(yàn)證碼,以圖形的形式顯示給用戶,同時(shí)在服務(wù)器上保留備份,用戶在提交信息的時(shí)候需要把驗(yàn)證碼同時(shí)提交道服務(wù)器,服務(wù)器接收到驗(yàn)證碼之后與服務(wù)器端的驗(yàn)證碼進(jìn)行比較,如果相同則進(jìn)行處理。如果不同,則讓用戶重新輸入。因?yàn)槊看味甲兓?,所有用戶如果想破解密碼,首先要應(yīng)付變化的安全驗(yàn)證碼,所以加大了破解的難度。
7、通過(guò)異常處理增強(qiáng)安全性
有時(shí)候用戶的攻擊是根據(jù)網(wǎng)站所使用的服務(wù)器來(lái)進(jìn)行了,因?yàn)楹芏喾?wù)器都有自己的bug。如果不能對(duì)異常進(jìn)行有效的處理,錯(cuò)誤信息會(huì)顯示在客戶端,從錯(cuò)誤信息中可以讓客戶發(fā)現(xiàn)服務(wù)器的版本信息,這樣就為用戶的惡意攻擊提供了便利條件。
例如,用于輸入:http://127.0.0.1:8080/ch11/abc.jsp
而abc.jsp是一個(gè)不存在的文件,這時(shí)候如果不進(jìn)行處理,會(huì)在客戶端顯示服務(wù)器的信息。
如果能夠?qū)Ω鞣N異常進(jìn)行處理,不讓用戶看到你所使用技術(shù)和服務(wù)器,這樣客戶進(jìn)行攻擊的難度就加大了。
曾經(jīng)有一個(gè)學(xué)生作了這樣一件事情:使用JSP技術(shù)完成了一個(gè)網(wǎng)站,然后通過(guò)配置之后,客戶端訪問(wèn)的時(shí)候,使用的文件后綴名都是php,給人的感覺(jué)就像是采用php技術(shù)編寫的網(wǎng)站。
希望本文所述對(duì)大家的JSP程序設(shè)計(jì)有所幫助。
- linux(center OS7)安裝JDK、tomcat、mysql 搭建java web項(xiàng)目運(yùn)行環(huán)境
- 詳解CentOS安裝tomcat并且部署Java Web項(xiàng)目
- centos上安裝配置java WEB環(huán)境
- 使用純Java實(shí)現(xiàn)一個(gè)WebSSH項(xiàng)目的示例代碼
- Java實(shí)現(xiàn)基于NIO的多線程Web服務(wù)器實(shí)例
- Java web三件套listener、filter、servelt原理解析
- Java web xml文件讀取解析方式
- 常見(jiàn)JavaWeb安全問(wèn)題和解決方案
相關(guān)文章
基于javaweb+jsp實(shí)現(xiàn)個(gè)人日記管理系統(tǒng)
這篇文章主要介紹了基于javaweb+jsp實(shí)現(xiàn)的簡(jiǎn)單的個(gè)人日記管理系統(tǒng),文中的示例代碼對(duì)我們學(xué)習(xí)JSP和javaWeb有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-01-01JSP教程之使用JavaBean完成業(yè)務(wù)邏輯的方法
這篇文章主要介紹了JSP教程之使用JavaBean完成業(yè)務(wù)邏輯的方法,較為詳細(xì)的分析了JavaBean完成業(yè)務(wù)邏輯所涉及的相關(guān)概念及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09搭建java WEB開(kāi)發(fā)環(huán)境和應(yīng)用
使用Tomcat服務(wù)器,使用DBCP數(shù)據(jù)源搭建Web開(kāi)發(fā)環(huán)境2009-06-06JSP+jquery使用ajax方式調(diào)用json的實(shí)現(xiàn)方法
這篇文章主要介紹了JSP+jquery使用ajax方式調(diào)用json的實(shí)現(xiàn)方法,以實(shí)例形式較為詳細(xì)的分析了前臺(tái)Ajax調(diào)用及后臺(tái)JSP的處理技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11