springMVC----拦截器

1.拦截器概念

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截器是AOP思想的一个实现。
拦截器和过滤器的区别:
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
      2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 
      3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
       4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 
      5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

package cn.limbo.controller;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by limbo on 2016/10/18.
 */
public class MyInterceptor implements HandlerInterceptor {
    //请求处理的方法之前
    //返回true那么执行下一个拦截器,返回false不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("------处理前-------");
        return true;
    }
    //请求处理的方法执行之后
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("------处理后-------");
    }
    //在DispatcherServlet处理后执行-------一般做一些清理工作
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

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

案例----登录控制
springmvc-servlet.xml
<mvc:interceptors>
        <mvc:interceptor>
            <!--
                /** 包括路径及其子路径
                如果是/admin/* 拦截的是/admin/add,/admin/list 等,/admin/user/add不被拦截
                如果是/admin/** 拦截/admin/add,/admin/list /admin/user/add
            -->

            <mvc:mapping path="/**"/>
            <mvc:mapping path="*.jsp" />
            <!--对应拦截器的类-->
            <bean class="cn.limbo.controller.LoginInterceptor">
                <!--注入参数,记得要有set方法-->
                <property name="allowPass">
                    <list>
                        <value>login.do</value>
                    </list>
                </property>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>
LoginInterceptor.java
package cn.limbo.controller;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * Created by limbo on 2016/10/19.
 */
public class LoginInterceptor implements HandlerInterceptor {
    //设置直接放行的url
    private List<String> allowPass;

    public void setAllowPass(List<String> allowPass) {
        this.allowPass = allowPass;
    }

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //session中已经有了登录信息,则直接放行
        Object session = httpServletRequest.getSession().getAttribute("user");
        if(session != null) {
            return true;
        }
        //如果拦截的url在allowPass中,放行
        String url = httpServletRequest.getRequestURL().toString();
        for(String temp:allowPass){
            if(url.endsWith(temp))
                return true;
        }
        //否则需要登录
        httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");

        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}
LoginController.java
package cn.limbo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by limbo on 2016/10/19.
 */
@Controller
@RequestMapping("/loginController")
public class LoginController {
    @RequestMapping("/login.do")
    public String login(HttpServletRequest request, HttpServletResponse response){

        String userName = request.getParameter("userName").trim();
        String password = request.getParameter("password").trim();
        boolean flag = false;
        if(!userName.equals("") && !password.equals("")){
            if(userName.equals("aaa")&&password.equals("111")){
                flag = true;
                request.getSession().setAttribute("user",userName);
            }
        }
        if(flag){
            return "aaa";
        }else{
            return "redirect:/login.jsp";
        }
    }
    @RequestMapping("/add.do")
    public String add(){
        System.out.println("add");
        return "redirect:/index.jsp";
    }

}
几个坑点:1.不能拦截jsp:拦截器只能拦截action,不能拦截jsp等资源页面,也就是说可以直接在地址栏访问到你需要的页面
     解决方式:1.设置filter来过滤jsp。2.将需要登录来看的jsp页面放在WEB-INF文件夹下面。(springMVC推荐这样使用,防止其它你希望隐藏的页面被用户访问到)
  2.配置文件里面的路径问题和注入问题,解决的方式写在注释里面了








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
启动提示说明<br/>如何安装, 设定及使用光驱,同时列出支援的硬体.<br/>如何在 Linux 的系统上使用中文?/TD> <br/>如何更加快速简便地调试刚安装好的Linux系统。<br/>如何成为一个称职的小型 DNS 管理者.<br/>防火墙和代理伺服器. <br/>如何安装GNUC编译器和程式库的方法<br/>如何在Linux系统上安装与使用第二版 GNU C Library<br/>详列了大部份被 Linux 所支援的硬件和驱动程序<br/>Linux系统上的各种业余无线电软件。<br/>包含了 Linux HOWTOs 与 mini-HOWTOs 的索引.<br/>Linux 作业系统的基本资讯<br/>从Unix、Netware、NT 以及 Windows 连接在一起。<br/>拨接 modem 连接到 ISP 网路服务接供业者的网路上。<br/>以及如何用 Java 来写 CGI 程式<br/>如何配置、编译、升级核心以及排难解纷的详细指引?/TD> <br/>一些有关使用Emacs 与 Ispell 工具的提示.<br/>一份有用资讯来源的列表<br/>针对 Linux 作业系统的网路能力提出一个概观的说明<br/>如何设定、维护在 Linux 系统下的 USENET News 伺服器<br/>如何安装及设定 Oracle 资料库伺服器之指南?/TD> <br/>安装及使用 PCMCIA 卡服务程式<br/>帮助你理解和使用 PnP 设备.<br/>如何把你的 Linux PC 连接到一台 PPP 伺服器上. <br/>如何使用 Red Hat 包装管理程式<br/>如何产生, 预览,打印及传真任何文件<br/>如何在 Linux 机器上设定串列通讯设备<br/>一种以 SGML 为基础,让你产生不同输出格式的工具.<br/>Session Message Block (SMB) protocol <br/>在Linux下的关於音效的支援. <br/>Linux上播放各式声音格式的应用程式.<br/>如何将 Linux 系统连接到不断电系统<br/>将现有产品改进并加入新价值的服务公司名单 <br/>Linux 上的 X Window System (X11R6), XFree86 3.3 版.<br/>。。。。。。。 <br/><br/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值