ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

过滤器

2022-05-17 00:33:20  阅读:130  来源: 互联网

标签:resp req HttpServletResponse 用户 user 过滤器


BaseServlet 使用流程,过滤器

1. 案例

// http://localhost:8080/Day45/student?method=addStudent

@WebServlet("/student")
public class StudentControllerServlet extends BaseServlet {
	public String addStudent(HttpServletRequest req, HttpServletResponse resp) {
        
    }
}
public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 请求编码集和响应编码集统一为 UTF-8
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 获取用户请求参数中的方法名称,明确方法执行目标
        String methodName = req.getParameter("method");

        try {
            // 指定对应目标方法,得到目标转发路径
            String path = (String) this.getClass()
                    .getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class)
                    .invoke(this, req, resp);

            // 如果有返回 path 内容需要完成转发操作,如果没有不执行任务
            if (path != null) {
                req.getRequestDispatcher(path).forward(req, resp);
            }
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

2. 过滤器

2.1 过滤器作用
在 Web 项目中,很多资源需要对用户信息进行校验之后,才可以给予用户访问,例如:
	用户的订单详情,订单列表,地址信息,购物车...
	都是需要用户登陆之后才可以得到对应的数据响应,或者说访问权限。
	
目前咱们的小项目所有的资源都是完全敞开,只要知道路径,资源都可以直接访问。
该功能需要 Java WEB 三大组件之一的 Filter 来完成对应功能 ==> 过滤器

tips:
	Java WEB 三大组件
	Servlet, Filter, Listener
2.2 过滤器 必要方法
过滤器需要遵从接口
     javax.servlet.Filter
必须实现的方法:
     doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
         过滤器核心方法,request和response 是Tomcat服务器对应用户请求 和 给予对应响应
         FilterChain 过滤器放行方法执行对象 ==> doFilter(ServletRequest request, ServletResponse response)
非必要方法 默认方法
     init(FilterConfig filterConfig);
         对当前过滤器对象进行初始化操作,可以用于增强当前过滤器能力,一定的参考参数
         【功能】
             敏感词汇过滤器
             王乾 ==> **
             国粹 ==> **
             *************************************
             init方法来读取敏感词汇限制信息类初始化过滤参数
             同时利用【代理机制】来处理用户提交数据
     void destroy()
         销毁过滤器对象。
2.3 过滤使用流程
1. 明确限制资源路径,资源名称
	哪些需要限制操作,哪些不限制操作
	例如
		用户详情,用户订单,购买操作 需要过滤,用户未登录不能操作
		搜索信息,主页访问,商品详情 可以不用于过滤,用户未登录也可以操作
	
	@WebFilter();
		String[] value
		String[] urlPatterns
		用于配置当前 过滤器限制的资源路径,数据形式为 数组
	/* 整个 Web Application 所有资源全部过滤

2. 需要按照自定义过滤器规则,完整放行操作。
	在 doFilter 中完成规则限制,一般情况下,可以根据用户请求资源路径,以及其他辅助数据来判断是否放行。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("AFilter in");

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        System.out.println("用户请求资源: " + req.getRequestURL());
        // 放行当前用户请求
        String requestURI = req.getRequestURI();
		
    	// 有且只放行资源带有 aServlet 内容
        if (requestURI.contains("aServlet")) {
            chain.doFilter(req, resp);
        } else {
            resp.getWriter().append("<h1>Forbidden Resources</h1>");
        }

        System.out.println("AFilter out");
    }
3. 可以限制过滤器过滤资源路,完成不同的过滤器限制范围
	资源:
		/user
		/user/orderList
	
	@WebFilter("/user")
		/user 过滤器工作
		/user/orderList 过滤器不工作,当前过滤器不限制
	
	@WebFilter(value = {"/user", "/user/orderList"})
		/user 过滤器工作
		/user/orderList 过滤器工作
	
	@WebFilter("/user/*")
		/user 过滤器工作
		/user/orderList 过滤器工作
2.4 过滤器链

	同一个资源需要多重过滤限制,采用 @WebFilter 注解方式配置,按照过滤器的类名字段字典排序。如果采用 @WebFilter 方式限制过滤资源内容,可以考虑利用首字母限制过滤器优先级问题
	
	案例:
		完成需要在登陆之后才可以访问其他资源
		1. 登陆判断过滤器
		2. 编码集过滤器
		3. 敏感词汇过滤器
		
		购物网站,搜索功能
		1. 编码集过滤器
		2. 敏感词汇过滤器
		仅限制需要登陆的资源通过过滤器限制。
2.5 过滤器案例
2.5.1 编码集过滤器
package com.qfedu.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Anonymous 2022/4/22 16:49
 */
// 限制所有资源都需要通过编码集过滤器处理
@WebFilter("/*")
public class AEncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 1. 强转数据类型
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        /*
         2. 仅修用户请求编码集,最终给予用户的响应数据内容和编码形式具体业务逻辑,具体分析
         该过滤器是一个简配版过滤,有且只能处理 Tomcat 8 Tomcat 9 请求编码
         如果是 Tomcat 7 需要其他方式处理编码集
         */
        req.setCharacterEncoding("UTF-8");

        // 3. 放行用户请求
        chain.doFilter(req, resp);
    }
}

标签:resp,req,HttpServletResponse,用户,user,过滤器
来源: https://www.cnblogs.com/A-Nan-q/p/16279237.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有