JSP學(xué)習(xí)之Java Web中的安全控制實例詳解
本文實例講述了JSP學(xué)習(xí)之Java Web中的安全控制。分享給大家供大家參考。具體如下:
一、目標:
① 掌握登錄之后的一般處理過程;
② 能夠為每個頁面添加安全控制;
③ 能夠共享驗證代碼;
④ 使用過濾器對權(quán)限進行驗證;
⑤ 能夠?qū)ξ募木植績?nèi)容進行驗證;
⑥ 掌握安全驗證碼的基本實現(xiàn)方式;
⑦ 通過異常處理增強安全性。
二、主要內(nèi)容:
① 通過修改前面的登錄功能,分別對管理員和普通用戶的登錄進行處理;
② 為管理員才能訪問的頁面添加控制;
③ 共享各個頁面中的控制代碼,使用專門的文件,然后在需要的時候調(diào)用;
④ 使用過濾器降低重復(fù)驗證代碼;
⑤ 通過標準標簽庫完成頁面局部信息的安全控制;
⑥ 介紹安全驗證碼的基本實現(xiàn)方式;
1、完善登錄功能
正常情況下,管理員登錄成功之后跳轉(zhuǎn)到管理員默認工作界面;普通用戶登錄之后跳轉(zhuǎn)到普通用戶默認工作界面;用戶登錄失敗后跳轉(zhuǎn)到登錄界面重新登錄。
為了完成這個功能,需要編寫管理員界面和普通用戶界面。
管理員界面對應(yīng)的文件為manager.jsp,代碼如下:
manager.jsp代碼:
管理員操作界面
普通用戶界面對應(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、為每個界面添加安全控制
上面的實例中登錄成功后會跳轉(zhuǎn)到管理員界面或者普通用戶界面,但是如果用戶直接輸入管理員界面,就會跳過登錄界面。例如用戶可以直接輸入:http://127.0.0.1:8080/ch11/manager.jsp。
為了解決這個問題,在每個有安全限制的界面都應(yīng)該增加安全控制。需要完成兩項工作:
① 在登錄之后把用戶的信息寫入到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");
// 調(diào)用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就會跳轉(zhuǎn)到登錄界面。
3、采用專門的文件進行驗證
因為很多頁面都要編寫驗證的代碼,所以可以把這些代碼放在一個文件中進行共享,需要的使用調(diào)用共享文件。下面仍然以commonuser.jsp為例介紹如何實現(xià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>
在需要驗證的文件中導(dǎo)入這個專門的文件。以commonuser.jsp為例:
commonuser.jsp代碼:
<%@ page contentType="text/html;charset=gb2312"%> <%@ include file="check.jsp" %>
普通用戶界面
使用include指令包含目標文件,在把JSP轉(zhuǎn)換成Java文件的時候,會把目標文件的代碼拷貝到當前文件。
再運行測試,結(jié)果是相同的。
4、使用過濾器對權(quán)限進行驗證
把具有相同權(quán)限要求的文件放在相同的文件夾下,對文件夾的訪問進行統(tǒng)一的過濾。
編寫用于過濾的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");
}
// 繼續(xù)調(diào)用其他的過濾器
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這個文件夾,就會訪問這個過濾器,如果用戶沒有登錄,將不能訪問目標文件。
測試:為了測試需要創(chuàng)建一個文件夾commonuser,把commonuser.jsp拷貝到commonuser文件中。
測試過程如下:
先直接訪問:http://127.0.0.1:8080/ch11/commonuser/commonuser.jsp,你會發(fā)現(xiàn)顯示的是登錄界面,就是因為沒有登錄而訪問了commonuser中的文件,過濾器進行處理,然后跳轉(zhuǎn)到登錄界面了。
然后在登錄界面輸入正確的用戶名和口令,然后再次在地址欄中輸入上面的地址,這時候會看到commonuser.jsp文件的內(nèi)容。表示驗證通過。
5、對文件局部內(nèi)容的安全進行控制
前面介紹的都是文件級別的安全控制,有時候需要對文件中部分內(nèi)容進行安全控制,例如物品信息列表這樣的界面,如果當前用戶是管理員,則可以在其中完成管理功能,而對于普通用戶來說,而不可以,這就需要進行局部的控制。局部控制主要是通過標準標簽庫中的<c:if>標簽來完成。
6、安全驗證碼的基本實現(xiàn)方式
為了增強網(wǎng)站的安全性,很多網(wǎng)站采用了很多安全措施。例如SSL方式的訪問、U盾和口令卡(工商銀行)、信息加密等。安全驗證碼是現(xiàn)在比較流行的有效的一個安全措施,能夠有效的解決用戶通過遍歷所有可能的組合來破解密碼的問題。
基本工作原理如下:每次客戶端訪問服務(wù)器的時候,服務(wù)器會生成驗證碼,以圖形的形式顯示給用戶,同時在服務(wù)器上保留備份,用戶在提交信息的時候需要把驗證碼同時提交道服務(wù)器,服務(wù)器接收到驗證碼之后與服務(wù)器端的驗證碼進行比較,如果相同則進行處理。如果不同,則讓用戶重新輸入。因為每次都變化,所有用戶如果想破解密碼,首先要應(yīng)付變化的安全驗證碼,所以加大了破解的難度。
7、通過異常處理增強安全性
有時候用戶的攻擊是根據(jù)網(wǎng)站所使用的服務(wù)器來進行了,因為很多服務(wù)器都有自己的bug。如果不能對異常進行有效的處理,錯誤信息會顯示在客戶端,從錯誤信息中可以讓客戶發(fā)現(xiàn)服務(wù)器的版本信息,這樣就為用戶的惡意攻擊提供了便利條件。
例如,用于輸入:http://127.0.0.1:8080/ch11/abc.jsp
而abc.jsp是一個不存在的文件,這時候如果不進行處理,會在客戶端顯示服務(wù)器的信息。
如果能夠?qū)Ω鞣N異常進行處理,不讓用戶看到你所使用技術(shù)和服務(wù)器,這樣客戶進行攻擊的難度就加大了。
曾經(jīng)有一個學(xué)生作了這樣一件事情:使用JSP技術(shù)完成了一個網(wǎng)站,然后通過配置之后,客戶端訪問的時候,使用的文件后綴名都是php,給人的感覺就像是采用php技術(shù)編寫的網(wǎng)站。
希望本文所述對大家的JSP程序設(shè)計有所幫助。
相關(guān)文章
JAVA/JSP學(xué)習(xí)系列之八(改寫MySQL翻頁例子)
JAVA/JSP學(xué)習(xí)系列之八(改寫MySQL翻頁例子)...2006-10-10
基于javaweb+jsp實現(xiàn)學(xué)生宿舍管理系統(tǒng)
這篇文章主要介紹了基于javaweb+jsp實現(xiàn)的學(xué)生宿舍管理系統(tǒng)的示例代碼,文中的代碼介紹詳細,對我們學(xué)習(xí)JSP有一定的幫助,需要的朋友可以參考一下2021-12-12
JSP程序運行原理、文檔結(jié)構(gòu)及簡單輸入輸出實例分析
這篇文章主要介紹了JSP程序運行原理、文檔結(jié)構(gòu)及簡單輸入輸出,以完整實例形式較為詳細的分析了JSP程序的運行原理、文檔結(jié)構(gòu)及簡單輸入輸出詳細技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
web開發(fā)之對比時間大小的工具函數(shù)的實例詳解
這篇文章主要介紹了web開發(fā)之對比時間大小的工具函數(shù)的實例詳解的相關(guān)資料,這里提供實現(xiàn)代碼幫助大家學(xué)習(xí)理解這部分知識,需要的朋友可以參考下2017-08-08
JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
前幾天老師讓作幾個JSP連接數(shù)據(jù)庫的例子,而且連接的數(shù)據(jù)庫是Access數(shù)據(jù)庫,對于這個數(shù)據(jù)庫自己也不是太了解,后來了解到學(xué)習(xí)JDBC的時候,連接access是很方便的,很容易的,但是在連接的時候也出現(xiàn)了問題,但是還是解決了2013-05-05
JBuilder2005實戰(zhàn)JSP之切換控制 圖文步驟
由于在login.jsp的表單中通過action屬性指定switch.jsp為響應(yīng)的JSP文件,當用戶在login.jsp中選定登錄用戶,輸入密碼提交表單后,客戶端將向服務(wù)器發(fā)送一個HTTP請求,服務(wù)器即調(diào)用switch.jsp來響應(yīng)這個請求2012-08-08

