当前位置:网站首页>Filter
Filter
2022-04-21 11:22:00 【碳水碳水だいすき】
Filter
Tips
凡是要对多个Servlet进行统一处理的代码,都可以写在Filter中
作用:
- 记录消息日志: 需要记录哪个IP,什么时间访问了什么请求,传入了哪些参数…
- 记录异常日志: 对全局异常进行处理
- 控制访问权限: 系统某些功能或者所有功能都需要登录后才能使用。
- 字符集设置
示例
这是登录页面 login.jsp <br>
<form action="/loginServlet" method="get">
用户名:<input type="text" name="username"/> <br>
密 码:<input type="password" name="password"/> <br>
<input type="submit" />
</form>
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
resp.setContentType("text/html; charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("admin".equals(username) && "123456".equals(password)) {
req.getSession().setAttribute("user",username);
resp.getWriter().write("登录成功!!!");
} else {
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
@WebFilter("/*")
public class AdminFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
} else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
如果不使用注解,则需要在web.xml中配置
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配置拦截路径 / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录 /admin/* 表示请求地址为:http://ip:port/工程路径/admin/* -->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
生命周期
@WebFilter("/*")
public class MyFilter implements Filter {
public MyFilter() {
System.out.println("1.构造方法,启动服务器的时候执行");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.初始化方法,启动服务器的时候执行");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("3.doFilter,访问任何经过该过滤器的页面都会执行一次");
// 执行后续
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("4.destroy,关闭服务器的时候执行");
}
}
FilterConfig 类
Tips
Filter 过滤器的配置文件类,Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类
拦截路径设置同 Servlet 中的 url-pattern 设置
Filter 作用:
- 获取 Filter 的名称 filter-name 的内容
- 获取在 Filter 中配置的 init-param 初始化参数
- 获取 ServletContext 对象
示例
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.Filter 的 init(FilterConfig filterConfig)初始化");
// 1、获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
// 2、获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数 username 的值是:" + filterConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是:" + filterConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
//org.apache.catalina.core.ApplicationContextFacade@d359b2b
System.out.println(filterConfig.getServletContext());
}
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter>
FilterChain 过滤器链
-
在多个Filter过滤器执行的时候,它们执行的优先顺序,是由web.xml中配置的顺序决定的,从上到下
-
所有filter和目标资源默认都执行在同一个线程中
-
多个Filter共同执行的时候,它们都使用同一个Request对象
-
如果某 Filter 内没有写 doFilter,那么从该Filter开始返回,不再继续往下执行
即服务器认为执行到底了

版权声明
本文为[碳水碳水だいすき]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_66395289/article/details/124311805
边栏推荐
- 刷题&比赛&复习
- Matlab --- progress bar animation demonstration
- Suffix array application
- IDEA的LeetCode力扣插件设置
- 以用户体验五要素的思路,如何编写产品需求文档(PRD)
- Matlab GUI application - lottery (animation demonstration)
- Matlab GUI --- complex drawing mode (animation demonstration)
- 我这边需要写两个接受数据的接口,然后把数据存入数据库,完成数据持久化
- Huisheng Huiying 2022 releases 8 new features of Huisheng Huiying 2022 (official)
- 站长如何防止网站被黑
猜你喜欢
随机推荐
Packet life cycle in kubernetes -- Part 1
MATLAB---坐标轴多图片显示
分享:Web 网页设计规范
AES encryption and decryption with cryptojs
MATLAB GUI---SingleSelectionListBox动画演示
MQ相關流程及各項內容
Nocalhost for dapr remote debugging
MATLAB---进度条动画演示
【玩转Lighthouse】内网穿透FRP搭建
粉笔科技推行OMO一体化模式 双核驱动营收快速增长
互联网快讯:拓荆科技成功登陆科创板;极米H3S、极米Z6X Pro持续热销;盒马在上海启动“流动超市”
org. apache. flink. client. deployment. ClusterDeploymentException: Could not deploy Yarn job cluster.
为什么各大APP都推出了适老版?
如何快速搭建一个像叮咚买菜这样的APP?
2. Precision marketing practice Alibaba cloud odpscmd data feature project
MQ processus et contenu pertinents
左程云 - 大厂刷题班 - 一种字符在左,另一种字符在右的最少交换次数
以用户体验五要素的思路,如何编写产品需求文档(PRD)
Suffix Array
[二叉数]对称二叉树
![[binary number] symmetric binary tree](/img/15/a1285ae7f31dd2e9f7b00350b1fdc6.png)







