Logo

郎哥编程

使用过滤器检查用户登录

2019-07-30 202

商城管理员进入商城管理页面之前,必须要先登录系统,登录成功后才能进入admin_index.jsp商城管理主页。但在一些情况下,商城管理员可能会直接在浏览器地址栏输入商城管理主页地址,对商城管理主页直接进行访问而不是通过登录页跳转,对这种访问路径是必须要禁止的。因此有必要在项目中设置拦截器,对admin_index.jsp页面的直接访问进行拦截,如果商城管理员已经在登录状态,可以直接放行,如果不在登录状态,则直接跳转到admin_login.jsp页面,要求商城管理员登录系统。

Java提供了Filter过滤器来拦截前端请求,程序可以通过Filter过滤器来拦截前端请求,并对前端请求进行预处理操作。

Filter是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

在创建过滤器之前,我们需要先创建admin_index.jsp页面,过滤器会对admin_index.jsp页面的访问进行拦截。在eshop项目WebContent的admin目录下新建admin_index.jsp网页文件,文件代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String host=request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+host+"/";
    request.setAttribute("basePath", basePath);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
商城管理主页
</body>
</html>

创建过滤器

在com.eshop包下新建intersepter包,该包主要存储过滤器类。在intersepter包新建AdminLoginInterceptFileter类,该类实现Filter接口。

/** 
* @Title: AdminLoginInterceptFileter.java 
* @Package com.eshop.intersepter 
* @Description: 商城管理员前端请求过滤
* @author xinch 
* @date 2019年7月29日 
* @version V1.0 
*/ 
 
package com.eshop.intersepter;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
 
 
 
/** 
* @ClassName: AdminLoginInterceptFileter 
* @Description: 拦截admin_index.jsp页面请求
* @author xinch 
* @date 2019年7月29日 
* 
*/ 
public class AdminLoginInterceptFileter implements Filter {
 
    /** 
    * @log 日志输出
    */ 
   
    private Logger log = LogManager.getLogger(AdminLoginInterceptFileter.class.getName());
   
   
    /** 
    * 创建一个新的实例 AdminLoginInterceptFileter. 
    *   
    */ 
    public AdminLoginInterceptFileter() {
        // TODO Auto-generated constructor stub
    }
 
   
    /**
    * <p>Title: destroy</p> 
    * <p>Description: </p>   
    * @see javax.servlet.Filter#destroy() 
    */ 
    @Override
    public void destroy() {
       // TODO Auto-generated method stub
    }
 
    /**
    * <p>Title: init</p> 
    * <p>Description: </p> 
    * @param fConfig
    * @throws ServletException 
    * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
    */ 
    @Override
    public void init(FilterConfig fConfig) throws ServletException {
       // TODO Auto-generated method stub
   
    }
 
    /**
    * <p>Title: doFilter</p> 
    * <p>Description: </p> 
    * @param request
    * @param response
    * @param chain
    * @throws IOException
    * @throws ServletException 
    */ 
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
           throws IOException, ServletException {
       // TODO Auto-generated method stub
       HttpServletRequest httpRequest = (HttpServletRequest)request;
       HttpServletResponse httpResponse = (HttpServletResponse)response;
       HttpSession session = httpRequest.getSession();
       //获取session的用户信息
       String userId = (String)session.getAttribute("adminUserId");
       //如果session的用户信息为空,跳转到登录页
       if( userId == null )
       {
           log.info("跳转到登录页");
           httpResponse.sendRedirect("admin_login.jsp");
           return;
       }
       //递交给下一级请求拦截
       chain.doFilter(request, response);
    }
 
}

AdminLoginInterceptFileter类用于拦截admin_index.jsp页面访问请求。doFilter方法执行主要的过滤操作,在该方法内首先从session中获取用户的信息:如果session中的用户信息为空,说明访问者没有验证身份,页面强制跳转到admin_login.jsp登录页,要求访问者先登录系统;如果session中的用户信息不为空,则说明访问者已经登录系统,可以直接进入商城管理主页。

修改ShopManagerServiceImpl类

在前面ShopManagerServiceImpl类的verifyUser方法中,商城管理员登录成功后,在返回的InnerResult类中,仅是设置了InnerResult类的code和message属性。现在还需要设置param属性,设置param属性为User对象,用于将User对象的id写入session。修改后的verifyUser代码。

