简单的Filter过滤器实现

本文介绍了一个简单的过滤器实现过程,包括登录验证、错误处理及注销功能。通过设置session和过滤器,确保用户注销后无法直接通过URL访问已登录页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,做了一个简单的过滤器实现。

就是当你,要登录的时候,用户名正确的话会登录上去,错误的话,会跳到错误页面,如果登陆上去的话,有个注销按钮,如果点了注销按钮,就会返回登录页面,同时,再使用上一次登陆成功的url,是不会成功的。

具体实现:

首先一个,登录界面,一个form表单,一个对应的loginServlet。
loginServlet里面写,比对用户名,如果是这个的话,就要跳转到登录成功页面,错误的话跳转到错误页面。
登陆成功页面,里面有个,显示登陆成功的标志,同时,有个注销的按钮,如果点了注销,就会返回到登录页面,这个注销按钮,创建一个logoutServlet。
然后,再来个错误页面。
错误页面里面有个跳转到登录页面的按钮,返回登录页面。
同时提示错误信息:你的信息出错了。

重头戏来了,怎么在用户注销之后,用户不能通过上次的url直接访问到成功页面呢?

答案就是:过滤器。

创建一个util包,包里有个类,类里定义一个静态常量USER_SESSION。

将这个值存到session里面,用作之后的判断条件。

当登陆的时候,判断用户名是否正确,如果正确,就往USER_SESSION里面赋一个getId的值。

然后进行页面的跳转。

如果出错,就跳转到错误页面。

如果登录成功的话,就会进入到成功页面,成功页面,有一个注销按钮,注销按钮,用来注销用户的session,也就是移除USER_SESSION里的值。

然后,在进行页面的跳转。

再来一个过滤器,用来判断,那个常量类下的USER_SESSION是否为空,如果是空,就跳转到出错页面,如果不为空,继续运行。

这样的话,就可以简单的实现这个过滤器了。
让用户不可以用url来返回已经登录成功的页面。

接下来就是源码 了:
静态常量类:

package com.bai.util;

public class Constant {
    public final static String USER_SESSION = "USER_SESSION";
}

登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>
<form action="/login" method="post">
    用户名<input type="text" name="username">
    <input type="submit" value="提交">
</form>
</body>
</html>

loginServlet

package com.bai.servlet;

import com.bai.util.Constant;

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

public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        if (username.equals("admin")){
            //存一个session
            req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());

            resp.sendRedirect("/sys/success.jsp");
        }else{
            resp.sendRedirect("/error.jsp");
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>

 <a href="/logout ">注销</a>
</body>
</html>

logoutServlet

package com.bai.servlet;

import com.bai.util.Constant;

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

public class logout extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object userSession = req.getSession().getAttribute(Constant.USER_SESSION);
        if (userSession !=null){
            req.getSession().removeAttribute(Constant.USER_SESSION);
            resp.sendRedirect("/login.jsp");
        }
        if(userSession == null){
            resp.sendRedirect("/error.jsp");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

错误页面

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

<h1>您输入的用户名有问题</h1>
<h1>    <a href="/login.jsp">返回主页</a>  </h1>
</body>
</html>

过滤器

package com.bai.filter;

import com.bai.util.Constant;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class sysFileter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse resp = (HttpServletResponse) servletResponse;
            if (req.getSession().getAttribute(Constant.USER_SESSION)==null){
                resp.sendRedirect("/login.jsp");
            }

             filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

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"
         metadata-complete="true">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.bai.servlet.loginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>logout</servlet-name>
    <servlet-class>com.bai.servlet.logout</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>logout</servlet-name>
    <url-pattern>/logout</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>sysFilter</filter-name>
    <filter-class>com.bai.filter.sysFileter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sysFilter</filter-name>
    <url-pattern>/sys/*</url-pattern>
  </filter-mapping>
</web-app>




注:本案例学习狂神说,讲的很详细。
视频链接https://www.bilibili.com/video/BV12J411M7Sj?p=27

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃西瓜的鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值