日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springweb拦截器

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。