2023-2024-1 20211327 实验三-电子公文传输系统1-个人贡献

简述工作

  • 在项目前期,我撰写了部分博客,作为组长分配任务
  • 设计项目整体框架结构,完成vue全局过滤器的声明和相关设置
  • 撰写了普通用户(非管理员)增删改查部分的代码,对jsp和html等前端代码进行修改和完善
  • 对数据库部分相关代码进行补充
  • 进行系统测试

任务摘录

全局过滤器
我们的公文传输系统是前后端分离的项目,后台返回的数据需要经过处理才能显示到页面上。使用最多的场景就是日期/时间、数字、字符串的格式化处理。
在本项目中,我完成了vue封装全局filter、统一处理数据部分。包括配置Filter过滤器SetCharacterEncodingFilter处理JSP中文乱码和文件传送过滤器 RequestDumperFilter(这个过滤意义不是很大)。

基本性质

1) Filter(过滤器)的基本功能是对Servlet容器调用Servlet(JSP)的过程进行拦截,从而在Servlet处理请求前和Servlet响应请求后实现一些特殊的功能。

2) 在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序: Filter,FilterChain, FilterConfig。

3) Filter 程序是一个实现了Filter接口的 Java 类,与Servlet 程序相似,它由 Servlet容器进行调用和执行。

4) Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。

其工作原理如下图所示:

这个 Servlet 过滤器就是我们的 filter

  • 当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个Filter 就成了 Tomcat 与该 Servlet 程序的通信线路上的一道关卡,该 Filter 可以对Servlet 容器发送给 Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的响应进行拦截,可以决定是否将请求继续传递给 Servlet 程序,以及对请求和相应信息是否进行修改。

  • 在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。

  • 若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。

具体实现

按照我们的程序来具体说明

1.定义/封装过滤器
  在 src目录 下新建 filters目录 用来专门存放全局过滤器,我们的公文传输项目设置了两个过滤器。分别是文件传送过滤器 RequestDumperFilter和字符编码设置及转换过滤器SetCharacterEncodingFilter。

(下图为文件传送过滤器)

2.创建 filter 实现类

(1)继承Filter方法实现类

具体代码解析如下:

 public class SetCharacterEncodingFilter implements Filter {  
      
        protected FilterConfig filterConfig = null; //初始化配置  
        protected String encoding = null;           //接收字符编码  
        protected boolean ignore = true;            //是否忽略大小写  
          
        /* 析构函数
         * @see javax.servlet.Filter#destroy()
         */  
        @Override  
        public void destroy() {  
            this.encoding = null;  
            this.filterConfig = null;  
        }  

(2)doFilter方法

在 doFilter执行之前,由容器将 filterChain 对象传入方法。调用此对象的.doFilter()方法可以将请求放行,实际上是执行过滤器链中的下一个 doFilter 方法,但是如果只有一个过滤器,则为放行。

具体代码如下:

 /* 执行过滤操作
         * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
         */  
        @Override  
        public void doFilter(ServletRequest request, ServletResponse response,  
                FilterChain chain) throws IOException, ServletException {  
              
            if (ignore || (request.getCharacterEncoding() == null)) {  
                String encoding = selectEncoding(request);  //如果为空先从web.xml中得到  
                if (encoding != null){  
                    request.setCharacterEncoding(encoding); //设置字符集编码  
                }  
            }  
            chain.doFilter(request, response);  
        }  

(3)FilterConfig
FilterConfig 类似 ServletConfig,是 filter 的配置信息对象。

![](https://img2023.cnblogs.com/blog/2555504/202312/2555504-2023121this. Encoding39619883.png)

具体代码如下:

this.filterConfig = filterConfig;//初始化配置  
        this.encoding = filterConfig.getInitParameter("encoding"); //从web.xml文件中读取encoding的值  
        String value = filterConfig.getInitParameter("ignore");//从web.xml文件中读取ignore的值  
  //以下三种情况均为忽略大小写  
 if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this. Ignore = false;

(4)销毁方法

3.编写 web.xml 配置文件。

(1)多filter优先级
我们的项目使用了两个过滤器,在多Filter 执行环境下,如果同一个资源有多个 filter 都对其拦截,则拦截的顺序是按照 web.xml 中配置的顺序进行的。示意图如下:

可以看到我们这里只进行了SetCharacterEncodingFilter过滤器的配置。

(2)Filter的 url-pattern
url-pattern是配置 filter 过滤哪些请求的。主要有以下几种配置:
web.xml中配置的/都是以当前项目路径为根路径的。

1)精确匹配:
/index.jsp/user/login 会在请求/index.jsp、/user/login 的时候执行过滤方法。

2)路径匹配:
/user/* /* 凡是路径为/user/下的所有请求都会被拦截,/*表示拦截系统的所有请求,包括静态资源文件。

3)扩展匹配:
*.jsp .action 凡是后缀名为.jsp .action 的请求都会被拦截。
注意:/login/.jsp 这种写法是错误的,只能是上述三种的任意一种形式。不能组合新形式。
*jsp 也是错误的,扩展匹配必须是后缀名。

4)多重 url-pattern 配置
上面的三种形式比较有局限性,但是 url-pattern 可以配置多个,这样这三种组合基本就能解决所有问题了。

我们此项目因为架构算法较为简单,所以并没有配置url-pattern。

你们小组总共的代码行数,你贡献的代码行数?相关代码链接?
代码总行数:9032行

我贡献的代码行数:2511行

代码链接:(https://gitee.com/xiao-zhancheng/20211322xqc/tree/master/)

你们小组总共的文档数?你贡献的文档数?相关链接?
小组目前总文档数:11篇
你贡献的文档数:4篇
链接如下:https://www.cnblogs.com/xiaoquancheng/p/17904918.html

posted @ 2023-12-17 18:28  沈楗翔  阅读(3)  评论(0编辑  收藏  举报