SMBMS超市管理系统(三:注销功能实现,登录功能优化)

发布于:2022-12-07 ⋅ 阅读:(643) ⋅ 点赞:(0)

登录功能优化

注销功能:

思路:移除session,返回登录页面。

我们在servlet层下面的user包里面创建LogoutServlet:

package com.rgf.servlet.user;

import com.rgf.util.Constants;

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 LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //移除用户的Constants.USER_SESSION
        req.getSession().removeAttribute(Constants.USER_SESSION);
        //移除之后要回到登录页面,返回登录界面
        resp.sendRedirect("/login.jsp");//我们也可以在前面添加req.getContextPath()+,确保地址不会出错。

    }

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

之后我们在web.xml里面进行注册:

 <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.rgf.servlet.user.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <!--其中的访问地址我们可以在jsp文件夹里面的common下的head.jsp找到退出系统的地址-->
        <url-pattern>/user/logout</url-pattern>
    </servlet-mapping>

我们在注册的过程中遇到的退出系统的地址我们在jsp里面的common下的head.jsp进行查找:

 <li><a href="${pageContext.request.contextPath }/user/logout">退出系统</a></li>

我们进行运行如下所示:
我们进入登陆界面如下所示:

 我们登录成功后如下所示:

之后,我们点击退出,发现出现如下所示:

 

我们发现应该是重定向出现了错误。我们将代码进行修改如下所示“

 resp.sendRedirect(req.getContextPath()+"/login.jsp");

 我们进行重启后进行退出如下所示:

 登录拦截优化:

我们发现我们登录进去之后,我们将网站:http://localhost:9571/smbms0/jsp/frame.jsp

复制下来之后。退出系统。我们访问该网站的时候,又再一次的进入了系统。

我们应该是退出系统之后,就无法再进入系统了,就无法登录了。但是我们再退出系统之后还是可以进行访问。我们通过过滤器来进行优化。

编写一个过滤器,并进行注册:

我们在filter包里面进行注册SysFilter类:

package com.rgf.filter;

import com.rgf.pojo.User;
import com.rgf.util.Constants;

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

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

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest  request = (HttpServletRequest) req;   //获取他的session
        HttpServletResponse response = (HttpServletResponse) resp;  //重定向
    //过滤器,从session中获取用户,
        User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
    if(user==null){//该用户已经被移除或者注销了,或者未登录
        response.sendRedirect("../error.jsp");

    }else{
        chain.doFilter(req,resp);
    }
    }

    @Override
    public void destroy() {

    }
}

之后我们在web.xml里面进行注册如下所示:

<!--用户登录过滤器-->
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.rgf.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <!--如果想访问jsp下面的页面,必须要首先进行登录-->
        <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>

同时我们还需要编写无法登录的界面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html";charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
  <h1>请登录后再访问该页面</h1>
  <a href="login.jsp">返回</a>
  </body>
</html>

之后我们进行运行,如下所示:我们成功登录进去之后,退出系统,通过复制网站进去之后,我们发现如下所示:

 测试,登录,注销,权限都要保证OK。