javaee的OA项目(六)过滤器的使用,解决中文乱码的过滤器和使用过滤器实现拦截判断

2021-06-17 19:29:14 浏览数 (1)

目录

  • 为什么使用过滤器
    • 我们目前书写项目中遇到的问题?
  • 什么是过滤器?
  • 代码中什么时候走过滤器
  • 项目中如何使用过滤器
    • 先创建一个过滤器(解决中文乱码的过滤器)
    • 将这个过滤器配置到项目里面
    • 总结
  • 如何使用过滤器实现拦截判断
    • 先创建一个实现拦截的过滤器
    • 在web.xml里面进行配置这个过滤器
  • 过滤器更多内容
    • 问题1:多个过滤器,执行的顺序怎么确定?
    • 问题2:每个请求和响应都要经过过滤器吗?
    • 问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍
    • 问题4:在过滤器中能否跳转到项目的其他任意资源
    • 问题5:重定向和转发是否经过过滤器

为什么使用过滤器

我们目前书写项目中遇到的问题?

A、目前使用的baseServlet的优点就是方便可以进行乱码的统一的处理,但是如果我们以后不使用servlet,那么我们在进行中文乱码处理的时候就需要在每一个servlet 中去书写,但是比较麻烦。 B、在进行登陆拦截处理的时候,我们需要把拦截的代码在每一个页面中重复的书写,这样,就会变的非常的麻烦。

代码语言:javascript复制
  最终的问题: 重复的代码在项目中多次的使用书写。 
  解决方案: 过滤器

什么是过滤器?

代码中什么时候走过滤器

我们浏览器输入一个地址,如果项目里面没有过滤器,那么就会直接访问servlet,但是如果我们配置了过滤器,并且设置了配置哪些路径访问需要走过滤器,那么只要浏览器输入一个地址,并且项目里面也配置了过滤器。一访问对应的路径,那么项目自动先走过滤器,之后才会走servlet层

项目中如何使用过滤器

先创建一个过滤器(解决中文乱码的过滤器)

将这个过滤器配置到项目里面

自己创建的过滤器,需要和项目结合,所以需要配置,所以在web.xml里面进行配置就可以了。

浏览器一输入一个地址,首先访问的就是web.xml文件。在web.xml里面从上到下 走代码。

总结

现在要实现解决中文乱码,那么我们在web.xml里面可以设置一个全局的属性,然后代码里面获取这个全局的属性,就可以实现解耦。

第一步,在web.xml里面设置全局的属性

代码语言:javascript复制
    <context-param>
        <param-name>enc</param-name>
        <param-value>utf-8</param-value>
    </context-param>

第二步 创建一个解决全局乱码的过滤器

里面的代码是

代码语言:javascript复制
package com.filter;

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

public class EncFilter implements Filter {

    private  String enc2;

    //初始化方法--执行一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

        //读取初始化参数
         enc2 = filterConfig.getInitParameter("enc2");

         //全局参数
        String enc = filterConfig.getServletContext().getInitParameter("enc");
    }

    //服务请求--->每一次请求都会执行
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {


        //[A]达到目标资源之前的预处理操作

         req.setCharacterEncoding(enc2);

        //[B]执行下一个过滤器或者目标资源

        chain.doFilter(req,resp);

        //[C]离开服务器之前的处理操作

    }

    //销毁方法--指定一次
    @Override
    public void destroy() {

    }
}

第三步 web.xml里面进行配置

代码语言:javascript复制
      <filter>
          <filter-name>EncFilter</filter-name>
          <filter-class>com.filter.EncFilter</filter-class>
          <init-param>
              <param-name>enc2</param-name>
              <param-value>utf-8</param-value>
          </init-param>
      </filter>

      <filter-mapping>
          <filter-name>EncFilter</filter-name>
          <!--过滤路径:什么样的路径会经过过滤器-->
          <url-pattern>/uu/*</url-pattern>
      </filter-mapping>

以上就是项目中如何使用过滤器。

如何使用过滤器实现拦截判断

先创建一个实现拦截的过滤器

里面的代码

代码语言:javascript复制
package com.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginFilter  implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

          //获得保存到session中的内容
       HttpServletRequest  req=  (HttpServletRequest)request;

       HttpServletResponse  resp=(HttpServletResponse)response;

        Object emp = req.getSession().getAttribute("emp");


        //获得用户当前登录的路径,如果登录路径是login.jsp直接放行。如果不是在过滤

        //   /login.jsp
        String uri = req.getRequestURI();

        //获得路径后的参数  method=login
        String queryString = req.getQueryString();

        if("/login.jsp".equals(uri)||"/EmployeeServlet?method=login".equals(uri "?" queryString)){

            chain.doFilter(req,resp);
        }else {

            if(emp!=null){
                //证明用户已经登录
                chain.doFilter(req,resp);
            }else {
                resp.sendRedirect(req.getContextPath() "/login.jsp");
                return;
            }
        }
    }

    @Override
    public void destroy() {

    }
}

在web.xml里面进行配置这个过滤器

代码语言:javascript复制
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.filter.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.html</url-pattern>
    <url-pattern>/com/*</url-pattern>
</filter-mapping>

以上就配置好了

过滤器更多内容

问题1:多个过滤器,执行的顺序怎么确定?

的顺序确定执行的顺序

我们先创建两个过滤器

代码语言:javascript复制
package com.filter;

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

public class Filter1  implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("--Filter1--befor");

        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("--Filter1--After");


    }

    @Override
    public void destroy() {

    }
}
代码语言:javascript复制
package com.filter;

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

public class Filter2  implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("--Filter2--befor");

        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("--Filter2--After");


    }

    @Override
    public void destroy() {

    }
}

在web.xml里面配置这两个过滤器。只要访问login.jsp页面,那么就走过滤器,那么先走哪个呢?

我们访问login.jsp页面的时候,先走哪个过滤器呢?

根据输出结果,我们可以看出

当有多个过滤器的时候,要走的过滤器的是和这个先后顺序有关

问题2:每个请求和响应都要经过过滤器吗?

不是,是否经过过滤器,经过几个过滤器由过滤器的路径来定; /servlet/ /

问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍

不是;请求时执行预处理操作,响应时执行后处理操作; 请求时过滤器的执行顺序如果是1,2,4,响应时过滤器的执行顺序4,2,1

问题4:在过滤器中能否跳转到项目的其他任意资源

可以 举例:如果一个过滤器是进行权限验证,没有登录,就不让访问目标资源,直接跳转到login.jsp

问题5:重定向和转发是否经过过滤器

重定向经过 默认转发不经过,因为是服务器端跳转。可以通过配置解决

0 人点赞