【后端】javaweb过滤器Filter

ops/2024/11/8 22:26:44/

过滤器Filter

实现敏感词、只能通过登录进入页面。

原理

        当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分,1.放行之前的代码,2.放行,3.放行后的代码,这3个部分分别会发挥不同作用。

        第一部分代码会对游览器 请求进行第一次过滤,然后继续执行
        第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
        第三部分代码就是对返回的Web资源再次进行过滤处理

 过滤器创建

eclipse里可以new一个Filter

其中:

@WebFilter("/*")

放着要过滤的资源,如果想拦所有,那就是*


实现过滤

        前面我们知道,web-inf目录下的文件我们无法通过浏览器访问到,因此做项目时,我们把文件放到他的平行文件里。

        这里,我们要实现只能通过登录进入内容管理系统等页面,把只能通过登录才能进的页面放到 web-inf 目录下。

第二步:

        登录成功时,进入过滤器

第三步:过滤器设置

这是放行的语句

可以选择对资源放行还是不放行。

不放行就是空白。

//放行chain.doFilter(request, response);

        想要知道访问哪个资源,用统一资源访问符getRequestURI()  ---->  servlet能用,Filter用不了 (原因:同样都是request,servlet里是HttpServletRequest, 而filter里是ServletRequest, 所以filter是父类 ,servlet是子类。 子类能调用子类的方法,能调用父类的方法。而父类不能调用子类---> 解决办法:强制类型转换。 把父类的强制转换成子类的。)

String requestURI=((HttpServletRequest)request).getRequestURI();

$ 判断访问的资源

如果是不经过登录就能访问的资源,直接放行

如果是需要经过登录才能放行的资源,且有登陆资源

        登陆了:session传来的账号有,不为空 即为登录进来的

                放行

        没登录

                不放行(重定向到登录页面)

 在登录后端设置session传账号

//		设置后端前端返回的数据为json格式response.setContentType("text/json;charset=utf-8");//获取前端传过来的参数String code=request.getParameter("code");HttpSession session = request.getSession(false);if(session!=null) {String savedcode=(String) session.getAttribute("verifycode");if(savedcode!=null) {if(savedcode.equalsIgnoreCase(code)) {String acc=request.getParameter("account");String pss=request.getParameter("password");//拼接sqlString sql="select count(*) from login where account=\""+acc+"\" and password=\""+pss+"\"";//查找int num=MysqlUtil.getCount(sql);//返回的数据String res="{\"code\":0,\"message\":\"登陆失败\"}";if(num>0) {res="{\"code\":1,\"message\":\" 登陆成功\"}";//登陆成功session.setAttribute("account", acc);}//返回数据response.getWriter().write(res);}else {String res="{\"code\":-1,\"message\":\"验证码错误,请重新输入\"}";response.getWriter().write(res);}}}}
if(requestURI.equals("/Lojarro22/")||requestURI.contains("hbu")||requestURI.contains("img")||requestURI.contains("jquery")||requestURI.contains("Hbu")||requestURI.contains("login")||requestURI.contains("Login")||requestURI.contains("CaptchaServlet")||requestURI.contains("upload")) {//不经过登录就能访问的资源//放行chain.doFilter(request, response);}else if(((HttpServletRequest)request).getSession().getAttribute("account")!=null){//需要经过登录才能访问的资源,有登录资源//session中的account不为空,即登录进来的//放行chain.doFilter(request, response);}else {//不放行((HttpServletResponse)response).sendRedirect("login.html");}


http://www.ppmy.cn/ops/132050.html

相关文章

批量将mysql的所有表都改成大写的存储过程

在MySQL中创建一个存储过程来批量将所有表名改为大写,可以按照以下步骤进行。请注意,由于MySQL的存储过程不能直接执行 RENAME TABLE 语句,我们需要使用动态SQL来实现这一功能。此外,我们还需要考虑事务处理,以确保操作…

【VScode】VScode内的ChatGPT插件——CodeMoss全解析与实用教程

在当今快速发展的编程世界中,开发者们面临着越来越多的挑战。如何提高编程效率,如何快速获取解决方案,成为了每位开发者心中的疑问。今天,我们将深入探讨一款颠覆传统编程体验的插件——CodeMoss,它将ChatGPT的强大功能…

C++ 二分法

二分法(Binary Search)是一种常用的查找算法,它通过将已排序的元素划分为两部分,然后通过比较目标值与划分点的大小关系,将查找范围缩小一半,从而快速地找到目标值。二分法的时间复杂度为O(logN)&#xff0…

剑指offer第五天

1.包含min函数的栈 一个比较简单的模拟栈的操作 class Solution { public:void push(int value) {st[op] value;}void pop() {if(op)op--;}int top() {return st[op-1];}int min() {int mi 10001;for(int i 0;i<op;i)mi std::min(mi,st[i]);return mi;} private:int s…

ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS

ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS 参考 Ubuntu 配置/etc/fstab参数实现开机自动挂载硬盘 https://blog.csdn.net/u010632165/article/details/89597522 blkid /dev/sda /dev/sda: UUID“91061d36-5043-4b9f-a616-ac934503962c” BLOCK_SIZE“4096”…

打印菱形(C语言)

程序&#xff1a; #include <stdio.h> int main() { int i,j; for(i1;i<5;i){ for(j0;j<6-i;j){ printf(" ");} for(j0;j<i*2-1;j){ printf("*");} printf("\n");} …

DBA之路,始于足下

DBA之路&#xff0c;始于足下 与DBA的缘分工作一年的体会未来的规划 与DBA的缘分 我以前从来没有想过会成为一名DBA。从进入研究生开始&#xff0c;我就已经给自己规划好了找工作的学习路线-Java开发工程师。我从算法、项目、八股、面试等各个方面展开准备&#xff0c;所有的面…

nVisual 2D/3D切换

1.创建3D场景节点&#xff0c;复制id&#xff0c;例如24000000115685 2.找到需要跳转到此3D场景的2D场景节点&#xff0c;复制id&#xff0c;例如24000000087275 3.数据库执行搜索命令 SELECT * from nodes where id 24000000087275 4.查看搜索结果的 background 如果节点…