商城管理员进入商城管理页面之前,必须要先登录系统,登录成功后才能进入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页面的访问请求。