zoukankan      html  css  js  c++  java
  • SpringMVC拦截器

    首先添加依赖:

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.1.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
      <scope>provided</scope>
    </dependency>
    

    配置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_3_1.xsd"
             version="3.1">
    
      <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:spring.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    </web-app>
    

    配置:spring.xml:

    <?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:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="com.fitsoft.controller"/>
    
        <!-- 拦截器的注册 -->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/user/**"/>
                <!-- 排除拦截,一般在通配符中有意义 -->
                <!--<mvc:exclude-mapping path="/user/search"/>-->
                <bean class="com.fitsoft.core.LoginInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    

    目录结构大致是这样的:

    ![](https://i.loli.net/2019/09/14/KbmIYinGCqPM85S.png)

    配置成功之后编写LoginInterceptor拦截器类:

    package com.fitsoft.core;
    
    import org.springframework.util.StringUtils;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * @author Joker
     * @since 2019/9/14 0014 15:56
     */
    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
    
            String user = (String) httpServletRequest.getSession().getAttribute("user_session");
    
            if(StringUtils.isEmpty(user)){
                System.out.println(httpServletRequest.getContextPath());
                httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login");
                return false;
            }
    
            System.out.println("keketip=====preHandler===>");
    
          //  return false;//会终止所有请求
            return true;
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            
            System.out.println("keketip=====postHandler===>");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
            System.out.println("keketip=====afterHandler===>");
        }
    }
    

    这里实现HandlerInterceptor接口,主要有三个方法:
    preHandle、postHandle 和 afterCompletion
    其中preHandle返回true,否则拦截器就失效了,然后在这个方法里处理请求,判断session中的用户是否为空,如果为空则跳转登录界面,不为空则跳转search界面。
    login.jsp:

    <%--
      Created by IntelliJ IDEA.
      User: Joker
      Date: 2019/9/14 0014
      Time: 16:16
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>登录</h1>
    <form action="logined" method="post">
        <label>用户名</label>
        <input name="username" type="text">
        <label>密码</label>
        <input name="password" type="text">
        <button type="submit">登录</button>
    </form>
    </body>
    </html>
    

    这个是登录界面,只有一个form表单也没有样式,做的很简陋
    LoginController:

    package com.fitsoft.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import javax.servlet.http.HttpSession;
    
    /**
     * @author Joker
     * @since 2019/9/14 0014 16:20
     */
    @Controller
    public class LoginController {
    
    
        @RequestMapping("/login")
        public String login(){
            return "login";
        }
    
        @RequestMapping("/logined")
        public String logined(@RequestParam("username") String username,
                            @RequestParam("password") String password,
                              HttpSession httpSession){
    
            System.out.println(username);
            System.out.println(password);
    
            httpSession.setAttribute("user_session", "6666666");
    
            return "redirect:user/search";
        }
    }
    

    我们在登录这个方法里面放入session,登录成功之后跳转到search界面,这样我们的拦截器就会发挥作用了,如果有用户登录,则有session,拦截器放行,如果不进行登录,则没有session,直接访问界面会回到login界面。另外还有一个UserController,访问search跳转到search界面:

    package com.fitsoft.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpSession;
    
    /**
     * @author Joker
     * @since 2019/9/14 0014 16:15
     */
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @RequestMapping("/search")
        public String search(HttpSession httpSession){
            return "user/search";
        }
    }
    

    不算难,会用就行。

  • 相关阅读:
    论学究式教育
    Oracle中rownum与order by的执行顺序
    无效存储过程问题解决
    解决SGA_MAX_SIZE 的大小比 MEMORY_TARGET 大导致数据无法启动的错误
    ORACLE 按时间创建分区表
    Timage Canvas画图
    Oracle存储过程的加密
    Win32对话框模板创建的窗口上响应键消息,Tab焦点切换消息,加速键消息
    win32 TreeCtrl控件通知消息, LVN_SELCHANGED和LVN_ITEMCHANGED用法
    win32 对话框模板添加加速键
  • 原文地址:https://www.cnblogs.com/zqm-sau/p/11519931.html
Copyright © 2011-2022 走看看