首先我们来聊聊实现业务的逻辑
当用户成功登陆的时候,我们会从前端获取用户名和密码进行数据库的验证,验证成功后用户名会保存到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>