国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

對過濾器和攔截器的認識和總結

2019-11-08 18:48:42
字體:
來源:轉載
供稿:網友

參考:http://blog.csdn.net/chenleixing/article/details/44573495 http://haohaoxuexi.iteye.com/blog/1750680

以前在學習時一直搞不清這兩者的區別,以為過濾器是servlet中的,攔截器是sPRingmvc的,后來在做一個登錄攔截的時候,發現兩者都可以實現,所以稍微的終結了一下。 下圖是過濾器和攔截聯合使用時的請求的流程

這里寫圖片描述

過濾器是javaEE標準,采用函數回調的方式進行。是在請求進入容器之后,還未進入Servlet之前進行預處理,并且在請求結束返回給前端這之間進行后期處理。

攔截器是被包裹在過濾器之中的。

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion");}

  a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在 [System.out.println(“before…”)][chain.doFilter(request, response)]之間執行。   b.preHandle()方法之后,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。   c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)][System.out.println(“after…”)]之間執行。

下面是具體的使用方式 這里寫圖片描述

1.編寫一個java類,實現Filter接口

package cn.note.web;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.applicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import cn.tedu.note.service.UserService;public class ACLFilter implements Filter{ private ServletContext sc; private ApplicationContext ctx; private UserService userService; /** * 過濾器初始化代碼 */ public void init(FilterConfig cfg) throws ServletException { sc= cfg.getServletContext(); //獲取Spring容器 ctx=WebApplicationContextUtils.getWebApplicationContext(sc); //從容器中獲取 UserService 對象 userService=ctx.getBean("userService",UserService.class); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException { chain.doFilter(request, response); } public void destroy() { }}

2.doFilter中實現攔截

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response =(HttpServletResponse) res; String path=request.getRequestURI(); //System.out.println(path); path = path.substring( path.indexOf('/', 1)); //System.out.println("trim path:"+path); if(path.matches(".*/edit//.html$")){ checkLogin(request,response,chain); return; } if(path.matches(".(note).*//.do$")){ checkDotDo(request,response,chain); return; } chain.doFilter(request, response); }

3.將過濾器添加到web程序中 在web.xml中添加如下的配置

<filter> <filter-name>acl</filter-name> <filter-class> cn.note.web.ACLFilter </filter-class> </filter> <filter-mapping> <filter-name>acl</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

4.打包部署。。 這樣一個簡單的過濾器就已經完成了。其最核心的其實也就是dofilter里面對過濾條件的判斷

下面是攔截器的使用 和過濾器一樣 第一步:首先 implements HandlerInterceptor接口 第二步:由于我要在執行controller之前拿到cookie的value 所以我在preHandle方法里面實現代碼 第三步:與spring的項目整合

package com.jt.web.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.jt.common.service.HttpClientService;import com.jt.common.util.CookieUtils;import com.jt.web.controller.UserController;import com.jt.web.controller.UserThreadLocal;import com.jt.web.pojo.User;public class CartInterception implements HandlerInterceptor{ @Autowired private HttpClientService httpClientService; private static final ObjectMapper MAPPER=new ObjectMapper(); //在執行整個controller完成渲染之后(數據完成綁定后,即將就要轉發了),轉向頁面之前 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } //在執行controller之后 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } //在執行controller方法前執行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2) throws Exception { //從cookie中獲取ticket String ticket=CookieUtils.getCookieValue(request, UserController.UsercookieName); if(StringUtils.isEmpty(ticket)){ UserThreadLocal.setUser(null); }else{ //成功獲取ticket String url="http://sso.jt.com/user/query/"+ticket; String jsonData=httpClientService.doGet(url, "utf-8"); if(StringUtils.isNoneEmpty(jsonData)){ //成功獲取jsonData JsonNode jsonNode=MAPPER.readTree(jsonData); String data=jsonNode.get("data").asText(); User user=MAPPER.readValue(data, User.class); UserThreadLocal.setUser(user); }else{ UserThreadLocal.setUser(null); } } return true;//默認不放行,日常的情況下,不管對錯都放行 }}

在springmvc的配置文件中添加

<!-- 配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 指定攔截的映射 ,**攔截后面的多級目錄--> <mvc:mapping path="/cart/**"/> <!-- 指定實現類 --> <bean class="com.jt.web.interceptor.CartInterception"></bean> </mvc:interceptor> </mvc:interceptors>

發布部署即可。


上一篇:FFT入門

下一篇:常用工具類

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莆田市| 蒙城县| 鹤庆县| 曲阜市| 驻马店市| 南安市| 新蔡县| 团风县| 余庆县| 泸水县| 乐陵市| 寻甸| 正安县| 宝山区| 夹江县| 饶平县| 乳山市| 遵化市| 虎林市| 泸州市| 东城区| 康保县| 永清县| 家居| 库伦旗| 阳春市| 云梦县| 霍邱县| 岱山县| 白城市| 楚雄市| 玉林市| 塔河县| 浦县| 历史| 包头市| 清原| 武强县| 石河子市| 舞阳县| 绩溪县|