如何用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 {
}