java 拦截器的作用?

java 拦截器的作用?转载注明出处~1.拦截器都是做什么的?做的事和请求和响应有关。(比如前端的css或者一些加载的路径都会走这个拦截器)访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证可以不破坏你的业务逻辑在你的业务之外做一些其他事情~.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,…

大家好,又见面了,我是你们的朋友全栈君。

转载注明出处~

1.拦截器都是做什么的?

做的事和请求和响应有关。(比如前端的css或者一些加载的路径都会走这个拦截器)

访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证

可以不破坏你的业务逻辑  在你的业务之外做一些其他事情~

.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,
这一点,是拦截器无法做到的。在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或
者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts
的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的,url传来之后,检查之后,
可保持原来的流程继续向下执行,被下一个filter, servlet接收。
    2.监听器(Listener):Java的监听器,也是系统级别的监听。监听器随web应用的启动而启动。Java的监听器在c/s模式里面经常用到,它
会对特定的事件产生产生一个处理。监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。
又比如struts2可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
    3.拦截器(Interceptor):java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。
Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。它依赖于具体的接口,在运行期间动态生成字节码。
拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其
执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或
者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在
配置文件即xml,文件里声明一段的那个东西。

转自:https://www.cnblogs.com/austinspark-jessylu/p/7453302.html

 

通过项目的调试,在自己的项目中,拦截器是要取一下token的,然后从redis中获取到用户的信息。

比如:

  private void conversionUserInfo(HttpServletRequest request, String authToken) {
        try {
            Object obj = redisService.get(authToken);
            if (null != obj) {
                UserInfo userInfo = (UserInfo) obj;
                request.setAttribute("requestUserName", "LOGIN_" + userInfo.getUserName());
            } else {
                request.setAttribute("requestUserName", "LOGIN_UNKNOWN_USER");
            }
        } catch (Exception e) {
            log.error("[BaseInterceptor] 失败; error message = {}", e.getMessage());
        }
    }

在preHandle之后,便要进行postHandle也就是把刚刚set进去的属性,打印出来~

 比如打印一下请求开始的时间,还有从预处理到preHandle的时间。

打印日志可以追加一下请求的URI 还有请求的类型,是POST还是GET等等

private StringBuilder prepareRequestContentLog(HttpServletRequest request, String username, Long timeDiff) {
        StringBuilder content = new StringBuilder();
        content.append("[");
        content.append(username);
        content.append("] ");
        if (timeDiff != null) {
            content.append("[");
            content.append(timeDiff);
            content.append("ms] ");
        }
        content.append(request.getRequestURI());
        String method = request.getMethod();
        if ("POST".equals(method)) {
            appendPostParams(content, request);
        } else if ("GET".equals(method)) {
            appendGetParams(content, request);
        }
        return content;
    }

 

2. 获取POST请求中的参数,并打印(使用request.getParameterMap();)

 private void appendPostParams(StringBuilder content, HttpServletRequest request) {
        Map parameterMap = request.getParameterMap();
        if (parameterMap != null && parameterMap.size() != 0) {
            content.append("?");
            for (Object key : parameterMap.keySet()) {
                content.append(key);
                content.append("=");
                content.append(request.getParameterValues(key.toString())[0]);
                content.append("&");
            }
            content.deleteCharAt(content.length() - 1);
        }
    }

3. 获取GET请求的参数,并打印(使用request.getQueryString();)

private void appendGetParams(StringBuilder content, HttpServletRequest request) {
        String queryString = request.getQueryString();
        if (!StringUtils.isBlank(queryString)) {
            content.append("?");
            content.append(queryString);
        }
    }

4. StringBuffer的delete方法与deleteCharAt的区别

delete方法与deleteCharAt两个方法都是用来删除StringBuffer字符串指定索引字符的方法,

delete(int  a,int  b)有两个参数,使用时删除索引从a开始(包含a)到b(不包含b)的所有字符;

deleteCharAt(int  a)只有一个参数,使用时删除索引为a的字符;