@Override
    public InnerResult verifyUser(String inLoginName, String inPassWord) {
       //使用UserExample加入查询条件
       UserExample userExmple=new UserExample();
       //添加登录名查询条件
       userExmple.createCriteria().andLoginnameEqualTo(inLoginName);
       //添加登录密码查询条件
       userExmple.createCriteria().andPswEqualTo(inPassWord);
       //添加用户类型查询条件
       userExmple.createCriteria().andUsertypeEqualTo(2);
      
       //使用userMapper对象执行查询
       try {
           List<User> userList =  userMapper.selectByExample(userExmple);
           //查询到合法记录
           if( userList.size() > 0 )
           {
              InnerResult  inner = new InnerResult();
              inner.setCode(ESHOPConstant.RESULT_CODE.SUCC);
              inner.setParam(userList.get(0));
              inner.setMessage("用户验证成功");
              return inner;
           }
           else
              return new InnerResult(ESHOPConstant.RESULT_CODE.FAIL,"用户验证失败,用户名或密码或类型错误");
          
       } catch (Exception e) {
           //log.error(e);
           return new InnerResult(ESHOPConstant.RESULT_CODE.FAIL,e.getMessage());
       }
 
   }

修改ShopManagerControll类

在ShopManagerControll类的verifyUser方法中,添加写入User对象id属性到session的语句,在setViewName传入的页面地址中加上前缀redirect,redirect是重定向的意思,它会引起浏览器显示的地址发生变化。修改后的verifyUser方法代码如下:

@RequestMapping(value = "/verifyuser.do")
    public ModelAndView verifyUser(HttpServletRequest request,HttpSession session) throws Exception {
        //数据模型和视图对象
   
       ModelAndView view=new ModelAndView();
      
       //获取前端表单的name和psw
       String loginName = request.getParameter("name");
       String passWord = request.getParameter("psw");
      
       //调用ShopManagerService类的verifyUser接口
       InnerResult result = shopManagerService.verifyUser(loginName, passWord);
      
       //验证成功
       if( result.getCode() == ESHOPConstant.RESULT_CODE.SUCC )
       {
           //跳转到admin_index.jsp页页面
           User user = (User)result.getParam();
           //用户信息写入session
           session.setAttribute("adminUserId", user.getId());
           view.setViewName("redirect:/admin/admin_index.jsp");
           return view;
       }
      
      
       log.info("登录失败:" + result.getMessage());
       //验证失败,设置验证失败信息
       view.addObject("info",result.getMessage());
       //跳转到admin_login页面
       view.setViewName("/admin/admin_login.jsp");
       return view;
   }

修改web.xml配置文件

最后要做的是在web.xml配置文件中添加<filter>配置项,<filter>配置项用于配置需要过滤的页面及过滤类,可以配置多个<filter>配置项。

<filter>配置项的<filter-name>属性用来定义过滤器的名称,该名称在整个配置文件中必须唯一,该名称也用于区分不同的过滤器。

<filter>配置项的<filter-class>属性用来指定过滤器类,即Filter的实现类。

<filter-mapping>配置项是与<filter>配对的配置项。<filter-mapping>配置项的<filter-name>属性必须是在<filter>配置项的<filter-name>配置过的。<filter-mapping>配置项的<url-pattern>用来指定该Filter所拦截的URL。

在web.xml配置文件的<welcome-file-list>配置项后面添加<filter>配置项:

<filter>
    <filter-name>loginInterceptFileter</filter-name>
    <filter-class>com.eshop.intersepter.AdminLoginInterceptFileter</filter-class>
</filter>
  <filter-mapping>
    <filter-name>loginInterceptFileter</filter-name>
    <url-pattern>/admin/admin_index.jsp</url-pattern>
</filter-mapping>

上述所有文件编写完成后,在Server中运行admin_index.jsp页面,如果之前没有登录系统,页面会跳转到admin_login.jsp登录页,登录成功后,页面会自动跳转到admin_index.jsp页。因为在登录过程中,已经把商城管理员的登录信息写入到session中,因此过滤器不再拦截admin_index.jsp页面的访问请求。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论