2019独角兽企业重金招聘Python工程师标准>>>

自定义springweb拦截器

一种实现方式:继承HandlerInterceptorAdapter类,该类有四种方法;

  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 返回布尔类型,在请求执行前进行拦截处理.有很多interceptor,但hanlder是排在最后的,必须通过之前的拦截器处理才行.

如果有异常,或自定义返回的response,handler链将无法执行.

  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception; 在请求被handler处理之后,在DispatcherServlet渲染视图之前进行拦截.可以获得ModelAndView模型,抛出异常可以让执行链中断; 执行顺序与拦截器注册顺序相反.

  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 这个要在执行链完成之后处理,准确的是在视图渲染之后执行; 注:该方法只有在所有的拦截器成功执行并返回视图之后执行,且顺序与拦截器注册的顺序相反.

  • void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception; 是一个异步的方法,可以替代方法2和3,但尽量不要改变request和reponse,以免发生线程冲突. 典型使用环境,清楚线程变量(A typical use of this method would be to clean up thread-local variables);

我需要在hanler执行之前获取请求参数的userId,所以只是用preHandle()方法.

代码如下:

public class UserFilter extends HandlerInterceptorAdapter {// 存放用户idstatic ThreadLocal<String> userLocal = new ThreadLocal<>();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/*      if (request.getRequestURI().indexOf("/cart/") == 0) {String userId = request.getParameter("userId");userLocal.set(userId);}*/String userId = request.getParameter("userId");userLocal.set(userId);return true;}
}

这里用了个默认修饰符的静态变量,可以使别的包无法获取该静态变量.

