如何用spring生成拦截器

如何用spring生成拦截器

写一个类实现HandlerInterceptor这个接口 并重写里的三个方法

package org.nd.interceptor;

import com.google.gson.JsonObject;
import org.nd.entity.ResponseCode;
import org.nd.util.MyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import redis.clients.jedis.Jedis;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

//实现HandlerInterceptor这个接口
public class LoginInterceptor implements HandlerInterceptor{
   


//在目标方法之前执行
   @Override
   public  boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

   }
   //在目标方法之之后执行
    @Override
    public  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
   
//afterCompletion:在渲染视图之后执行
    @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

preHandle:在目标方法之前执行

posthandle:在目标方法之后,渲染视图之前执行

afterCompletion:在渲染视图之后执行

我们在springmvcxml配置文件里配置

<!--自定义拦截器-->
<!--检查登陆的拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--/** 匹配多层路径-->
        <mvc:mapping path="/**"/>
        <!--不拦截登陆界面-->
        <mvc:exclude-mapping path="/admin/login"></mvc:exclude-mapping>
        <!--拦截器所在的类-->
        <bean class="org.nd.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

 

并在webxml文件里配置

 

<!--指定一个spring的配置文件-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:ApplicationContext.xml</param-value>
</context-param>

<!--MySQL日志-->
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
</context-param>

<!--配置springMVC的DispatcherServlet-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--为springMVC指定一个配置文件-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springMVC.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<!--创建springIOC的监听-->
//这是spring的入口
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
package org.nd.interceptor;

import com.google.gson.JsonObject;
import org.json.JSONObject;
import org.nd.entity.ResponseCode;
import org.nd.util.Config;
import org.nd.util.MyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import redis.clients.jedis.Jedis;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;


/**
 * LoginInterceptor class
 *
 * @author ffc
 * @date 2018/12/6
 */

public class LoginInterceptor implements HandlerInterceptor{




    /**
    * @Author ffc
    * @Description     拦截除了登陆界面之后的所有跳转判断用户是否登陆
    * @Date  2018/12/7
    * @Param  * @param request
    * @param response
    * @param handler
    * @return 
    **/
    //因为我在springmvc的配置文件中配置了拦截登陆以外的方法所以这
   // 里登陆我们拦截不到,但是其他的就会杯拦截判断用户是否登陆
    
   @Override
   public  boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

     //获取用户token
     //这里用了redis来做拦截器
     //及用户在登陆的情况下我们会给用户生成一个token并把它放在
     //redis缓存数据库中,并设值一个过期时间,当用户吧token但过来的
     //如果token没有过期那么我就重新刷新一下token的过期时间
     //如果已经过期就让用户重新登陆
       Jedis jedis = new Jedis();
       String token = request.getParameter("token");
      if(token!=null) {
           //根据token从redis'获取token
           String tokens = jedis.get(token);
           if (tokens != null) {
            //刷新时间
               jedis.expire(token,5000);

               return true;
           }
      }
       //没有token
       //String jsonPse= "{\"code\":400,\"msg\":\"token expired\"}";
       //用户没有登陆或token过期的情况下返回一段json给用户提示
       JSONObject jObject=new JSONObject();
       jObject.put("msg","token expired");
       jObject.put("code","400");
      PrintWriter writer = response.getWriter();
       writer.print(jObject.toString());
       writer.flush();
       writer.close();
       return false;


   }
    @Override
    public  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值