过滤器-filter
1. what
过滤器:拦截不符合过滤要求的请求,使其无法到达目标地
用在什么地方:同一认证校验,同一编码设置等
2. 如何创建filter
2.1 通过xml完成
1. 创建一个过滤器类
步骤:
public class MyFilter implements Filter
filterChain.doFilter(servletRequest,servletResponse);
return;
- package com.zmq.filter;
- import javax.servlet.*;
- import javax.servlet.annotation.WebFilter;
- import java.io.IOException;
- /**
- * @program: web03work
- * @description: 过滤器
- * @author: zmq
- * @create: 2024-05-11 08:59
- **/
- public class MyFilter 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("====过滤器====");
- //放行
- filterChain.doFilter(servletRequest,servletResponse);
- System.out.println("===过滤器放行了===");
- }
- @Override
- public void destroy() {
- //销毁过滤器-浏览器或服务器关闭时
- }
- }
复制代码 2. 注册过滤器并设置拦截规则
- <!--注册过滤器-->
- <filter>
- <filter-name>MyFilter</filter-name>
- <filter-class>com.ykq.filter.MyFilter</filter-class>
- </filter>
- <!--过滤规则-->
- <filter-mapping>
- <filter-name>MyFilter</filter-name>
- <!--
- /*:表示拦截所有的请求
- /views/*: 只拦截包含views/资源
- /*.do: 拦截请求后缀未.do资源
- -->
- <url-pattern>/*</url-pattern>
- </filter-mapping>
复制代码 2.2 使用注解
- @WebFilter(filterName = "MyFilter",urlPatterns = "/*")
- public class MyFilter 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("====过滤器====");
- //放行
- filterChain.doFilter(servletRequest,servletResponse);
- System.out.println("===过滤器放行了===");
- }
- @Override
- public void destroy() {
- //销毁过滤器-浏览器或服务器关闭时
- }
- }
复制代码 3. 使用过滤器完成同一认证校验
- ServletRequest是HttpServletRequest的父类,所以在获取请求路径前,需要将其强转为子类,因为父类中没有获取请求路径的方法
- 获取请求路径:getServletPath()
- HttpServletRequest request = (HttpServletRequest) servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- //哪些资源允许匿名访问 login.jsp页面 LoginServlet处理接口 注册页面 注册的处理接口 图片 css js
- //1.获取请求路径
- String path = request.getServletPath();
复制代码
- 同样,session对象需要通过getSession方法获取
- //登录成功的用户
- HttpSession session = request.getSession();
- User user = (User)session.getAttribute("user");
复制代码- @WebFilter(urlPatterns = "/*")
- public class LoginFilter implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- //ServletRequest是HttpServletRequest的父类
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- //哪些资源允许匿名访问 login.jsp页面 LoginServlet处理接口 注册页面 注册的处理接口 图片 css js
- //1.获取请求路径
- String path = request.getServletPath();
- if ("/login.jsp".equals(path) ||
- "/LoginServlet".equals(path) ||
- path.endsWith(".jpg") ||
- path.endsWith(".gif") ||
- path.endsWith(".png") ||
- path.endsWith(".css") ||
- path.endsWith(".js")
- ) {
- //放行
- filterChain.doFilter(request,response);
- return;
- }
- //登录成功的用户
- HttpSession session = request.getSession();
- Object user = session.getAttribute("user");
- if(user!=null){ //访问者登录成功过
- //放行
- filterChain.doFilter(request,response);
- return;
- }
- //跳转到login.jsp
- response.sendRedirect("/login.jsp");
- }
- @Override
- public void destroy() {
- }
- }
复制代码 4. 编码过滤器
因为客户对编码的需求不同,可能需要自己调整编码格式,所以需要通过在xml文件中初始化encoding值来设置编码格式。
- <!--注册过滤器-->
- <filter>
- <filter-name>MyFilter</filter-name>
- <filter-class>com.ykq.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
复制代码 在类中设置encoding变量,用于接收初始化后的值
- private String encoding="gbk";
- //初始化---只会执行一次
- encoding=filterConfig.getInitParameter("encoding");
- servletRequest.setCharacterEncoding(encoding); //ISO-8859-1 java源码一旦写完就无法修改
- servletResponse.setCharacterEncoding(encoding);
- //放行
- filterChain.doFilter(servletRequest,servletResponse);
复制代码- public class EncodingFilter implements Filter {
- private String encoding="gbk";
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- //初始化---只会执行一次
- encoding=filterConfig.getInitParameter("encoding");
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- servletRequest.setCharacterEncoding(encoding); //ISO-8859-1 java源码一旦写完就无法修改
- servletResponse.setCharacterEncoding(encoding);
- //放行
- filterChain.doFilter(servletRequest,servletResponse);
- }
- @Override
- public void destroy() {
- //销毁方法--当服务器重启或关闭时
- }
- }
复制代码- <!--注册过滤器-->
- <filter>
- <filter-name>MyFilter</filter-name>
- <filter-class>com.ykq.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <!--过滤规则-->
- <filter-mapping>
- <filter-name>MyFilter</filter-name>
- <!--
- /*:表示拦截所有的请求
- /views/*: 只拦截包含views/资源
- /*.do: 拦截请求后缀未.do资源
- -->
- <url-pattern>/*</url-pattern>
- </filter-mapping>
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |