美文网首页java技术学习
java后端-Filter过滤器

java后端-Filter过滤器

作者: PandaXiong | 来源:发表于2017-03-18 20:39 被阅读183次

Filter一定会随着tomcat的启动自启动。
开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

通过对filter过滤器的了解,可以得知在以下三种情况下可以做些处理:

  1. 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。

2.通过在调用chain.doFilter方法之前,做些处理来达到某些目的。比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。

3.通过在调用chain.doFilter方法之后,做些处理来达到某些目的。比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。

配置:
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>filter.EncodingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在web.xml中进行filter的配置,和servlet的配置很类似

<url-pattern>/*</url-pattern>

表示所有的访问都会过滤
如果配置成

<url-pattern>*.jsp</url-pattern>

就表示只过滤jsp

例子:
那就是通过Filter过滤器进行中文处理 ,那么所有的Servlet都不需要单独处理了。

@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

//因为这个过滤器的存在,在登陆之前所有的资源都不能访问。 所以在login.jsp上如果有图片,js和css,也不能够正常显示和工作。这样做当然是不行的,那么如何让js css和图片文件即使在不登陆的情况下,也可以访问

@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String uri = request.getRequestURI();
        if (uri.endsWith("login.html") || uri.endsWith("login")) {
            chain.doFilter(request, response);
            return;
        }

//如果访问的资源是以css或者js结尾的,那么就不需要判断是否登录
        if (uri.endsWith(".css") || uri.endsWith(".js")) {
            chain.doFilter(request, response);
            return;
        }
        String userName = (String) request.getSession().getAttribute("userName");
        if (null == userName) {
            response.sendRedirect("login.html");
            return;
        }
        chain.doFilter(request, response);
    }

相关文章

网友评论

    本文标题:java后端-Filter过滤器

    本文链接:https://www.haomeiwen.com/subject/gtdpnttx.html