Java复习第二十天学习笔记(过滤器Filter),附有道云笔记链接

devtools/2024/9/23 9:14:29/

【有道云笔记】二十 4.8 过滤器Filter
https://note.youdao.com/s/dSofip3f

一、为什么要使用过滤器

项目开发中,经常会用到重复代码的实现。

1、请求每个servlet都要设置编码

2、判断用户是否登录,只有登录了才有操作权限。

二、过滤器相关Api

interface Filter 过滤器核心接口

1、init(FilterConfig filterConfig) 初始化方法,在服务器启动的时候就执行

2、doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 过滤器拦截的业务逻辑处理

3、destroy() 销毁过滤器实例的时候调用

interface FilterChain 过滤链

doFilter(ServletRequest request, ServletResponse response)

执行下一个过滤器或放行(访问servlet)

三、案例一:用过滤器处理POST请求编码问题

@WebFilter(filterName = "encoding", urlPatterns = "/*") public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("EncodingFilter.doFilter"); HttpServletRequest request = (HttpServletRequest) servletRequest; // 这个method是get还是post String method = request.getMethod(); // 解决post请求乱码问题 if ("post".equalsIgnoreCase(method)) { request.setCharacterEncoding("UTF-8"); } filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }

四、案例二、用过滤器完成登录

// /* 拦截所有的请求 @WebFilter(filterName = "login", urlPatterns = "/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); System.out.println("LoginFilter.init"); } // ServletRequest servletRequest = new HttpServletRequest() @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("LoginFilter.doFilter"); HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String servletPath = request.getServletPath(); System.out.println("servletPath:" + servletPath); String method = request.getParameter("method"); //这是请求是要去完成登录的,不需要执行后面验证是否登录的流程 if (servletPath.endsWith(".jpg") || servletPath.endsWith(".png") || servletPath.endsWith(".js") || servletPath.endsWith(".css") || servletPath.equals("/login.jsp") || servletPath.equals("/user") && "login".equals(method)) { filterChain.doFilter(servletRequest, servletResponse); return; } HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); if (user == null) { response.sendRedirect("/login.jsp"); return; } //加了这句话代表方行,继续往后执行, //如果还有filter就访问后面filter,没有filter,就可以访问后台资源 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { Filter.super.destroy(); System.out.println("LoginFilter.destroy"); } }

五、web.xml配置servlet和过滤器

servlet和filter除了用注解方式配置,还可以使用xml的方式配置

WEB-INF/web.xml是Web项目的核心配置文件

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- @WebServlet("/student") public class StudentServlet extends HttpServlet { } --> <servlet> <servlet-name>studentServlet</servlet-name> <servlet-class>com.situ.web.controller.StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>studentServlet</servlet-name> <url-pattern>/student</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>com.situ.web.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>login</filter-name> <filter-class>com.situ.web.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>login</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>


http://www.ppmy.cn/devtools/8304.html

相关文章

阿里二面凉了,难蹦。。。

分享一位同学阿里巴巴的后端面经&#xff0c;共有 2 面&#xff0c;第一面很顺利过了&#xff0c;可惜挂在第二面。 这两面的知识点范围&#xff0c;我帮大家罗列一下&#xff1a; 网络&#xff1a;TCP、HTTP mysql&#xff1a;索引应用、索引结构、隔离级别、最左匹配 redis…

JMeter组件--配置元件--JSON断言

JSON断言&#xff08;JSON Assertion&#xff09; 可以对 Jmeter 取样器的响应消息以 JSON 方式进行检查&#xff1b;检测响应报文返回的特征值&#xff0c;进而判断取样器在业务上是否正确&#xff1b; 右键 >>> 添加 >>> 断言 >>> JSON断言&…

LeetCode刷题总结 | 图论1—深度优先搜索广度优先搜索一些简单套模板问题

1.深度优先搜索 1.1 深搜三部曲 1.确认递归函数&#xff0c;参数 void dfs(参数)通常我们递归的时候&#xff0c;我们递归搜索需要了解哪些参数&#xff0c;其实也可以在写递归函数的时候&#xff0c;发现需要什么参数&#xff0c;再去补充就可以。 一般情况&#xff0c;深…

快速掌握Spring监控(Spring Boot admin)

监控 监控可视化监控平台Admin底层逻辑info 自定义端点 监控 监控的作用&#xff1a; 监控服务状态是否宕机监控服务运行指标&#xff08;内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等&#xff09;监控日志管理服务&#xff08;服务下线&#xff09; 监控的实…

230基于matlab的布谷鸟(COA)多目标优化算法

基于matlab的布谷鸟&#xff08;COA&#xff09;多目标优化算法&#xff0c;以 满意度、成本、时间、质量为目标的多目标优化求解代码。程序已调通&#xff0c;可直接运行。 230 matlab 布谷鸟&#xff08;COA&#xff09;多目标优化 - 小红书 (xiaohongshu.com)

PON系统“被动光网络”

目录 光线路终端&#xff08;OLT&#xff09; 光分配网络&#xff08;ODN&#xff09; 光网络单元&#xff08;ONU&#xff09; PON系统&#xff08;Passive Optical Network&#xff0c;被动光网络&#xff09;是一种基于光纤传输的接入网络架构&#xff0c;常用于提供宽带…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

【听劝】别盲目备考NPDP,思维导图助你高效学习

还在为如何高效学习NPDP而苦恼吗&#xff1f; 今天给大家分享NPDP认证考试必备的学习资料&#xff1a;思维导图。 &#xff08;内容来自圣略NPDP资深讲师整理&#xff09; 详细梳理了课本内容&#xff0c;保存到手机学习&#xff0c;非常方便&#xff01; 思维导图会陆续更…