过滤器Filter

一,什么是过滤器?
JavaWeb三大组件之一.
Filter,与Servlet很相似,不过过滤器是用来拦截请求的,而Servlet是用来处理请求的.
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter通过,那么会继续执行用户请求的Servlet,如果无法通过Filter,那么就无法执行用户请求的Servlet.
利用Filter可以实现对输入框的校验,如果不通过校验.可以直接拒绝不会去访问Servlet.这样节省了资源.还可以利用Filter解决整个web项目的中文编码问题.
下面展示EncodeFilter文件解决编码问题

@WebFilter(filterName = "EncodingFilter",urlPatterns = "/*")
//在注解里的名字写上本过滤器的名字EncodingFilter,url地址因为是检测整个项目,
//所以地址写”/*”,”/*"代表所有JSP与所有Servlet.这样只要JSP与Servlet有访问,
//就会走到本过滤器来,已达到检测修改整个项目中文编码传输问题
public class EncodingFilter implements Filter {
    public void destroy() {
    }
//创建文件的时候选择创建Filter型,这样会直接创建一个过滤器,并且直接将生命周期的三个方法写好,
//我们只需要在doFilter()方法,也就是运行时期访问的方法,在这里写判断就好了    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        EncodingRequest equest = new EncodingRequest((HttpServletRequest)req);
        //这里会调用下面的EncodingRequest的方法
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //chain.doFilter(),这个为放行,也就是通过上面的一系列判断之后,如果输入流满足要求,
        //会执行这个方法,也就是将请求的参数传入到Servlet中,因为本类检测所有Servlet,所以,
        //放行的时候传入到响应的Servlet中,也就是,请求访问的Servlet地址
        chain.doFilter(equest, resp);
    }

    public void init(FilterConfig config) throws ServletException {
    }

}

由于此方法不能批量过滤get请求的参数,所以我们还需要写一个EncodingRequest的类来转换编码格式

public class EncodingRequest extends HttpServletRequestWrapper {
//这里需要继承HttpServletRequestWrapper
    private HttpServletRequest request;

    public EncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
    //这里要对请求方式进行判断,判断是GET还是POST
        if (request.getMethod().toUpperCase().equals("GET")) {
        //获得请求中的参数值
            String value = request.getParameter(name);
            try {
            //获得这个值对应的字节数组,将字节数组根据utf-8的格式,创建出一个字符串对象
                value = new String(value.getBytes("iso-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return value;
        }else {
            try {
                request.setCharacterEncoding("UTF-8");
                return request.getParameter(name);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

到此,通过过滤器解决全局编码格式就演示完成了,每次用的时候只需要建立一个Encoding的文件夹,将这两个类放进去就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值