下面我们需要注册这个拦截器,springboot下如此注册,创建一个类,继承了WebMvcConfigurerAdapter配置,里面有个方法,用来注册自定义拦截器,并可以为该项添加匹配路径addPathPatterns;拦截所有是/**,这里设置的需要拦截的url.

@Configuration
public class CartWebMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserFilter()).addPathPatterns("/cart/**");}
}

当然还有其他用法,不过没有认真涉及.

如何实现restful跳转

大部分使用springmvc,要实现restful风格的http请求.可以通过获取HttpServletResponse对象来获取,然后输出json.

/* * Created by  on 2017/3/23.** @*/import com.alibaba.fastjson.JSON;
import com.netflix.discovery.EurekaClient;
import com.sanji.mall.common.util.*;
import com.sanji.mall.members.service.MemberService;
import com.sanji.mall.model.Members;
import com.sanji.mall.model.OrderSignFor;
import com.sanji.mall.yworder.service.OrderSignForService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;/*** @author yangqc*         User: yangqc*         Date: 2017/3/23*         Time: 10:13* @Description* @since 1.0*/
@Component("appUserFilter")
public class AppUserFilter extends HandlerInterceptorAdapter {@Autowiredprivate EurekaClient eurekaClient;@Autowiredprivate OrderSignForService orderService;@Resourceprivate MemberService memberService;private static final Logger logger = Logger.getLogger(AppUserFilter.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {try {if (request.getMethod().equals("POST")) {String userId = request.getParameter("userId");if (null == userId || userId.equals("")) {userId = request.getParameter("memberId");}Members member = memberService.gainMembersDetailById(userId);String mobile;if (null == member && request.getRequestURI().contains("/login/check")) {mobile = request.getParameter("username");} else if (null == member) {return true;} else {mobile = member.getMobile();}//白名单
//          if (!filterWhiteList(mobile)) {
//              writeJson(response, ResponseFactory.getFailed("没在白名单中!!"));
//              return false;
//          }//支付超时if (!filterUnpayedOrder(mobile)) {writeJson(response, ResponseFactory.getFailed("有订单超时支付,功能暂时关闭,请联系业务员付款!!"));return false;}}} catch (Exception e) {logger.error("app拦截器报错!", e);writeJson(response, ResponseFactory.getFailed("拦截器出错-->" + e.getLocalizedMessage()));return false;}return true;}/*** 根据手机号判断是否在黑名单中** @param mobile 手机号* @return 是否通过黑名单验证*/public boolean filterUnpayedOrder(String mobile) {Date loginDay = new Date();//业务员登陆时间String loginDayStr = DateUtil.getStringByDate(loginDay, "yyyy-MM-dd");Date loginDay12 = DateUtil.getDateStrToDate(loginDayStr + " 12:00", "yyyy-MM-dd HH:mm");//登陆当日的12:00Date yesterday = DateUtil.getAnotherDate(loginDay, -1);//业务员登陆的前一天String yesterdayStr = DateUtil.getStringByDate(yesterday, "yyyy-MM-dd");String yesterdayStr12 = yesterdayStr + " 12:00";//前一天12:00String yesterdayStr24 = yesterdayStr + " 23:59";//前一天24:00//12点以前登陆if (!DateUtil.compareDate(loginDay12, loginDay)) {//查询昨天12:00之前是否有未付款订单,有就不行List<OrderSignFor> orderSignFors = orderService.findByMobile(mobile, yesterdayStr12);if (CollectionUtils.isEmpty(orderSignFors)) {return true;}} else {//查询昨天24:00之前是否有未付款订单List<OrderSignFor> orderSignFors = orderService.findByMobile(mobile, yesterdayStr24);if (CollectionUtils.isEmpty(orderSignFors)) {return true;}}return false;}/*** 根据手机号判断是否在白名单** @param mobile 手机号* @return 是否通过白名单验证*/public Boolean filterWhiteList(String mobile) {String message = HttpClientUtils.sendGetRequest(EurekaUtils.getUrl(eurekaClient, "whitelist") + "get/NO_PAYMENT/" + mobile, null);String status = (String) JsonUtil.getMap4Json(message).get("status");Boolean result = (Boolean) JsonUtil.getMap4Json(message).get("result");return "success".equals(status) && result;}// 将对象写成json扔到前台public void writeJson(HttpServletResponse response, Object object) {try {String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");response.setContentType("text/html;charset=utf-8");response.getWriter().write(json);response.getWriter().flush();response.getWriter().close();} catch (IOException e) {e.printStackTrace();}}
}

在其return false之前用response将相应内容用json输出,这样就可以了.

转载于:https://my.oschina.net/u/1590027/blog/816392

springweb拦截器相关推荐

  1. 【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题

    问题描述 前端域名FE.com向后端域名BE.com分别请求访问优惠券的列表和提交新增的优惠券,API设计所用的Method分别为Get和Post,结果为前一次访问成功而后一次访问失败.这两次请求都是 ...

  2. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

  3. SpringMVC自定义拦截器与异常处理(自定义异常)

    SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...

  4. SpringMVC拦截器之拦截器接口方法演示

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  5. filter导致跨域失效_【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题...

    问题描述 前端域名FE.com向后端域名BE.com分别请求访问优惠券的列表和提交新增的优惠券,API设计所用的Method分别为Get和Post,结果为前一次访问成功而后一次访问失败.这两次请求都是 ...

  6. SSM框架之Spring MVC(四)异常处理和拦截器实现

    一.SpringMVC中的异常处理 1.1异常处理的思路 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通 ...

  7. JSR303和拦截器

    目录 一.JSR303的实现 二.拦截器的初步认识 拦截器链 三.登录权限控制 一.JSR303的实现 /* @NotNull :作用于基本数据类型* @NotEmpty 作用于集合* @NotBla ...

  8. spring整合JDBC 实现拦截器用户的登录和注册的案例源代码及解析

    前言:为了大家学习的方便,我自己完成了一个登录注册的小案例供大家参考,如有疑问?请私信博主,小主辛苦总结,望大家转载请标明出处. **项目介绍:**本项目使用的是spring整合jdbc实现用户的登录 ...

  9. SpringMVC (注解、拦截器、json、Ajax)

    SpringMVC 1.回顾MVC 1.1 什么是mvc MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来 ...

最新文章

  1. HealthKit开发教程之HealthKit的复合数据
  2. linux下/proc/cpuinfo文件
  3. 绘制对象iPhone开发基础教程 笔记
  4. 【机器学习】4 款超级棒的模型可解释性工具包,总有一款适合你!
  5. linux c 编程 pdf_C/C++编程笔记:Linux 日志文件系统未解之谜,你知道吗?
  6. mysql naivcat执行存储过程_mysql使用navicat编写调用存储过程
  7. 让Linux使用malloc申请更多的内存
  8. python中常用的os模块
  9. 电脑不能正常启动windows怎么办,电脑系统无法正常启动
  10. ubuntu linux 搭建ftp虚拟目录
  11. PHP的XML Parser(转)
  12. git push 忽略.idea文件夹下的文件
  13. 如何编写产品说明文档?
  14. postgresql注册表删除_彻底删除SQL Server注册表的方法
  15. 利用FME创建CAD标准图层模板
  16. svn update 出现skipped '.' 或skipped '目录名称'
  17. Android HttpURLConnection下载网络图片,设置系统壁纸
  18. 利用PYTHON出小学数学题
  19. 台式电脑怎么找不到计算机在哪,台式电脑没有声音了怎么恢复(在家用这两个方法轻松解决)...
  20. 斯伯克CYBELEC触摸屏维修CybTouch12折弯机特点

热门文章

  1. windows 上ping输入到指定文件中
  2. 前端H5怎么切换语言_H5前端和移动APP开发知识点和配套视频
  3. mysql case break_按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!...
  4. mysql导入frm文件_MySQL备份文件.ibd、.frm、.MYD、.MYI的恢复教程
  5. java websocket修改为同步_初级Java程序员需要掌握哪些主流技术才能拿25K?
  6. java 合并 set_【Java必修课】各种集合类的合并(数组、List、Set、Map)
  7. 泛域名解析怎么做php,nginx如何做泛域名解析
  8. 好久没有处理过故障了
  9. AngularJS table 按照表头字段排序功能(升序和降序)
  10. Kotlin 在kotlin内使用Java的一些注意(长篇)