zoukankan      html  css  js  c++  java
  • springmvc拦截器问题之通过角色名来取对应的方法

    题目:

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

    如果角色名为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域中的用户信息
    HttpSession session=request.getSession(); User user= (User)session.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 { } }

    四、写一个404.jsp,没有权限的页面;

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>没有权限</title>
    </head>
    <body>
    <h1>对不起!没有权限执行相关操作。</h1>
    </body>
    </html>

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

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

     下面说明一些测试注意的方法:

    已有功能

    1)登录拦截:如有没有登录,访问其他资源,会跳转到登录页面;

    a.在没登录的情况下,访问资源,==》跳转登录页面;

    b.登录了,再去访问资源,不会跳转登录页面,能够正常访问;

    2)权限控制:如果登录的用户操作其角色拥有的权限,可正常操作,如果操作其角色没有拥有权限,则会跳转到403没有权限页面。

    a.Admin ==》StudentController, IndexController中的方法可以访问;

       test==》UserController中的方法可以访问;

    b.其他的不能访问 ,直接跳转到403.jsp页面;

  • 相关阅读:
    前端必须掌握的 docker 技能(2)
    前端必须掌握的 docker 技能(1)
    异步 map 和模块打包
    import 和组件库按需引入
    babel-node 和 nodemon
    linux和mac 终端代理
    yarn.lock 是干什么的
    pwa 总结
    设计模式(5): vue 不监听绑定的变量
    django+celery+redis应用
  • 原文地址:https://www.cnblogs.com/xie-qi/p/12983731.html
Copyright © 2011-2022 走看看