5. @Nullable ModelAndView modelAndView

  • @NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空
  • @Nullable注解可以标注在方法、字段、参数之上,表示对应的值可以为空

ModelAndView :

在我们项目中这一项是为null,也没有用到。 这个是以前会用到的东西 现在HTML和接口分离。也就不怎么用了

ModelAndView包含两部分:一个View和一个Model
View由setViewName()方法来决定,决定让ViewResolver去哪里找View文件,并找到是哪个jsp文件;
Model由addObject()方法来决定,它的本质是java的HashMap,键值对;

核心就是Object\LinkedHashMap,完全是Java的标准容器(对象)。

参考:https://www.cnblogs.com/zhuchuanliang/p/7784772.html

6. HttpServletRequest 请求中都有什么?剖析?

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144819.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 玩玩webgame开发(2):人物移动与战争迷雾实现

    玩玩webgame开发(2):人物移动与战争迷雾实现惯例,先上下效果图片:[img]/upload/attachment/47613/3b8e0d31-b9cc-3272-abbb-0941300a68ef.png[/img]在上一篇玩玩webgame开发(1)大概给出了jquery方式的地图实现,最近又做了一些改进,加进了更多元素。代码全部改成jquery插件的方式。有机会做专门的介绍。这次的主题主要是地图上面人物的移动以及战…

    2022年5月25日
    38
  • Java上传文件到数据库「建议收藏」

    Java上传文件到数据库「建议收藏」Java上传文件到数据库   首先在开始本文之前推荐一篇我非常喜欢的博主——孤傲苍狼的一篇相关博文。     JavaWeb学习总结(五十)——文件上传和下载        http://www.cnblogs.com/xdp-gacl/p/4200090.html     本文主要介绍如何将文件上传到服务器,并以二进制字符流的形式存入数据库。

    2025年9月14日
    7
  • 推荐一款博客备份工具!

    推荐一款博客备份工具!网友老紫竹开发了一个csdn博客备份工具,现在推荐给大家,有需要备份博客的可以点击下面的链接使用该工具。在此,我们感谢老紫竹为博客所作出的贡献!同时我们也欢迎其他网友来开发各种实用的博客工具,然后分享给大家使用!备份工具地址:http://www.java2000.net/csdn/blogbackup.jsp…

    2022年7月25日
    7
  • Android Fragment用法之给Activity创建事件回调

    在某些案例中,可能需要Fragment与Activity共享事件。在Fragment内部定义一个回调接口是一个好方法,并且规定由持有它的Activity实现这个回调方法。当Activity通过接口接受回调时,它能在必要时与布局中的其他Fragment共享信息。例如,如果一个音乐播放器的应用程序在一个Activity中有两个Fragment—一个用来显示歌曲列表(Fragment A),另一

    2022年3月9日
    45
  • 蒙特卡洛树搜索 MCTS 入门[通俗易懂]

    蒙特卡洛树搜索 MCTS 入门[通俗易懂]引言  你如果是第一次听到蒙特卡洛,可能会认为这是一个人名。那么你就大错特错,蒙特卡洛不是一个人名,而是一个地方,还一个赌场名!!!但是这不是我们的重点。  我们今天的主题就是入门蒙特卡洛树搜索,这个算法我个人觉得非常神奇也非常有意思。因为前几年AlphaGo就是借助蒙塔卡洛树搜索以及基于深度学习的的策略价值网络击败了人类冠军,赢得了胜利。而今天我们的主角就是蒙特卡洛树搜索它究竟是怎么实现的?它的原理?以及会举出一个例子来告诉大家整个算法的工作流程。一、什么是MCTS?  蒙特卡洛树搜索是一

    2022年6月15日
    120
  • linux rpm解压命令,LINUX下各种解压命令收藏「建议收藏」

    linux rpm解压命令,LINUX下各种解压命令收藏「建议收藏」大致总结了一下linux下各种格式的压缩包的压缩、解压方法。但是部分方法我没有用到,也就不全,希望大家帮我补充,我将随时修改完善,谢谢!.tar解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzipFileName.gz解压2:gzip-dFileN…

    2022年5月16日
    151

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号