tomcat部署下的项目,使用Filter过滤器,实现未登录不能访问目标资源的目的

复盘一下这几天的学习成果。

目的是使用过滤器,让没有登录的用户访问不了部署在wenb项目下的资源列表。
本篇记录参考了
使用过滤器控制访问权限

项目结构

项目结构

这里的web.xml与SessionFilter是参考上面文章博主的内容。

第一步

先看一下web.xml的具体内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>com.lingaolu.servlet.SessionFilter</filter-class>
    </filter>
    <filter-mapping>
    //这里的<url-pattern>/*</url-pattern>起了主要作用,这里的/*的意思是,只要请求里面有/,不管/后面是啥,这个过滤器都会过滤。
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

接下来就到了SessionFilter中的代码

package com.liutao.servlet;
import java.io.IOException;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionFilter implements Filter{
    @Override
    public void destroy() {
    }
    /**
     * 核心过滤方法
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        //获取代表用户请求、响应、会话的对象
        HttpServletRequest servletRequest = (HttpServletRequest) request;
        HttpServletResponse servletResponse = (HttpServletResponse) response;
        HttpSession servletSession = servletRequest.getSession();
        // 获得用户请求的URI
        String path = servletRequest.getRequestURI();
        //允许访问login.jsp和tip.jsp以及ActionServlet
        // ||path.contains(".png")   ||(path.indexOf("/scenery")>-1)
        if((path.indexOf("/Login.jsp")>-1)||(path.indexOf("/LoginServlet")>-1)){
            chain.doFilter(request, response);
            return;
            //允许访问css文件和图片文件(如果不允许,那就看不到样式和图片了)
        }else if(path.contains(".css") || path.contains(".jpg")|| path.contains(".gif")){
            chain.doFilter(request, response);
            return;
            //允许访问js文件,注意不允许访问jsp文件!
        }else if(path.contains(".js")&&(!path.contains("jsp"))){
            chain.doFilter(request, response);
            return;
        }

        //除上述允许访问的之外,如果未登录报无权限错误
        //System.out.println("过滤器中的username"+((HttpServletRequest) request).getSession().getAttribute("username"));
        if(((HttpServletRequest) request).getSession().getAttribute("username")==null){
            System.out.println("您还未登录,不能访问!");
            request.getRequestDispatcher("/Login.jsp").forward(request,response);
            return;
        }else{//如果已登录,则允许访问
            chain.doFilter(request, response);
            return;
        }

    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

这里的上半部分代码博主注释的很好,就不用过多解释了。
下半部分的代码书要是判断一个登录的功能。

第二步

编写一个简单的登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>我的JSP</title>
</head>
<body>

<div class="bg-images">
    <form method="post" action="LoginServlet">
        请输入账号<input type="username" name="username"><br>
        请输入密码<input type="password" name="password">
        <button type="submit">登录</button>
    </form>
</div>

</body>
</html>

这里用的是session存储登录数据,写死了登录账号和密码。
对于session存储数据的方式,还不是很熟。
我是在LoginServlet中通过session存储数据的。

第三步

编写一个LoginServlet,用来中转判断登录用。

package com.liutao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username_1 = request.getParameter("username");
        String password_1 = request.getParameter("password");
        request.getSession().setAttribute("username", username_1);
        request.getSession().setAttribute("password", password_1);
        String username = (String) request.getSession().getAttribute("username");
        String password = (String) request.getSession().getAttribute("password");
//        System.out.println("13username:"+username);
//        System.out.println("13password:"+password);
//        request.getRequestDispatcher("S.jsp").forward(request, response);
        if("20201420".equals(username)&&"123456".equals(password)){
            request.getRequestDispatcher("/welcome.jsp").forward(request, response);
        }
        else{
            request.getRequestDispatcher("/Login.jsp").forward(request, response);
        }
    }
}

由于我之前在Login.jsp里面使用session.setAttribute之后,在LoginServlet中使用 request.getSession().setAttribute一直获取不到数据。所以我就用了最笨的方法。

welcome.jsp中写的是登陆成功之后的界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你已经登陆成功!!!欢迎您!
<form action="pictures/scenery/01.png">
    <button type="submit">点击按钮访问资源</button>
</form>
</body>
</html>

最后

我们看到了这样的浏览器界面
Login.jsp
在输入账号密码之后,他会跳转至
welcome.jsp
此时你点击按钮之后就可以根据按钮跳转的地址来跳转
这边由于跳转地址写的是pictures/scenery/01.png
他跳转到了
01.png
如果我们地址写的是pictures/scenery
他会跳转到scenery的目录上。

在这里插入图片描述
但是要tomcat能够访问文件目录需要更改一下设置
具体的方法如下:

1.打开tomcat文件目录下的conf目录

2.再打开其中的web.xml文件

3.找到其中的代码块

在这里插入图片描述
<param-value>false<param-value>中的false改为ture。(我这里是先改好了)
因为tomcat默认不让打开文件目录。

接下来就来试一下Filter的真正作用

在这里插入图片描述
这里,如果你没有登录,也就是session中没有存储到username数据,你就会被打回到登录界面
此时控制台输出
在这里插入图片描述

如果这时我们将过滤器中的代码稍作更改

修改后的代码

path.contains(".css") || path.contains(".jpg")|| path.contains(".gif")||path.contains(".png")

在这个else if 中添加一个path.contains(".png"),你再去访问
当你访问的的地址是http://localhost:8090/FailterDemo_war_exploded/pictures/scenery/01.png
反馈的界面是
在这里插入图片描述
也就是你在未登录的情况下也访问到了文件下的图片。这就是过滤器起的作用。
他将请求地址末尾是.png的请求全部放行了,所以也就导致没有登录也能访问得到资源
但是我们将地址修改为
http://localhost:8090/FailterDemo_war_exploded/
在这里插入图片描述
会发现,过滤器依然过滤了该请求。
相同的是,如果我在SessionFilter中的第一个if语句中添加一个(path.indexOf("/scenery")你就会发现,现在可以访问到刚才的地址了
在这里插入图片描述
到这里,也就是我这两天学习的成果。记录一下关于filter的一些知识。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值