Servlet实现未登录拦截功能

1,067 阅读2分钟

首先我们来聊聊实现业务的逻辑

当用户成功登陆的时候,我们会从前端获取用户名和密码进行数据库的验证,验证成功后用户名会保存到session中作用域中,用这样的方法来记录用户已成功登陆。那我们想拦截未登录的用户,可以在session这里下手,我们可以在项目中添加一个类实现Filter接口,其目的是为了拦截所有的前端发送到后端的请求,拦截之后在方法里进行session是否为空的判断,如果为空则让它重定向回到登陆的页面,如果不为空则放行。

配置的时候需要注意的地方

需要注意的是web.xml里面的配置,其实编写拦截器类代码复制黏贴就可以了,是比较简单的,问题在于初次配置的时候,容易把用户进行填写登陆用户名和密码的login.jsp页面也进行拦截并且判断,这样会进入一个死循环,因为第一次程序运行用户是没有填写用户名和密码的,也就没有验证和将信息保存到session里面的说法,所以怎么可能进入login.jsp页面呢?这一点需要注意。

代码的实现

首先需要创建一个类,名字随意取,主要是让它实现filter接口,并且实现它的三个方法:

package com.thunder.ssm.config;


import com.thunder.ssm.pojo.Users;

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

/**
 * @author think
 */
public class SysFilter implements Filter {
	
	//初始化的方法,servlet第一次运行的时候调用
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("容器开始初始化===");
	}
	
	//拦截的方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
		System.out.println("进来了拦截filter 方法===========");
		HttpServletRequest rq = (HttpServletRequest)request;
		HttpServletResponse rp = (HttpServletResponse)response;
		//获取登陆的session对象
		Users userSession = (Users)rq.getSession().getAttribute("userSession");
		if(null == userSession){
		    //未登录 让其重定向会登陆的页面
			rp.sendRedirect("/InvoicingSystem/login.jsp");
		}else{
			//已登陆放行
			chain.doFilter(request, response);
		}
	}

	//容器销毁后调用的方法
	@Override
	public void destroy() {
		System.out.println("容器销毁了===");
	}

}

同时还需要进行web.xml的相关配置,需要和你的项目webapp下的目录相对应:

 <!-- 过滤器拦截指定后缀-->
  <filter>
    <filter-name>SysFilter</filter-name>
    <!--改成自己filter配置类的路径-->
    <filter-class>com.thunder.ssm.config.SysFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SysFilter</filter-name>
    <!--设置自己需要拦截的jsp路径-->
    <url-pattern>/view/*</url-pattern>
  </filter-mapping>

image.png