1. 项目需求  68

只有经过登录的用户方可访问处理器,否则,将返回“无权访问”提示。本例的登录,由一个 JSP 页面完成。即在该页面里将用户信息放入 session 中。也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。

2. 项目实现  68

使用拦截器检查登录的用户是不是能访问系统

1.新建maven

2.修改web.xml注册中央调度器  68

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>myweb</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--自定义springmvc读取的配置文件的位置   4-->
        <init-param>
            <!--springmvc的配置文件的位置的属性-->
            <param-name>contextConfigLocation</param-name>
            <!--指定自定义文件的位置-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--在tomcat启动后,创建Servlet对象
           load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,数值越小,
                           tomcat创建对象的时间越早。 大于等于0的整数。
       -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>myweb</servlet-name>
        <!--
            使用框架的时候, url-pattern可以使用两种值    5
            1. 使用扩展名方式, 语法 *.xxxx , xxxx是自定义的扩展名
               常用的方式 *.do, *.action, *.mvc等等
               http://localhost:8080/myweb/some.do
               http://localhost:8080/myweb/other.do
               不能使用 *.jsp
            2.使用斜杠 "/"
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


</web-app>

3.新建index.jsp发起请求  68

index.jsp

<%--登录权限验证  68--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme() + "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>
<html>
<head>
    <title>Title</title>
    <base href="<%=basePath%>" />
</head>
<body>

<p>多个拦截器</p>
<form action="some.do" method="post">
    姓名:<input type="text" name="name"> <br/>
    年龄:<input type="text" name="age"> <br/>
    <input type="submit" value="提交请求">
</form>


</body>
</html>

4.创建MyController处理请求

MyController

package com.bjpowernode.controller;

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

/**
 * 登录权限验证  68
 */
@Controller
public class MyController {


    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name,Integer age){
        System.out.println(" =====执行MyController中的doSome方法=====");
        //处理some.do请求了。 相当于service调用处理完成了。
        ModelAndView mv  = new ModelAndView();

        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }

}

5.创建结果  68

show.jsp

<%--登录权限验证  68--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>/WEB-INF/view/show.jsp从request作用域中获取数据</h3><br>
<%--    展示数据   --%>
    <h3>myname数据:${myname}</h3><br>  <%--这里使用El表达式--%>
    <h3>myage数据:${myage}</h3>
</body>
</html>

6. 模拟登录   69

创建一个login.jsp,模拟登录(把用户的信息放入到session)

创建一个jsp, logout.jsp,模拟退出系统(从session中删除数据)

login.jsp

<%--模拟登录  69--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    模拟登录,zs登录系统
    <%
        session.setAttribute("name","zs");
    %>
</body>
</html>

logout.jsp

<%--模拟退出登录  69--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   退出系统,从session中删除数据
  <%
      session.removeAttribute("name");
  %>
</body>
</html>

7.创建拦截器,从session中获取用户的登录数据,验证能否访问系统  69

MyInterceptor

package com.bjpowernode.handler;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

//多个拦截器的执行  69
public class MyInterceptor implements HandlerInterceptor {

    //验证登陆的用户信息,正确return true 其他return false
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器MyInterceptor的preHandle()执行");
        String loginName = "";
        Object attr = request.getSession().getAttribute("name");
        //如果session中得到的name不为空,则把name赋值给loginName
        if(attr!=null){
            loginName=(String)attr;
        }
        
        //name为空证明用户没有登陆过(我们这里只设置zs能登录)
        //判断登录的账户,是否符合要求   69
        if( !"zs".equals(loginName)){
            //不能访问系统
            //给用户提示
            request.getRequestDispatcher("/tips.jsp").forward(request,response);
            return false;
        }
        //zs登录
        return true;
        
    }

}

8.创建一个验证的jsp,如果验证视图,给出提示  68

tips.jsp

<%--登录被拦截  68--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  tips.jsp  非zs不能访问系统
</body>
</html>

9.创建springmvc配置文件  68

  声明组件扫描器

  声明拦截器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--声明组件扫描器  8-->
    <context:component-scan base-package="com.bjpowernode.controller" />

    <!--声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径   40-->
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/" />
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp" />
    </bean>

    <!--声明拦截器:模拟 登陆权限验证  68
    -->
    <mvc:interceptors>
        <!--声明第一个拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--声明拦截器对象-->
            <bean class="com.bjpowernode.handler.MyInterceptor" />
        </mvc:interceptor>
        
    </mvc:interceptors>

</beans>

测试

先访问 login.jsp,进行用户登录 http://localhost:8080/ch12_interceptor_permission/login.jsp

拦截器应用举例之权限拦截器_html

然后在提交请求

拦截器应用举例之权限拦截器_spring_02

结果

拦截器应用举例之权限拦截器_xml_03

在访问退出登录http://localhost:8080/ch12_interceptor_permission/logout.jsp

拦截器应用举例之权限拦截器_xml_04

然后在次提交请求

拦截器应用举例之权限拦截器_html_05

结果

拦截器应用举例之权限拦截器_拦截器应用举例_06