目录
servlet+filter配合工作解析详见:
模仿天猫商城的J2EE商城网站项目后端——servlet+filter配合详细分析https://blog.csdn.net/qq_37154145/article/details/121623536
模仿天猫商城的J2EE商城网站项目后端7—servlet包https://blog.csdn.net/qq_37154145/article/details/122498512模仿天猫商城的J2EE商城网站项目后端9—web.xmlhttps://blog.csdn.net/qq_37154145/article/details/122519044
ForeServletFilter.java
package tmall.filter;
import org.apache.commons.lang.StringUtils;
import tmall.bean.Category;
import tmall.bean.OrderItem;
import tmall.bean.User;
import tmall.dao.CategoryDAO;
import tmall.dao.OrderItemDAO;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* 网站前台Servlet过滤器
* @author LSB
*/
public class ForeServletFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String contextPath = request.getServletContext().getContextPath();
request.getServletContext().setAttribute("contextPath", contextPath);
// 是否已登录判断
User user = (User) request.getSession().getAttribute("user"); // 获取user信息
int cartTotalItemNumber = 0; // 购物车中订单详情总数
if (null != user) { // 已登录,计算购物车中的订单详情总数
List<OrderItem> orderItems = new OrderItemDAO().listByUser(user.getId());
for (OrderItem orderItem : orderItems) {
cartTotalItemNumber += orderItem.getNumber();
}
}
request.setAttribute("cartTotalItemNumber", cartTotalItemNumber); // 返回到前端
// 若前端分类为空,则将分类填充到前端
List<Category> categories = (List<Category>) request.getAttribute("categories");
if (null == categories) {
categories = new CategoryDAO().list();
request.setAttribute("categories", categories);
}
// uri判断
String uri = request.getRequestURI();
uri = StringUtils.remove(uri, contextPath);
if (null == uri) {
String method = "home";
request.setAttribute("method", method);
servletRequest.getRequestDispatcher("/foreServlet").forward(request, response);
return;
}
if (uri.startsWith("/fore") && !uri.startsWith("/foreServlet")) {
String method = StringUtils.substringAfterLast(uri, "/fore");
request.setAttribute("method", method);
servletRequest.getRequestDispatcher("/foreServlet").forward(request, response);
return;
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
BackServletFilter.java
package tmall.filter;
import org.apache.commons.lang.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 网站后台servlet过滤器。
* 作用是从获取的contextPath和uri中,解析出所需调用的Servlet类和该类的具体方法
* @author LSB
*/
public class BackServletFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String contextPath = request.getServletContext().getContextPath(); // 获得“/tmall”,如“http://localhost:8080/tmall/admin_category_list”中的“/tmall”
String uri = request.getRequestURI(); // 获得访问URI,如“http://localhost:8080/tmall/admin_category_list”中的“/tmall/admin_category_list”
uri = StringUtils.remove(uri, contextPath); // 截取URI访问路径部分,如“/admin_category_list”
if (uri.startsWith("/admin_")) {
String servletPath = StringUtils.substringBetween(uri, "_", "_") + "Servlet"; // categoryServlet
String method = StringUtils.substringAfterLast(uri, "_"); // list
request.setAttribute("method", method); // 将method传递到前端,以便servlet获取method并进行反射
req.getRequestDispatcher("/" + servletPath).forward(request, response); // 跳转到对应的CategoryServlet类中,并调用list方法。服务端跳转,算同一次请求,数据可以放request里传递
return;
}
chain.doFilter(request, response);
}
public void destroy() {
}
public void init(FilterConfig arg0) {
}
}
ForeAuthFilter.java
package tmall.filter;
import org.apache.commons.lang.StringUtils;
import tmall.bean.User;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
/**
* 若访问页面为无须登录页面,直接放行;
* 否则检查是否已登录:已登录放行,未登录跳转到登录页面
* @author LSB
*/
public class ForeAuthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String contextPath = request.getServletContext().getContextPath();
// 无需登录即可访问的页面
String[] noNeedAuthPage = new String[] {
"home",
"checkLogin",
"register",
"loginAjax",
"login",
"product",
"category",
"search"
};
// 以下字符串截取逻辑详见“BackServletFilter.java"
String uri = request.getRequestURI();
uri = StringUtils.remove(uri, contextPath);
if (uri.startsWith("/fore") && !uri.startsWith("/foreServlet")) {
String method = StringUtils.substringAfterLast(uri, "/fore");
// 若截取出来的method不为“noNeedAuthPage”数组中的元素,检查是否已登录,若未登录则跳转到登录页面;否则放行
if (!Arrays.asList(noNeedAuthPage).contains(method)) {
User user = (User) request.getSession().getAttribute("user");
if (null == user) {
response.sendRedirect("login.jsp");
return;
}
}
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
HttpheadFilter.java
package tmall.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* http头过滤器
* @author LSB
*/
@WebFilter(filterName = "HttpheadFilter", urlPatterns = { "/*" })
public class HttpheadFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// response对象
HttpServletResponse res = (HttpServletResponse) response;
// 设定网页的到期时间,一旦过期则必须到服务器上重新调用
res.setDateHeader("Expires", -1);
// Cache-Control 指定请求和响应应遵循的缓存机制 no-cache指示请求或响应消息是不能缓存的
res.setHeader("Cache-Control", "no-cache");
// 用于设定禁止浏览器从本地缓存中调用页面内容,设定后一旦离开页面就无法从Cache中再调出
res.setHeader("Pragma", "no-cache");
// 放行
chain.doFilter(request, res);
}
@Override
public void destroy() {
}
}
EncodingFilter.java
package tmall.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 编码过滤器。编码为UTF-8
* @author LSB
*/
public class EncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) {
}
}