SpringMVC--07拦截器

2017-09-01  本文已影响0人  exmexm

一、通过实现HandlerInterceptor接口来定义拦截器

1、通过实现HandlerInterceptor接口来定义拦截器:
public class MyInterceptor implements HandlerInterceptor{
// 处理请求方法前先执行该方法,如果返回false则不执行后续的拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("处理前" + request.getRequestURI());
        return true;
    }

    // 处理请求方法执行后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("处理后");
    }

    // 在DispatcherServlet执行后执行,主要做一些清理工作。。。Springmvc的对象是单例的
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("最最后");
    }
}
2、定义Springmvc文件

不要忘记添加:
xmlns:mvc="http://www.springframework.org/schema/mvc"在配置文件头

<!--拦截器的配置 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- /**指的是该路径及其子路径 如果配合admin/* ,则拦截不了admin/user/add,想要拦截则配置admin/** -->
            <mvc:mapping path="/**" />
            <bean class="winney.controller.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

如果被拦截了,可以在prepreHandle通过ServletAPI进行转发或者重定向。

二、实现登录拦截

1、添加登录界面:

    <form method="post" action="/hello2/logon.do">
        姓名:<input type="text" name="uname"><br> 密码:<input
            type="password" name="pwd"> <br> <input type="submit"
            vaslue="submit">
    </form>
2、实现登录处理器:
@Controller
public class LoginController {
    @RequestMapping("/logon")
    public String login(User user, HttpSession session) {
        if ("winney".equals(user.getUname()) && "1234".equals(user.getPwd())) {
            session.setAttribute("user", user);
            return "/index";
        }
        return "/login";
    }
}

3、实现拦截器

这里在拦截器里面添加一个allowPass属性,用于设置哪些url是可以直接通过,不拦截的。

private List<String> allowPass;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String url = request.getRequestURL().toString();
        Object user = request.getSession().getAttribute("user");
        if (user != null) {
            return true;
        }
        for (String temp : allowPass) {
            if (url.endsWith(temp)) {
                return true;
            }
        }
        request.getRequestDispatcher("/login.jsp").forward(request, response);
        return false;
    }

4、在配置文件里面配置拦截器
注意:这里给拦截器里面的allowPass属性注入了初始值。所以在allowPass是必须生成getter和setter方法的。

<mvc:interceptor>
            <!-- /**指的是该路径及其子路径 如果配合admin/* ,则拦截不了admin/user/add,想要拦截则配置admin/** -->
            <mvc:mapping path="/**" />
            <bean class="winney.controller.LoginInterceptor">
                <property name="allowPass">
                    <list>
                        <value>/logon.do</value>
                    </list>
                </property>
            </bean>
        </mvc:interceptor>
上一篇 下一篇

猜你喜欢

热点阅读