SpringMVC的拦截器(十四)下

简介: SpringMVC的拦截器(十四)

四. 配置常见的登录拦截器


四.一 创建登录拦截器 LoginInterceptor (重点)


LoginInterceptor.java


package com.yjl.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.ui.Model;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.yjl.pojo.User;
public class LoginInterceptor implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
  }
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
      Object obj) throws Exception {
    //获取请求的地址
    String uri=request.getRequestURI();
    //不需要拦截的地址, 可以放置在  springmvc.xml 中进行配置。
    String [] excludeURI=new String[]{"toLogin","login","toRegister","register","forgetPassword"};
    for(String str:excludeURI){
      if(uri.indexOf(str)>=0){ //如果包含,就直接通过。
        return true;
      }
    }
    HttpSession session=request.getSession();
    Object sessionObj=session.getAttribute("userLogin");
    if(sessionObj!=null){
      //如果不能转换,会报类型转换异常的。
      User user=(User)sessionObj;
      if(user!=null){ 
        return true;
      }
    }
    //来替换 toLogin 里面的 model设置值。
    request.setAttribute("user",new User());
    request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
    return false;
  }
}


四.二 后端 UserAction


@Controller
@RequestMapping(value="/user")
public class UserAction {
  //转到登录的页面
  @RequestMapping(value="toLogin")
  public String toLogin(Model model){
    model.addAttribute("user",new User());
    System.out.println("执行toLogin方法");
    return "user/login";
  }
  @RequestMapping(value="login")
  public String login(User user,HttpSession session){
    System.out.println("执行Login方法");
    if("两个蝴蝶飞".equals(user.getName())&&"1234".equals(user.getPassword()))
    {
      session.setAttribute("userLogin", user);
      return "user/list";
    }else{
      return "user/login";
    }
  }
  @RequestMapping(value="list")
  public String list(){
    //执行list方法
    return "user/list";
  }
  @RequestMapping(value="toRegister")
  public String toRegister(){
    return "user/register";
  }
  @RequestMapping(value="logout")
  public String logout(HttpSession session,Model model){
    session.invalidate();
    model.addAttribute("user",new User());
    System.out.println("执行logout方法");
    return "user/login";
  }
}


四.三 前端 login.jsp 页面


<body>
  <h2>两个蝴蝶飞,拦截器使用</h2>
  <form:form action="login" commandName="user" type="post">
    <form:label path="name">用户名:</form:label>
    <form:input path="name"/><br/>
    <form:label path="password">密码:</form:label>
    <form:input path="password"/><br/>
    <form:button>提交</form:button>
  </form:form>
</body>


四.四 登录成功后的 list.jsp 页面 和注册register.jsp


list.jsp


里面有注销的链接,来清除session


<body>
  员工${user.name}  &nbsp;&nbsp;&nbsp;&nbsp;<a href="logout">注销</a>
</body>


为了更详细的验证, 多添加一个 DeptAction 和 dept/list.jsp 页面


register.jsp


<body>
  注册页面
</body>


四.五 详细验证,添加Dept的信息


DeptAction.java


@Controller
@RequestMapping(value="/dept")
public class DeptAction {
  //转到登录的页面
  @RequestMapping(value="list")
  public String list(){
    return "dept/list";
  }
}


dept/ list.jsp 页面


<body>
  部门列表
</body>


四.六 springmvc.xml 配置登录拦截器 (重点)


<mvc:annotation-driven></mvc:annotation-driven>
 <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.yjl.interceptor.LoginInterceptor"></bean>
      </mvc:interceptor>
    </mvc:interceptors>


四.七 重启服务器,进行验证


直接输入 : http://localhost:8027/SpringMVC09/dept/list 来访问部门,会跳转到登录的页面。


直接输入 : http://localhost:8027/SpringMVC09/user/logout ,会跳转到登录的页面。


直接输入 : http://localhost:8027/SpringMVC09/user/toRegister,会跳转到注册的页面


20190909164918531.png


当然,输入一个不存在的网址,如 http://localhost:8027/SpringMVC09/user/yuejl, 还是会报404的问题的。


在登录页面,输入 两个蝴蝶飞和1234时,


20190909164854736.png

会跳转到 user/list.jsp 页面


20190909164901880.png


这个时候,再新开一个窗口,不要关闭浏览器。


直接输入: http://localhost:8027/SpringMVC09/dept/list

会显示部门列表,到 dept/list.jsp 页面


20190909164909417.png


在user/list.jsp 页面,点击 注销, 注销后会跳转到 登录的页面。


再刷新刚才打开的那个窗口 dept/list.jsp 页面,发现会跳转到 登录的页面。


拦截器是正确的。


四.八 将拦截的网址放置在 springmvc.xml 中进行配置


LoginInterceptor.java 的 preHandle() 方法去掉 验证。


@Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
      Object obj) throws Exception {
    //获取请求的地址
    String uri=request.getRequestURI();
    //不需要拦截的地址
    /* 
    String [] excludeURI=new String[]{"toLogin","login","toRegister","register","forgetPassword"};
    for(String str:excludeURI){
      if(uri.indexOf(str)>=0){ //如果包含,就直接通过。
        return true;
      }
    }
    */
    HttpSession session=request.getSession();
    Object sessionObj=session.getAttribute("userLogin");
    if(sessionObj!=null){
      //如果不能转换,会报类型转换异常的。
      User user=(User)sessionObj;
      if(user!=null){ 
        return true;
      }
    }
    //来替换 toLogin 里面的 model设置值。
    request.setAttribute("user",new User());
    request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
    return false;
  }


springmvc.xml 中进行配置 <mvc:exclude-mapping


 <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/user/toLogin"/>
        <mvc:exclude-mapping path="/user/login"/>
        <mvc:exclude-mapping path="/user/toRegister"/>
        <mvc:exclude-mapping path="/user/register"/>
        <mvc:exclude-mapping path="/user/forgetPassword"/>
        <bean class="com.yjl.interceptor.LoginInterceptor"></bean>
      </mvc:interceptor>
    </mvc:interceptors>


重启服务器,进行验证, 与 四.七 的结果一致。 建议使用 四.八的配置方法。


谢谢!!!

相关文章
|
6月前
|
Java Spring 容器
【二十二】springboot整合拦截器实战并对比过滤器
【二十二】springboot整合拦截器实战并对比过滤器
81 0
|
6月前
|
存储 调度
SpringMVC 拦截器开发详解
SpringMVC 拦截器开发详解
|
11月前
|
XML 数据格式
SpringMVC中拦截器使用实践详解
SpringMVC中拦截器使用实践详解
114 0
|
Java 数据安全/隐私保护
57SpringMVC - 拦截器案例
57SpringMVC - 拦截器案例
32 0
|
前端开发 Java Spring
|
Java 应用服务中间件 API
【SpringBoot】过滤器 | 拦截器
【SpringBoot】过滤器 | 拦截器
143 0
|
前端开发 Java API
springboot下使用过滤器与拦截器
springboot下使用过滤器与拦截器
|
前端开发 Java Spring
SpringMVC拦截器实现原理
SpringMVC拦截器实现原理
172 0
SpringMVC拦截器实现原理
|
Java 容器 Spring
SpringMVC学习(十一):注解配置SpringMVC
使用配置类和注解代替web.xml和SpringMVC配置文件的功能
140 0
|
前端开发
SpringMVC拦截器的基本使用
1.拦截器(interceptor)的作用 (1)SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 (2)将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体体现。
150 0