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

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

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

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

原因

在Spring中request的值只能被獲取一次,攔截器獲取之后就會導致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進行項目的時候用到了權限驗證。

表分為:

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

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

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

再逐一循環(huá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 "";//默認為空,因為名字是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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

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

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

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

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

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

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

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

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

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

    實例講解JAVA設計模式之備忘錄模式

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

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

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

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

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

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

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

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

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

    java的nio的使用示例分享

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

最新評論

内黄县| 商都县| 西宁市| 甘孜县| 哈密市| 翁源县| 房产| 临沭县| 灵武市| 平度市| 宁波市| 铜陵市| 五台县| 安国市| 甘南县| 衡东县| 阿坝县| 永泰县| 启东市| 苍溪县| 庐江县| 崇左市| 广元市| 万安县| 张家口市| 琼结县| 西峡县| 福安市| 禄劝| 重庆市| 浦江县| 措勤县| 沅江市| 偏关县| 许昌市| 普陀区| 开江县| 博兴县| 白山市| 洪湖市| 灵石县|