SpringMVC实现多个角色的登录拦截器步骤
**以上功能所要达到的效果如下:**
1.针对管理员、用户角色,只有登录请求可以进入系统页面,其他的请求一律不允许登录到指定页面。
2.且角色为多角色的拦截功能实现。
第一步,配置拦截器
**配置要求:
1.必须要在springMVC.xml中配置
2.必须检查文件开头是否有http://www.springframework.org/schema/mvc/spring-mvc.xsd字符*
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login/*"/>
<bean class="com.sxt.Auser.controller.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
****3.简单介绍一下:
(1)<mvc:mapping path="/**"/>,代表拦截器拦截所有的请求。
(2)<mvc:exclude-mapping path="/login/*"/> 代表拦截器不拦截的请求,我这里为登录请求!!!
(3)<bean class="com.sxt.Auser.controller.LoginInterceptor" />,这是接下来的创建拦截器类的地址。
重点:这里的<mvc:mapping path="/**"/>必须要带上,不写会直接报错,不能出现下面这种代码情况****
<mvc:interceptors>
<mvc:interceptor>
<mvc:exclude-mapping path="/login/*"/>
<bean class="com.sxt.Auser.controller.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
**这样会直接报错。**
第二步,实现登录控制器
@RequestMapping("login")
public String login(AdminVo adminVo,Model model,String userType){
String code=WebUtils.getHttpSession().getAttribute("code").toString();
if(adminVo.getCode().equals(code)){
switch (userType) {
case "管理员":
Admin admin = this.adminService.login(adminVo);
if(null != admin){
//放到session
WebUtils.getHttpSession().setAttribute("admin", admin);
return "system/main/index";
}
case "用户":
String unname = adminVo.getAdminname();
String upsw = adminVo.getAdminpsw();
UserVo userVo = new UserVo();
userVo.setUnname(unname);
userVo.setUpsw(upsw);
User user = this.userService.loginUser(userVo);
if(null != user){
//放到session
WebUtils.getHttpSession().setAttribute("user", user);
return "user/index";
}
***这里就是简单的实现了session登录时的存入过程。***
第三步,创建拦截器类
package com.sxt.Auser.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.sxt.sys.domain.Admin;
import com.sxt.sys.domain.User;
/*
* 用户登录拦截器
* */
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
HttpSession session = request.getSession();
//但凡可以拿到下面的其中一个session值便放行
Admin admin = (Admin)session.getAttribute("admin");
User user = (User)session.getAttribute("user");
//System.out.println("session 获取的session为:"+session);
if(user == null && admin==null){
request.setAttribute("msg", "对不起请先登录");
request.getRequestDispatcher("../index.jsp").forward(request, response);
return false;
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("after");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
System.out.println("post");
}
}
第四步,实现逻辑
1、通过HttpSession拿到当前页面的session值
2、通过session.getAttribute("admin")以及session.getAttribute("user")获取到存放在sesion中的数据。
3、判断是否能够拿到。
4、只有满足(admin和user的session属性都没有拿到时)才可以拦截,只要满足其中 的一个便放行。