servlet过滤器有什么作用,一般用在什么地方??_乐字节java
过滤器
介绍
Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。使用 Filter 的完整流程: Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。
单个过滤器
多个过滤器
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的顺序执行。
在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改 HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse头和数据。
实现
可以通过实现一个叫做javax.servlet.Fileter的接口来实现一个过滤器,其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观察生命周期。
Filter 的实现只需要两步:
Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。
Step2: 通过@WebFilter注解设置它所能拦截的资源。
@WebFilter("/*")
public class Filter01 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {}
}
Filter 接口中有一个 doFilter 方法,当开发人员编写好 Filter,并配置对哪个 web 资源进行拦截后,Web 服务器每次在调用 web 资源的 service 方法之前,都会先调用一下 filter 的 doFilter 方法。因此可以达到如下效果:
调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问 web 资源)。
web 服务器在调用 doFilter 方法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它提供了一个 doFilter 方法,开发人员可以根据需求决定 是否调用此方法,调用该方法,则 web 服务器就会调用 web 资源的 service 方法,即 web 资源就会被访问,否则 web 资源不会被访问。(本质是放行,调用doFilter方法后,即请求可以到达资源)
实例
请求乱码处理
/*** 字符乱码处理* 乱码情况:Tomcat8及以上版本 Tomcat7及以下版本POST请求 乱码,需要处理 乱码,需要处理request.setCharacterEncoding("UTF-8"); GET请求不会乱码,不需要处理 乱码,需要处理new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");如何处理:1、处理POST请求request.setCharacterEncoding("UTF-8");2、处理GET请求且服务器版本在Tomcat8以下的1> 得到请求类型 (GET请求)2> 得到服务器的版本的信息3> 判断是GET请求且Tomcat版本小于84> 处理乱码new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");*/
@WebFilter("/*")
public class AEncodingFilter implements Filter {public AEncodingFilter() {}public void destroy() { }public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {// 基于HTTPHttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;// 处理请求乱码乱码 (处理POST请求)request.setCharacterEncoding("UTF-8"); // 处理GET请求且服务器版本在Tomcat8以下的String method = request.getMethod();// 如果是GET请求if ("GET".equalsIgnoreCase(method)) {// 服务器版本在Tomcat8以下的 Apache Tomcat/8.0.45String serverInfo = request.getServletContext().getServerInfo(); // 得到具体的版本号String versionStr = serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("."));// 判断服务器版本是否小于8if (Integer.parseInt(versionStr) < 8) {// 得到自定义内部类 (MyWapper继承了HttpServletRequestWapper对象,而HttpServletRequestWapper对象实现了HttpServletRequest接口,所以MyWapper的本质也是request对象)HttpServletRequest myRequest = new MyWapper(request);// 放行资源chain.doFilter(myRequest, response);return;}}// 放行资源chain.doFilter(request, response); }public void init(FilterConfig fConfig) throws ServletException {}/*** 定义内部类,继承HttpServletRequestWrapper包装类对象,重写getParameter()方法*/class MyWapper extends HttpServletRequestWrapper {// 定义成员变量,提升构造器 中的request对象的范围private HttpServletRequest request;public MyWapper(HttpServletRequest request) {super(request);this.request = request;}/*** 重写getParameter()方法*/@Overridepublic String getParameter(String name) {String value = request.getParameter(name);if (value != null && !"".equals(value.trim())) {try {// 将默认ISO-8859-1编码的字符转换成UTF-8value = new String(value.getBytes("ISO-8859-1"),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return value;}}
}
用户非法访问拦截
/*** 非法访问拦截(当用户未登录时,拦截请求到登录页面)* 拦截的资源:* 拦截所有资源 /** 需要被放行的资源:* 不需要登录即可访问的资源* 1、放行指定页面,不需要登录可以访问的页面 (例如:登录页面、注册页面等)* 2、放行静态资源(例如:css、js、image等资源)* 3、放行指定操作,不需要登录即可执行的操作(例如:登录操作、注册操作等)* 4、登录状态放行 (如果存在指定sessuin对象,则为登录状态)*/
@WebFilter("/*")
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {// 基于HTTPHttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;// 得到请求的路径String path = request.getRequestURI(); // 站点名/资源路径 // 1、放行指定页面,不需要登录可以访问的页面 (例如:登录页面、注册页面等)if (path.contains("/login.jsp") || path.contains("/register.jsp")) {chain.doFilter(request, response);return;}// 2、放行静态资源(例如:css、js、image等资源)if (path.contains("/js")) {chain.doFilter(request, response);return;}// 3、放行指定操作,不需要登录即可执行的操作(例如:登录操作、注册操作等)if (path.contains("/loginServlet")) {chain.doFilter(request, response);return;}// 4、登录状态放行 (如果存在指定sessuin对象,则为登录状态)// 得到session域对象String uname = (String) request.getSession().getAttribute("user");// 如果session域对象不为空,则为登录状态,放行资源if (uname != null && !"".equals(uname.trim())) {chain.doFilter(request, response);return;} // 若以上条件均不满足,拦截跳转到登录页面response.sendRedirect("login.jsp");return;}
想要更多Java,前端,大数据,微服务等资料点我扫码领取
servlet过滤器有什么作用,一般用在什么地方??_乐字节java相关推荐
- path环境变量的作用与配置-乐字节Java
1. path环境变量的作用 保证javac命令可以在任意目录下运行. 2. path配置的两种方案: 方法 一如下: ①点击计算机->右键->属性 ②高级系统设置 ③高级->环境变 ...
- servlet和jsp页面过滤器Filter的作用及配置
刚刚有个朋友问我,Servlet的过滤器有什么作用? 现在发个帖子说明一下, 过滤器是一个对象,可以传输请求或修改响应.它可以在请求到达Servlet/JSP之前对其进行预处理, ...
- javaweb:servlet过滤器
servlet过滤器能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查 ...
- Java Servlet 过滤器与 springmvc 拦截器的区别?
前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...
- java 该改变request url_如何在Java中使用servlet过滤器来更改传入的servlet请求URL?...
如何使用servlet过滤器来更改传入的servlet请求URL web.xml 至 web.xml ? 更新:根据BalusC的以下步骤,我想出了以下代码: public class UrlRewr ...
- Servlet过滤器Filter和监听器
一.Servlet过滤器的概念: *********************************************************************************** ...
- java servlet过滤器简解及实例
在整个概念中,个人觉得有一篇文章写得不错,通俗易懂,这里就直接套用以上原博文, 一.概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术, ...
- jsp/servlet过滤器和struts2拦截器的有什么区别
jsp/servlet过滤器和struts2拦截器的有什么区别 542430725 | 浏览 3715 次 问题未开放回答 推荐于2016-11-14 01:43:29 最佳答案 过滤器,是在ja ...
- Servlet过滤器与SpringMVC拦截器
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.Web开发人员通过Filter技术,对web服务器 ...
最新文章
- 公式没有编号_知乎公式编辑器的一些小技巧 amp; 使用规范
- 如何设置顶部和底部固定,中间填满
- android 电话 快捷键,Android studio开发常用快捷键详解
- BDD 与DSL 入门
- php transfer-encoding: chunked,php – 使用chunked transfer encoding和gzip
- 【华为云技术分享】原来CTR预估模型的发展有这样的规律
- 数据结构中为什么输入数据还没输入完全就结束了_我岂能忍!面试官居然用数据结构和算法“羞辱”我...
- 重新一步一步学习Lucene.NET 一个简单的程序开始(1)
- fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
- 项目经理的这几个常用套路,你一定要知道!
- atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
- hwclock设置日期_hwclock显示系统硬件时钟的日期和时间
- 如何编辑修改PDF文字
- 鹿晗关晓彤公开恋情,是如何把微博服务器搞炸的? 附大型网站高可用架构和解决方案...
- uni-app使用ucharts地图(主要微信小程序-初步使用)
- 群晖linux文件夹颜色红色,技术干货分享 | 群晖备份Linux文件夹~
- jenkins windows 20008 R2 msi 工作目录迁移
- 【写博客常用】x86,x64,arm都是什么
- oracle 雪峰,讨论 - 廖雪峰的官方网站
- 使用mclust进行聚类分析
热门文章
- 无参考图像的清晰度评价方法 (图像清晰度的评价指标)
- webstorm 自定义快捷键
- seo附加篇-搜索引擎优化
- 领导的决策力提升:抓大放小而果断决策
- message from server: “Host ‘dsy‘ is not allowed to connect to this MySQL server“
- Lwip中实现DM9000/DM9003驱动之一
- 2021-01-18课堂检测二
- unity安卓平台多摄像机显示黑屏问题
- 用户端实现 DDR3 SDRAM 写、读控制
- 微信小程序云数据库+云函数