Day16_2--Servlet学习之过滤器+session实现防跳墙

Servlet过滤器Fileter是一个小型的web组件,它们通过拦截请求和响应,以便查看、提取或以某种方式操作客户端和服务器之间交换的数据,实现“过滤”的功能。Filter通常封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件通过配置文件来声明,并动态的代理。
Filter的工作原理如下:
Filter的工作原理
总而言之就是拦截器可以实现拦截servlet和jsp的请求和相应,通过拦截我们可以提前做一些预处理事件。
下面我结合防跳墙来介绍拦截器,请细看代码注释!!!
逻辑如下:
1.现在我设置防跳墙的目的是:当用户在没有正常进入登录界面完成登录时,无法访问其他页面。
2.开启Session会话:想要实现该目的,在登录的业务逻辑实现代码中,完成登录后开启Session会话并设置会话属性键值对。

 GetMapper getMapper = new GetMapper();
        List<Admin> admin = getMapper.selectAdmin(user, pw);
        if (!admin.isEmpty()) {
        //如果数据库存在该账号密码开启会话,并设置会话属性键值对
            HttpSession session = req.getSession();
            session.setAttribute("login", "pass");
            resp.sendRedirect("paging.jsp");
        } else {
            PrintWriter writer = resp.getWriter();
            writer.write("<script>" +
                    "alert('账号或密码错误!');" +
                    "window.location.href='login.jsp'" +
                    "</script>");
        }

3.拦截放行:在拦截器中对登录需要的请求和响应放行,其他请求和响应都要做逻辑判断,如果存在Session会话属性login的键值对就允许访问,否则拦截。
4.销毁会话:在网页中设计的注销登录按钮跳转请求销毁所有session,即可实现退出效果


@WebServlet("/LogOut")
public class LogOut extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取会话
        HttpSession session = req.getSession();
        session.invalidate();//销毁会话
        PrintWriter writer = resp.getWriter();
        writer.write("<script>" +
                "alert('退出成功!');" +
                "window.location.href='login.jsp'" +
                "</script>");
    }
}

下面的是拦截器中写的逻辑判断

package Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebFilter("/*")//*代表拦截所有
public class filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化
        System.out.println("初始化了!!!");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进来先拦截");
        //在页面放行前先设编码(在这里做设编码,就不用在每个servlet中写了)
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        //获取session
        HttpSession session = ((HttpServletRequest) servletRequest).getSession(false);
        String requestURI = ((HttpServletRequest) servletRequest).getRequestURI();
        
        if (requestURI.endsWith("/login.jsp") || requestURI.endsWith("/KaptchaCode") ||
                requestURI.endsWith("/Login") || requestURI.endsWith("/LoginFailed")) {
            filterChain.doFilter(servletRequest, servletResponse);//这里对登录需要的请求放行
        } else if (session == null || session.getAttribute("login") == null) {
        //如果session会话的login属性为空就是没有登录,拦截请求,并弹窗提示登录
            PrintWriter writer = servletResponse.getWriter();
            writer.write("<script>" +
                    "alert('请登录!!!');" +
                    "window.location.href='login.jsp'" +
                    "</script>");
        }else {
        //完成登录后所有请求放行
            filterChain.doFilter(servletRequest, servletResponse);
        }

    }

    @Override
    public void destroy() {
        System.out.println("\" 拦截结束了\" = " + " 拦截结束了");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT ·南栀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值