springweb拦截器
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拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winpcap 发送数据包
- 下一篇: 【githubgit】1、github中