码迷,mamicode.com
首页 > 编程语言 > 详细

springmvc拦截器问题之通过角色名来取对应的方法

时间:2020-05-28 21:50:37      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:mit   handler   用户数   object   index   except   body   ESS   信息   

题目:

编写一个拦截器,在拦截器中获取登录用户的角色名,

如果角色名为admin,则允许操作StudentController的方法;

如果角色名为test,则允许操作UserController的方法;

如果没有权限,则跳转到一个特定的jsp页面,提示权限不足;

一、先写一个显示在浏览器端的登录页面;

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login">
    用户名:<input type="text" name="name"/><br/>
    密码:  <input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

二、再写一个控制层的业务逻辑;

@Controller
public class IndexController {
    @RequestMapping("/login")
    public String login(String name, String password, HttpSession session){
        System.out.println("获取到前台数据:name="+name+",password="+password);
        //todo 查询数据库,验证是否存在用户数据
        User user=new User();
        user.setName(name);

        Role role=null;
        if ("admin".equals(name)){
            role=new Role("admin",1);
        }else if ("test".equals(name)){
            role=new Role("test",2);
        }
        user.setRole(role);

        if (user==null){//如果用户不存在,跳回登录页面
            return "login.jsp";
        }
        //登录成功,将用户信息放入session
        session.setAttribute("user",user);
        return "index.jsp";
    }
}

三、最后写一个用户的权限拦截器;

//用户权限拦截器
public class AuthorityInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取到session域中的用户信息
        User user= (User) request.getSession().getAttribute("user");
        //获取角色信息
        Role role=user.getRole();
        if (role!=null){
            //获取当前的请求的Controller
            String controllerName="";
            if (handler instanceof HandlerMethod) {
                HandlerMethod method = (HandlerMethod) handler;
                //获取当前控制层的名字
                controllerName = method.getBeanType().getSimpleName();
            }
            Map<String, List<String>> map=new HashMap<>();
            //角色名  角色拥有的权限
            map.put("admin", Arrays.asList("StudentController","IndexController"));
            map.put("test",Arrays.asList("UserController"));
            //判断角色与请求的控制层关系
            List<String> list=map.get(role.getName());
            if (list!=null&&list.contains(controllerName)){
                return true;
            }
        }
        response.sendRedirect(request.getContextPath()+"/403.jsp");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

四、到这里呢,我们的脚本工作已经完成了,还需要在springmvc的配置文件中再配置一个角色的拦截器,这里有一点我们需要注意,如果我们在配置文件中配置了多个拦截器的话,拦截器的执行顺序为其配置的先后顺序,配置的前面的先执行;

        <!-- 拦截器的执行顺序为其配置顺序,配置在前面的先执行-->
        <mvc:interceptor>
           <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <bean id="authorityInterceptor" class="interceptor.AuthorityInterceptor"></bean>
        </mvc:interceptor>

 

springmvc拦截器问题之通过角色名来取对应的方法

标签:mit   handler   用户数   object   index   except   body   ESS   信息   

原文地址:https://www.cnblogs.com/xie-qi/p/12983731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!