spring拦截器

1、 拦截器概念和struts2一致。

2、 实现拦截器

实现HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {
    
    // 请求处理的方法之前执行
    // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
            Object obj) throws Exception {
        System.out.println("--------------处理前--------------");
        return true;
    }

    // 请求处理的方法之后执行
    @Override
    public void postHandle(HttpServletRequest req, HttpServletResponse resp,
            Object obj, ModelAndView view) throws Exception {
        System.out.println("--------------处理后--------------");
    }

    // DispatcherServlet处理后执行--清理工作
    @Override
    public void afterCompletion(HttpServletRequest req,
            HttpServletResponse resp, Object obj, Exception ex)
            throws Exception {
    }

}

配置拦截器

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 
                /**包括路径及其子路径
                如果是/admin/*-拦截的是/admin/add,/admin/list...但是/admin/add/user不被拦截
                如果是/admin/**-拦截的是/admin路径及其子路径
             -->
            <mvc:mapping path="/**"/>
            <!-- 对应的拦截器 -->
            <bean class="com.yxxy.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3、 如果被拦截——能否到达指定页面?

使用HttpServlertRquest或者HttpServletResponse可以实现转发或者重定向

    // 请求处理的方法之前执行
    // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
            Object obj) throws Exception {
        System.out.println("--------------处理前--------------");
//        req.getRequestDispatcher("/index.jsp").forward(req, resp);
        resp.sendRedirect(req.getContextPath() + "/index.jsp");
        return false;
    }

4、 拦截器应用——登录拦截器

配置文件

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 
                /**包括路径及其子路径
                如果是/admin/*-拦截的是/admin/add,/admin/list...但是/admin/add/user不被拦截
                如果是/admin/**-拦截的是/admin路径及其子路径
             -->
            <mvc:mapping path="/**"/>
            <!-- 对应的拦截器 -->
            <bean class="com.yxxy.interceptor.LoginInterceptor">
                <property name="path">
                    <list>
                        <value>login.do</value>
                    </list>
                </property>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器

public class LoginInterceptor implements HandlerInterceptor {
    // 允许哪些url不被拦截,哪些需要被拦截
    private List<String> path;

    // 请求处理的方法之前执行
    // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
            Object obj) throws Exception {
        // 判断session中是否有对象
        Object user = req.getSession().getAttribute("user");
        if(user != null)
            return true;
        // 判断url是否是登录请求
        String url = req.getRequestURI().toString();
        for (String temp : path) {
            if(url.endsWith(temp)) {
                return true;
            }
        }
        req.getSession().setAttribute("error", "请先登录!");
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
        return false;
    }

    // 请求处理的方法之后执行
    @Override
    public void postHandle(HttpServletRequest req, HttpServletResponse resp,
            Object obj, ModelAndView view) throws Exception {
    }

    // DispatcherServlet处理后执行--清理工作
    @Override
    public void afterCompletion(HttpServletRequest req,
            HttpServletResponse resp, Object obj, Exception ex)
            throws Exception {
    }

    public void setPath(List<String> path) {
        this.path = path;
    }
}

Controller

@Controller
public class UserController {

    @RequestMapping("/login")
    public String hello(User user, HttpSession sesison) {
        if("yxxy".equals(user.getName()) && "111".equals(user.getPwd())) {
            sesison.setAttribute("user", user);
            return "/index.jsp";
        }
        sesison.setAttribute("error", "用户名或者密码错误!");
        return "redirect:/login.jsp";
    }
    
    @RequestMapping("/add")
    public String add() {
        System.out.println("-----------add-------------");
        return "/add.jsp";
    }
    
}

 

posted @ 2018-07-08 21:25  莯汐  阅读(132)  评论(0)    收藏  举报