家居網購項目實現013 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 32.功能30-會員不能登錄後臺管理 32.1需求分析/圖解 管理員admin登錄後,可以訪問所有頁面 會員登錄後,不能訪問後臺管理相關頁面,其他頁面可以訪 ...
家居網購項目實現013
以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git
32.功能30-會員不能登錄後臺管理
32.1需求分析/圖解
- 管理員admin登錄後,可以訪問所有頁面
- 會員登錄後,不能訪問後臺管理相關頁面,其他頁面可以訪問
- 說明:假定管理員就是“admin”,其他皆為會員名
32.2思路分析
修改許可權驗證AutoFilter
添加邏輯:用戶已經登錄過了,但是用戶名不為admin且訪問的url中包含/manage/,就說明是非法用戶訪問後臺,將其轉發到首頁即可。
32.3代碼實現
AutoFilter:
package com.li.furns.filter;
import com.google.gson.Gson;
import com.li.furns.entity.Member;
import com.li.furns.utils.WebUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
/**
* 這是用於許可權驗證的過濾器,對指定的url進行驗證
* 如果登錄過,就放行;如果沒有登錄,就返回登錄頁面
*
* @author 李
* @version 1.0
*/
public class AuthFilter implements Filter {
//後面我們把要排除的url放入到excludedUrls中
private List<String> excludedUrls;
public void init(FilterConfig config) throws ServletException {
//獲取到配置的excludedUrls
String strExcludedUrls = config.getInitParameter("excludedUrls");
//進行分割
String[] splitUrl = strExcludedUrls.split(",");
//將splitUrl轉成List,賦給excludedUrls
excludedUrls = Arrays.asList(splitUrl);
System.out.println("excludedUrls=>" + excludedUrls);
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//許可權驗證
HttpServletRequest req = (HttpServletRequest) request;
//得到請求的url
String url = req.getServletPath();
//判斷是否要驗證
if (!excludedUrls.contains(url)) {//如果url不在配置的規則中,就進行校驗
//得到session中的member對象
Member member = (Member) req.getSession().getAttribute("member");
if (member == null) {//說明用戶沒有登錄過
....
....
....
}
return;//返回
} else {//否則說明用戶已經登錄過了
if (!member.getUsername().equals("admin") && url.contains("/manage/")) {
//如果該用戶不是admin但請求的url屬於後臺管理,就將其轉發到首頁
req.getRequestDispatcher("/index.jsp").forward(request, response);
return;//返回
}
}
}
//否則就放行
chain.doFilter(request, response);
}
}
32.4完成測試
登錄普通用戶
直接在地址欄訪問後臺資源,訪問失敗,頁面被轉發到首頁:
33.功能31-解決圖片冗餘的問題
33.1需求分析/圖解
- 家居圖片都放在一個文件夾,會越來越多,請嘗試在assets/images/product-image/目錄下 自動創建 年月日目錄,比如21001010,以天為單位來存放上傳圖片
- 當上傳新家居圖片,原來的圖片就沒有用了,應當刪除原來的家居圖片
33.2思路分析
-
創建年月日目錄按天存放圖片
解決方案:在創建保存路徑時添加當天的時間即可
-
刪除原來的家居圖片
解決方案:在保存新圖片的同時,在資料庫中獲取舊圖片的路徑,然後刪除舊圖片即可
33.3代碼實現
utils包WebUtils:
public static String getYearMonthDay() {
//如何得到當前的日期
LocalDateTime ldt = LocalDateTime.now();
int year = ldt.getYear();
int monthValue = ldt.getMonthValue();
int dayOfMonth = ldt.getDayOfMonth();
String yearMonthDay = "/" + year + "/" + monthValue + "/" + dayOfMonth;
return yearMonthDay;
}
web層修改FurnServlet.update()方法
/**
* 處理修改家居的請求
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//....略
File fileRealPathDirectory =
new File(fileRealPath + WebUtils.getYearMonthDay());//構建帶有日期的目錄
if (!fileRealPathDirectory.exists()) {//如果文件目錄不存在
fileRealPathDirectory.mkdirs();//創建
}
//....略
//獲取舊的家居文件圖片路徑
String oldImgPath = furn.getImgPath();
//獲取舊圖片的絕對路徑
String oldImgRealPath = req.getServletContext().getRealPath(oldImgPath);
//刪除記憶體中舊的圖片,防止圖片占用空間過大
File file = new File(oldImgRealPath);
if (file.exists()) {
file.delete();//刪除舊圖片
}
//更新資料庫中家居的圖片路徑
furn.setImgPath(WebUtils.FURN_IMG_DIRECTORY + WebUtils.getYearMonthDay() + "/" + name);
//....略
}
33.4完成測試
登錄後臺管理,修改家居圖片:
寫入新的家居信息,點擊修改:
成功修改了信息:
伺服器按照年月日的目錄存放圖片,並且將舊圖片刪除:
34.功能32-完成分頁導航條
34.1需求分析/圖解
- 如果總頁數<=5,就顯示全部頁數
- 如果總頁數>5,就按照如下規則顯示:
- 如果 當前頁數 是前3頁,就顯示1-5頁
- 如果 當前頁數 是後3頁,就顯示最後5頁
- 如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可
34.2思路分析
略
34.3代碼實現
furn_manage.jsp(部分)
<ul>
<%--如果當前頁大於1,就顯示上一頁--%>
<c:if test="${requestScope.page.pageNo>1}">
<li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上頁</a></li>
</c:if>
<%-- 顯示所有的分頁數
先確定開始頁數 begin 第一頁
再確定結束頁數 end 第page.TotalCount頁
--%>
<%--
1. 如果總頁數<=5,就顯示全部頁數
2. 如果總頁數>5,就按照如下規則顯示:
- 如果 當前頁數 是前3頁,就顯示1-5頁
- 如果 當前頁數 是後3頁,就顯示最後5頁
- 如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可
這裡的關鍵就是要根據不同的情況來初始化begin,end
--%>
<c:choose>
<%--如果總頁數<=5,就顯示全部頁數--%>
<c:when test="${requestScope.page.pageTotalCount <= 5}">
<c:set var="begin" value="1"/>
<c:set var="end" value="${requestScope.page.pageTotalCount}"/>
</c:when>
<%--如果總頁數>5,就按照如下規則顯示--%>
<c:when test="${requestScope.page.pageTotalCount > 5}">
<c:choose>
<%--如果 當前頁數 是前3頁,就顯示1-5頁--%>
<c:when test="${requestScope.page.pageNo <= 3}">
<c:set var="begin" value="1"/>
<c:set var="end" value="5"/>
</c:when>
<%--如果 當前頁數 是後3頁,就顯示最後5頁--%>
<c:when test="${requestScope.page.pageNo > requestScope.page.pageTotalCount -3}">
<c:set var="begin" value="${requestScope.page.pageTotalCount - 4}"/>
<c:set var="end" value="${requestScope.page.pageTotalCount}"/>
</c:when>
<%--如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可--%>
<c:otherwise>
<c:set var="begin" value="${requestScope.page.pageNo - 2}"/>
<c:set var="end" value="${requestScope.page.pageNo + 2}"/>
</c:otherwise>
</c:choose>
</c:when>
</c:choose>
<c:forEach begin="${begin}" end="${end}" var="i">
<%--如果i為當前頁,就使用class=active來修飾--%>
<c:if test="${i==requestScope.page.pageNo}">
<li><a class="active" href="manage/furnServlet?action=page&pageNo=${i}">${i}</a></li>
</c:if>
<c:if test="${i!=requestScope.page.pageNo}">
<li><a href="manage/furnServlet?action=page&pageNo=${i}">${i}</a></li>
</c:if>
</c:forEach>
<%-- --%>
<%-- 如果當前頁小於總頁數,就往下一頁--%>
<c:if test="${requestScope.page.pageNo < requestScope.page.pageTotalCount}">
<li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下頁</a></li>
</c:if>
<li><a>共${requestScope.page.pageTotalCount}頁</a></li>
<li><a>共${requestScope.page.totalRow}記錄</a></li>
</ul>
index.jsp同理