首页 > 其他分享 >过滤器

过滤器

时间:2022-10-30 21:11:40浏览次数:37  
标签:request public WebFilter 过滤器 import servlet javax

在创建一个java类的时候,要实现Filter的一个接口,注意:要选择javax.servlet的

 

 

 一、过滤器的实现

1.@WebFilter("/s01")    配置拦截的资源路径

2.doFilter()    方法中需要设置放行,否则请求无法到达资源        filterChain.doFilter(servletRequest,servletResponse);

3.如果是过滤器链(有多个过滤器Filter.java),则先配置的先执行(首字母在前的先执行);响应时,顺序相反。

package com.xxxx.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 拦截路径为s01的资源
 */
@WebFilter("/s01")
//@WebFilter("/*")//拦截所有的请求资源路径
public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter01 init..");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("s01正在过滤...");
        //一定要加上放行资源,不然请求无法到达资源
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
        System.out.println("Filter01 destory...");
    }
}

二、乱码问题

1.POST请求:任意版本的Tomcat都是会乱码的

解决:request.setCharacterEncoding("UTF-8");

2.GET请求:只有Tomcat7及以下的版本才会出现乱码问题

解决:new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");

也可以直接拷入

package com.xxxx.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@WebFilter("/*")
public class AEncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
        //基于HTTP
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        //处理请求乱码(处理POST请求)
        request.setCharacterEncoding("UTF-8");
        //处理GET请求
        String method = request.getMethod();
        //如果是GET请求(不区分大小写)
        if("GET".equalsIgnoreCase(method)){
            //获取服务器版本 Apache Tomcat/9.0.68
            String serverInfo = request.getServletContext().getServerInfo();
            //获取具体的版本号,获取'/'后面'.'前面的1位数字(注意只能取一个数字,如果是10的话就不行了)
            String versionStr = serverInfo.substring(serverInfo.indexOf(("/")+1,serverInfo.indexOf(".")));
            //判断服务器版本是否小于8
            if(Integer.parseInt(versionStr)<8){
                //定义一个内部类继承HttpServletRequest对象像
              HttpServletRequest myRequest = new MyWapper(request);
              //放行资源
                chain.doFilter(myRequest,response);
                return;
            }
        }
        chain.doFilter(request,response);
        return;
    }
    class MyWapper extends HttpServletRequestWrapper {
        // 定义HttpServletRequest对象,用来提升带参构造器中的request
        private HttpServletRequest request;
        public MyWapper(HttpServletRequest request) {
            super(request);
            this.request = request; // 提升作用域
        }
        //重写getParameter()方法
        @Override
        public String getParameter(String name) {
            String value = request.getParameter(name);
            if (value != null && !"".equals((value.trim()))) {
                try {
                    value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return value;
        }
    }
}
View Code

三、实例

 

标签:request,public,WebFilter,过滤器,import,servlet,javax
From: https://www.cnblogs.com/hmy22466/p/16842244.html

相关文章

  • Struts2-3的独有特性与StrutsPrepareAndExecute过滤器源码分析
    action后缀​action​会自动加上.action​,例如<formaction="login"></form>和<formaction="login.action"></form>效果一样。​其他类型转换LoginAction......
  • Struts2-3的独有特性与StrutsPrepareAndExecute过滤器源码分析
    action后缀​action​会自动加上.action​,例如<formaction="login"></form>和<formaction="login.action"></form>效果一样。​其他类型转换LoginAction......
  • 1_js中过滤器filter简单实现
    filterAPI自实现我感觉这个API我用起来不是很顺畅我自己写一个看看分析这是api参考手册设计思路抛开其他的不谈,filter本质上就是原型Array上的一个函数==ap......
  • day03-拦截器,servlet,过滤器,字符过滤器
    第三章Web组件讲三个内容:拦截器,Servlet,Filter3.1拦截器拦截器是SpringMVC中一种对象,能拦截器对Controller的请求。拦截器框架中有系统的拦截器,还可以自定义拦截......
  • Spring中过滤器和拦截器技术
    在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者......
  • 【RocketMQ入门到精通】— RocketMQ初级特性能力 | Message Filter消息过滤,可不是web
    名言警句任何先进的技术均与魔法无异追本溯源【​​经历了6个月的失踪,我将带着干货终究归来!【RocketMQ入门到精通】​​】什么是消息过滤MessageFilter,可不是web容器的过滤......
  • Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
    在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者......
  • java过滤器(java过滤器的实现代码)
    javaaccept()在文件过滤器中的作用?javaaccep  getHostAddress()和s。getPort()作为参数调用安全管理器的checkAccept方法,以确保允许该操作。这可能会导致SecurityEx......
  • Redis中的布隆过滤器
    一、前戏Redis提供了HyperLogLog来解精确度不是很高的统计需求,相比set空间减少了很多,也更方便,但是HyperLogLog只是提供了pfadd添加元素,pfcount统计元素,基于HyperLogLog数......
  • jsp 过滤器
    简介Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤......