任务卡_06-JavaWEB_Filter和Listener

目录

一,过滤器和监听器的使用

1,任务概述

2,任务过程

3,验收标准

4,编码过程

4.1 配置环境

4.2 数据库设计

4.3 实现登录和登录验证功能

4.4 限制积分合格的人方可下载

4.5 评论时过滤敏感词

5,运行结果展示

6,需要注意的点

6.1 注意getParameter与getAttribute区别!!!

6.2 显示评论时间,具体到秒

6.3 修改完数据库结构后一定要记得修改bean中的实体类!


一,过滤器和监听器的使用

1,任务概述

现在公司为了能扩大收益面,将原来免费下载的资源修改为有偿下载,要 求用户在登录情况下,且个人积分在 100 分以上时,才可以下载资源(用户可 以通过充值来提高积分量),并且下载完成后,可以留言评论该资源,此时如 何保证用户发布的文字合理合法(不能包含敏感词)?

2,任务过程

  • 1. 配置所有请求执行过滤器
  • 2. 过滤器中添加用户非登录验证
  • 3. 用户登录情况下,查询其个人积分是否满足下载条件
  • 4. 下载完成后,用户留言评论,在过滤器中对留言内容进行敏感词过滤

3,验收标准

  • 下载请求时的验证效果
  • 输入敏感词后,替换成星号或直接让用户重新输入

4,编码过程

为了加快学习速度,目前将注意力放在任务卡最核心的地方,其余的细节部分尽量简化,有需要的同学酌情参考。

完整代码正在整理,准备上传到gitee上,速度很快(相比于GitHub),但是一次只能上传20个文件,这里先记一下,后面补上。

4.1 配置环境

老一套了,但是在自己完全搞熟之前还是一步一步来吧

1,创建web工程,记得在里面勾选tomcat server并填写相关信息,如果在创建项目时不填写,后面需要自己进行tomcat配置和导包(新版本的IDEA没有创建web application的选项,只能先创建Java项目,然后在support framework里选择并创建)

2,在web/WEB-INF下创建lib、classes。将所需的jar包粘贴在lib中,在project structure/modules/dependences中引入该目录。在project structure/modules/paths中修改编译文件的输出路径为classes

任务卡_06-JavaWEB_Filter和Listener任务卡_06-JavaWEB_Filter和Listener

任务卡_06-JavaWEB_Filter和Listener

3,如果在创建项目时没有勾选tomcat配置,需要在edit configuration中进行配置,点击左上角选择tomcat服务器,重命名为当前项目名称

任务卡_06-JavaWEB_Filter和Listener任务卡_06-JavaWEB_Filter和Listener

4,引入tomcat外部依赖包

任务卡_06-JavaWEB_Filter和Listener 任务卡_06-JavaWEB_Filter和Listener

4.2 数据库设计

任务卡_06-JavaWEB_Filter和Listener

 

4.3 实现登录和登录验证功能

和之前的任务卡实现过程类似,区别在于:

1,实现登录servlet时,根据账号密码查询用户存在,将用户相关信息返回,并存入session中;

任务卡_06-JavaWEB_Filter和Listener

2,添加了一个登录过滤器;

任务卡_06-JavaWEB_Filter和Listener

任务卡_06-JavaWEB_Filter和Listener 

4.4 限制积分合格的人方可下载

用户登录后跳转到index.jsp页面,简单展示了用户名称、用户积分,以及下载链接(a标签展示)。

用户点击下载链接后,若积分大于100,则跳转到评论页面,否则跳回当前页面

任务卡_06-JavaWEB_Filter和Listener 

任务卡_06-JavaWEB_Filter和Listener

4.5 评论时过滤敏感词

1,展示评论框和评论列表

任务卡_06-JavaWEB_Filter和Listener

2,发送评论时通过message请求完成(上图action=message),评论过滤需要针对该请求进行


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        req.setCharacterEncoding("UTF-8");
        // 这里是getParameter不是getAttribute!!!
        String comment = req.getParameter("comment");
        User user = (User) req.getSession().getAttribute("userInfo");
        if(comment != null && user != null && user.getScore() > 100) {
            System.out.println("messageFilter2:" + comment);
            String[] sensitiveWord = {"滚", "爬", "fuck", "卧槽", "靠", "放屁", "炸弹"};
            // 遍历敏感词组的每个单词 若存在于评论中则将其替换为*
            for(String str : sensitiveWord) {
                StringBuilder sb = new StringBuilder();
                for(int i = 0; i < str.length(); i++) sb.append("*");
                comment = comment.replace(str, sb.toString());
            }
        } else if(user == null || (user != null && user.getScore() <= 100)) {
            // 避免积分低的用户登录后再直接跳转到信息界面
            resp.sendRedirect("login.jsp");
        }
        req.getSession().setAttribute("comment", comment);
        filterChain.doFilter(req, resp);
    }


任务卡_06-JavaWEB_Filter和Listener

5,运行结果展示

任务卡_06-JavaWEB_Filter和Listener

任务卡_06-JavaWEB_Filter和Listener

 

任务卡_06-JavaWEB_Filter和Listener

 任务卡_06-JavaWEB_Filter和Listener

6,需要注意的点

6.1 注意getParameter与getAttribute区别!!!

getParameter是从页面输入中获取参数,比如form表单中的文本输入框等;

getAttribute要想获得数据,需要先用setAttribute存入;

6.2 显示评论时间,具体到秒

首先,数据库中评论表的时间属性是timestamp;

其次,向数据库插入数据时需要用new Timestamp(new Date().getTime());

最后,显示时间时,修改展示格式

<li><g:formatDate value="${comment.time}" pattern="yyyy-MM-dd HH:mm:ss"></g:formatDate> </li>

任务卡_06-JavaWEB_Filter和Listener

6.3 修改完数据库结构后一定要记得修改bean中的实体类!

idea中的插件可以根据数据库表,直接生成实体类,但是存在以下几个问题:

1,包名不对。自动生成的类中,可以看到包名在飘红,修改为其所在包即可;

2,无构造方法。需要自己手动编写;

3,通过插件修改数据库的表结构后,记得重新生成实体类;


章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【06-JavaWEB】


对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731

有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]

上一篇:think-swoole实战案例 长沙郑州西安太原


下一篇:SpringBoot2---Web原生组件注入(Servlet、Filter、Listener)和嵌入式Servlet容器