最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

原因

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

解決方法

將request的值進(jìn)行備份,請求到達(dá)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,將該過濾器配置在項(xiàng)目中,為了調(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進(jìn)行項(xiàng)目的時候用到了權(quán)限驗(yàn)證。

表分為:

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

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

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

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

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

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

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

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

方法三:自定義注解

自定義注解代碼:

@Retention(RUNTIME)
@Target(METHOD)
public @interface MyOperation {
    String value() default "";//默認(rèn)為空,因?yàn)槊质莢alue,實(shí)際操作中可以不寫"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("進(jìn)入攔截器");
    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);
}

補(bǔ)充

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

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

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

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

相關(guān)文章

  • 詳細(xì)介紹idea如何設(shè)置類頭注釋和方法注釋(圖文)

    詳細(xì)介紹idea如何設(shè)置類頭注釋和方法注釋(圖文)

    本篇文章主要介紹了idea如何設(shè)置類頭注釋和方法注釋(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 使用Java解析JSON數(shù)據(jù)并提取特定字段的實(shí)現(xiàn)步驟(以提取mailNo為例)

    使用Java解析JSON數(shù)據(jù)并提取特定字段的實(shí)現(xiàn)步驟(以提取mailNo為例)

    在現(xiàn)代軟件開發(fā)中,處理JSON數(shù)據(jù)是一項(xiàng)非常常見的任務(wù),無論是從API接口獲取數(shù)據(jù),還是將數(shù)據(jù)存儲為JSON格式,解析和提取JSON中的特定字段都是開發(fā)人員需要掌握的基本技能,本文將以一個實(shí)際案例為例,詳細(xì)介紹如何使用Java解析JSON數(shù)據(jù)并提取其中的mailNo字段
    2025-01-01
  • java判斷是否為圖片的步驟和方法

    java判斷是否為圖片的步驟和方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于java判斷是否為圖片的做法和步驟,需要的朋友們學(xué)習(xí)下。
    2018-12-12
  • SpringBoot自定義定時任務(wù)的實(shí)現(xiàn)示例

    SpringBoot自定義定時任務(wù)的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot自定義定時任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式

    實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • springboot 自定義屬性與加載@value示例詳解

    springboot 自定義屬性與加載@value示例詳解

    在SpringBoot框架中,自定義屬性通常通過application.properties文件配置,并使用@Value注解加載,雖然這是一種可行的方法,但存在一種更優(yōu)雅的實(shí)現(xiàn)方式,本文給大家介紹springboot 自定義屬性與加載@value的相關(guān)操作,感興趣的朋友一起看看吧
    2024-10-10
  • Java中的ArrayList和contains函數(shù)和擴(kuò)容機(jī)制(源碼詳解)

    Java中的ArrayList和contains函數(shù)和擴(kuò)容機(jī)制(源碼詳解)

    這篇文章主要介紹了Java中的ArrayList和contains函數(shù)和擴(kuò)容機(jī)制,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • SpringBoot文件分片上傳的示例代碼

    SpringBoot文件分片上傳的示例代碼

    分片上傳在很多地方都可以使用的到,本文主要介紹了SpringBoot文件分片上傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 利用MultipartFile實(shí)現(xiàn)文件上傳功能

    利用MultipartFile實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java的nio的使用示例分享

    java的nio的使用示例分享

    這篇教程展示了5個在Java編程的一些常見場景里使用NIO和NIO.2包的簡單示例,需要的朋友可以參考下
    2014-03-03

最新評論

榆树市| 阿拉善左旗| 瑞安市| 丰都县| 城市| 微博| 博乐市| 克什克腾旗| 湖口县| 维西| 贵定县| 潍坊市| 卓资县| 甘泉县| 常州市| 阿坝县| 石家庄市| 思南县| 通河县| 贵定县| 和林格尔县| 新民市| 修水县| 平远县| 满洲里市| 青川县| 工布江达县| 桑日县| 平邑县| 思茅市| 镶黄旗| 古交市| 丰原市| 虞城县| 揭西县| 共和县| 宁城县| 滦南县| 剑河县| 新民市| 天峨县|