SpringMVC下的一个简单的权限拦截效验

来源:互联网 发布:淘宝上足球鞋正品店铺 编辑:程序博客网 时间:2024/06/05 20:57

实现后具体效果:如果用户没有登录,跳转到登录页面

在web.xml中定义SpringMVC前端控制器配置拦截所有请求

<!-- 定义Spring MVC的前端控制器 -->  <servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>        org.springframework.web.servlet.DispatcherServlet    </servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:springmvc-config.xml</param-value>    </init-param>  </servlet>    <!-- 让Spring MVC的前端控制器拦截所有请求 -->  <servlet-mapping>    <servlet-name>springmvc</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping>

在Springmvc-config配置拦截器

  <!-- 定义Spring MVC的拦截器 -->  <mvc:interceptors>        <mvc:interceptor>            <!-- 拦截所有请求 -->            <mvc:mapping path="/*"/>            <!-- 自定义判断用户权限的拦截类  -->             <bean class="csh.hrm.interceptor.AuthorizedInterceptor"/>        </mvc:interceptor>    </mvc:interceptors> 

拦截请求后到csh.hrm.interceptor.AuthorizedInterceptor类下去做相应的判断

AuthorizedInterceptor类:

/**  * 判断用户权限的Spring MVC的拦截器 */public class AuthorizedInterceptor  implements HandlerInterceptor {    /** 定义不需要拦截的请求 */    private static final String[] IGNORE_URI = {"/loginForm", "/login","/404.html"};     /**      * 该方法需要preHandle方法的返回值为true时才会执行。     * 该方法将在整个请求完成之后执行,主要作用是用于清理资源。     */      @Override    public void afterCompletion(HttpServletRequest request,            HttpServletResponse response, Object handler, Exception exception)            throws Exception {    }     /**      * 这个方法在preHandle方法返回值为true的时候才会执行。     * 执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行。     */      @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response,            Object handler, ModelAndView mv) throws Exception {    }     /**      * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,     * 当preHandle的返回值为false的时候整个请求就结束了。      * 如果preHandle的返回值为true,则会继续执行postHandle和afterCompletion。     */      @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,            Object handler) throws Exception {        /** 默认用户没有登录 */        boolean flag = false;         /** 获得请求的ServletPath */        String servletPath = request.getServletPath();        /**  判断请求是否需要拦截 */        for (String s : IGNORE_URI) {            if (servletPath.contains(s)) {                flag = true;                break;            }        }        /** 拦截请求 */        if (!flag){            /** 1.获取session中的用户  */            User user = (User) request.getSession().getAttribute(HrmConstants.USER_SESSION);            /** 2.判断用户是否已经登录 */            if(user == null){                 /** 如果用户没有登录,跳转到登录页面 */                request.setAttribute("message", "请先登录再访问网站!");                request.getRequestDispatcher(HrmConstants.LOGIN).forward(request, response);                return flag;            }else{                 flag = true;            }        }        return flag;    }}

userController:

    @RequestMapping(value="/login")    public ModelAndView login(String loginname,String password,HttpSession session,ModelAndView mv){        User user=userService.login(loginname, password);        if(user!=null){            // 将用户保存到HttpSession当中            session.setAttribute(HrmConstants.USER_SESSION, user);            // 客户端跳转到main页面            mv.setViewName("redirect:/main");        }else {            mv.addObject("message", "登录名或密码错误!请重新输入");            mv.setViewName("forward:/loginForm");        }        return mv;    }

如果用户登录就将信息存入Session中,这样在拦截判断的时候如果能取到对应的session值,就是有登录,返回true,否则跳转到登录页面

原创粉丝点击