欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

攔截器獲取request的值之后,Controller拿不到值的解決

 更新時間:2021年10月26日 14:22:13   作者:水木小窩  
這篇文章主要介紹了攔截器獲取request的值之后,Controller拿不到值的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

攔截器獲取request的值之后,Controller拿不到值

原因

在Spring中request的值只能被獲取一次,攔截器獲取之后就會導(dǎo)致Controller拿不到值

解決方法

將request的值進行備份,請求到達Controller的時候就會拿到這個值

創(chuàng)建一個自己的HttpServletRequestWrapper并繼承servlet的HttpServletRequestWrapper,為了備份request中的值。

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { 
    private final byte[] buff; 
    public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        InputStream is = request.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int len;
        while ((len = is.read(b)) != -1) {
            baos.write(b, 0, len);
        }
        buff = baos.toByteArray();
    }
 
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(buff);
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bais.read();
            }
        };
    }
 
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
}
 

創(chuàng)建一個Filter,將該過濾器配置在項目中,為了調(diào)用備份的HttpServletRequestWrapper

public class MyRequestBodyFilter implements Filter { 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { 
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        servletRequest = new MyHttpServletRequestWrapper(httpServletRequest);
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    @Override
    public void destroy() { 
    }
}

創(chuàng)建一個工具類,在攔截器中獲取request的值

public class RequestUtils { 
    public static String getRequestValue(HttpServletRequest request) throws IOException {
        StringBuffer sb = new StringBuffer();
        MyHttpServletRequestWrapper myHttpServletRequestWrapper = new MyHttpServletRequestWrapper(request);
        InputStream is = myHttpServletRequestWrapper.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String str;
        while ((str = br.readLine()) != null) {
            sb.append(str);
        }
        return sb.toString();
    } 
}

使用攔截器獲取Controller方法名和注解信息

在使用SpringMVC進行項目的時候用到了權(quán)限驗證。

表分為:

  • 用戶表
  • 角色表
  • 資源表

用戶-角色-資源都是多對多的關(guān)系,驗證無非就是收到請求后,在攔截器循環(huán)判斷用戶是否有權(quán)限執(zhí)行操作。

方法一:通過request獲得用戶的URL

再逐一循環(huán)判斷是否可以操作

只是這種方法很讓人難受。

方法二:通過用戶要訪問的方法來判斷是否有權(quán)限

preHandle方法中handler實際為HandlerMethod,(看網(wǎng)上說的有時候不是HandlerMethod),加個instanceof驗證吧

  • 可以得到方法名:h.getMethod().getName()
  • 可以得到RequestMapping注解中的值:h.getMethodAnnotation(RequestMapping.class)
  • 這種方法還是不太方便

方法三:自定義注解

自定義注解代碼:

@Retention(RUNTIME)
@Target(METHOD)
public @interface MyOperation {
    String value() default "";//默認(rèn)為空,因為名字是value,實際操作中可以不寫"value="
}

Controller代碼:

@Controller("testController")
public class TestController {
    @MyOperation("用戶修改")//主要看這里
    @RequestMapping("test")
    @ResponseBody
    public String test(String id) {
        return "Hello,2018!"+id;
    }
}

攔截器的代碼:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
    System.out.println("進入攔截器");
    if(handler instanceof HandlerMethod) {
        HandlerMethod h = (HandlerMethod)handler;
        System.out.println("用戶想執(zhí)行的操作是:"+h.getMethodAnnotation(MyOperation.class).value());
        //判斷后執(zhí)行操作...
    }
    return HandlerInterceptor.super.preHandle(request, response, handler);
}

補充

在每個方法上面加注解太麻煩啦,可以在類上加注解

@Retention(RUNTIME)
@Target(TYPE)
public @interface MyOperation {
    String value() default "";
}
//攔截器中這樣獲得
h.getMethod().getDeclaringClass().getAnnotation(MyOperation.class);

我可以獲取requestMapping,不用創(chuàng)建自定義注解啊,值得注意的是,不要使用GetMapping等,要使用requestMapping。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java基礎(chǔ)知識總結(jié)之繼承

    Java基礎(chǔ)知識總結(jié)之繼承

    這一篇我們來學(xué)習(xí)面向?qū)ο蟮牡诙€特征——繼承,文中有非常詳細(xì)的基礎(chǔ)知識總結(jié),對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 淺談Mybatis分頁插件,自定義分頁的坑

    淺談Mybatis分頁插件,自定義分頁的坑

    這篇文章主要介紹了淺談Mybatis分頁插件,自定義分頁的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 喜大普奔IntelliJ IDEA 可以使用中文了

    喜大普奔IntelliJ IDEA 可以使用中文了

    IntelliJ Idea最大的亮點開始支持中文,很多英語不好的童鞋有福了,今天通過本文給大家分享如何開啟中文漢化,通過圖文步驟給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • Elasticsearch QueryBuilder簡單查詢實現(xiàn)解析

    Elasticsearch QueryBuilder簡單查詢實現(xiàn)解析

    這篇文章主要介紹了Elasticsearch QueryBuilder簡單查詢實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot參數(shù)校驗之@Valid的使用詳解

    SpringBoot參數(shù)校驗之@Valid的使用詳解

    這篇文章主要通過示例為大家詳細(xì)介紹一下介紹了SpringBoot參數(shù)校驗中@Valid的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • Java并發(fā)編程之阻塞隊列(BlockingQueue)詳解

    Java并發(fā)編程之阻塞隊列(BlockingQueue)詳解

    這篇文章主要介紹了詳解Java阻塞隊列(BlockingQueue)的實現(xiàn)原理,阻塞隊列是Java util.concurrent包下重要的數(shù)據(jù)結(jié)構(gòu),有興趣的可以了解一下
    2021-09-09
  • Java SE使用數(shù)組實現(xiàn)高速數(shù)字轉(zhuǎn)換功能

    Java SE使用數(shù)組實現(xiàn)高速數(shù)字轉(zhuǎn)換功能

    隨著大數(shù)據(jù)時代的到來,數(shù)字轉(zhuǎn)換功能變得越來越重要,在Java開發(fā)中,數(shù)字轉(zhuǎn)換功能也是經(jīng)常用到的,下面我們就來學(xué)習(xí)一下如何使用Java SE數(shù)組實現(xiàn)高速的數(shù)字轉(zhuǎn)換功能吧
    2023-11-11
  • Java實現(xiàn)單機版五子棋游戲的示例代碼

    Java實現(xiàn)單機版五子棋游戲的示例代碼

    五子棋是世界智力運動會競技項目之一,是一種兩人對弈的純策略型棋類游戲,是世界智力運動會競技項目之一。本文將用java語言實現(xiàn)單機版五子棋游戲,感興趣的可以了解一下
    2022-09-09
  • Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問題小結(jié)

    Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問題小結(jié)

    這篇文章主要介紹了Java8 中使用Stream 讓List 轉(zhuǎn) Map使用總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-06-06
  • Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    這篇文章主要介紹了Java 使用多線程調(diào)用類的靜態(tài)方法的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10

最新評論