模仿天猫商城的J2EE商城网站项目后端8—filter包

目录

ForeServletFilter.java

BackServletFilter.java

ForeAuthFilter.java

HttpheadFilter.java

EncodingFilter.java


servlet+filter配合工作解析详见:

模仿天猫商城的J2EE商城网站项目后端——servlet+filter配合详细分析https://blog.csdn.net/qq_37154145/article/details/121623536

模仿天猫商城的J2EE商城网站项目后端7—servlet包icon-default.png?t=LBL2https://blog.csdn.net/qq_37154145/article/details/122498512模仿天猫商城的J2EE商城网站项目后端9—web.xmlicon-default.png?t=LBL2https://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) {
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值