一直对getRequestURI()与getRequestURL()理解不透彻,因此今天通过查找资料,现将些许收获分享一下:

[非原创]代码搬运工..(*^__^*)

1.request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"

  http://www.baidu.com:8080/web/index.html

2.request.getContextPath()  返回  "/web"

3.request.getRequestURI()    返回  /myContext/requestdemo.jsp,                返回的是String

4.request.getRequestURL()    返回  http://localhost:8080/myContext/requestdemo.jsp,    返回的StringBuffer

http://www.baidu.com:8080/web/index.html?username=abc&password=123

1.注册注解@MarkRequest:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface MarkRequest{
String value() default "returnURI";
String scope() default "session"
String[] excludes() default {};
}

2.根据有无@MarkRequest注解来判断是否应当向request或session域中保存请求的uri:

//根据有无@MarkRequest注解来判断是否应当向request或session域中保存请求的uri
public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView){
if(handler instanceof HandlerMethod)}{ HandlerMethod hm=(HandlerMethod)handler; MarkRequest markRequest=hm.getMethodAnnotation(MarkRequest.class); if(markRequest!=null){ String name=markRequest.value(); String scope=markRequest.scope(); String[] excludes= markRequest.excludes(); //不需要保存的uri请求参数 markRequestInfo(request,scope,name,excludes);
}
}
}
/**
* 向request域或session域中保存请求的uri
*/
public void markRequestInfo(HttpServletRequest request,String scope,String name,String[] excludes){ List excludeParamList=Arrays.asList(excludes); String uri=getRequestInfo(request,false,excludeParamList); if("request".equals(scope)){ request.setAttribute(name,uri); }else if("session".equals(scope)){ request.getSession().setAttribute(name,uri);
}
}
public String getRequestInfo(HttpServletRequest request,boolean trimContextPath,List excludeParamList){

    String uri=request.getRequestURI();

    //是否去掉应用名
if(trimContextPath){ String contextPath = request.getContextPath(); if(uri.startsWith(contextPath)){ uri = uri.substring(contextPath.length());
}
} //往uri中添加请求参数
Map<String, String[]> paramMap=(Map<String, String[]) request.getParameterMap(); uri = uri + "?"; if(!paramMap.isEmpty()){ for(Map.Entry<String,String[]> entry : paramMap.entrySet()){ String key = entry.getKey(); if(!excludeParamList.contains(key)){ String[] values= entry.getValue(); for(int i=0; i< values.length; i++){ //url中的请求参数,应当使用URIEncoder把普通字符串转换成application/x-www-form-urlencoded字符串 uri += (key + "=" + URIEncoder.encode(values[i],"utf-8") + "&"); }
}
}
} //去掉去掉uri中的最后一个'&'字符
return uri.substring(0,uri.length()-1);
}

利用注解来保存uri的更多相关文章

  1. Java开发笔记(八十三)利用注解技术检查空指针

    注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架.Mybatis框架,Android开发常见的Butt ...

  2. IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置

    1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...

  3. jdbc操作mysql(三):利用注解封装

    案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...

  4. spring利用注解来注册bean到容器

    1.spring利用注解来定义bean,或者利用注解来注册装配bean.包括注册到ioc中,装配包括成员变量的自动注入. 1.spring会自动扫描所有类的注解,扫描这些注解后,spring会将这些b ...

  5. SpringMVC_01 SpringMVC五大组件、SpringMVC编程步骤(不使用注解进行配置)、SpringMVC编程步骤(利用注解进行配置)、参数获取、响应数据

    1 什么是SpringMVC 是一个mvc框架,用来简化基于mvc架构的web应用程序的 开发. 2 SpringMVC五大组件 DispatcherServlet (前端控制器) HanlderMa ...

  6. 如何利用cookie来保存用户登录账号

    众所周知,cookie在网页编写中不接或缺,今天就谈谈如何利用cookie技术来保存用户登录账号 1.首先是否保存用户登录账号当然是用户自行决定,所以我们需要在用户登录界面设置一个复选框,以此取得用户 ...

  7. java 利用注解实现BaseDao 增删查改

    第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...

  8. Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据

    闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...

  9. java利用注解及反射做通用的入参校验

    一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...

随机推荐

  1. 使用jstack分析cpu消耗过高的问题

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

  2. int与CString互相转化

    int num; CString str; //int转CString num=; str.Format(_T("%d"),num); //CString转int str=L&qu ...

  3. css3 FlexBox 弹性布局

    Flex 弹性布局 这个是css3中新添加的内容,现在已经支持所有的浏览器,利用Flex布局,可以简便.完整.响应式地实现各种页面布局. 注意:在设置 flex 后,子元素的flaot ,clear, ...

  4. noi前机房日常

    2015/6/16 上午a了一道省选分组赛day1t2,并在cf100553H双倍经验,好评 bzoj3152(ctsc2013)贪心,用priority_queue要清空 bx2k上午交了几十题,他 ...

  5. Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)

    错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...

  6. 腾讯开放平台web第三方登录获取信息类(包含签名)

    不清楚具体参数的可以先看下第三方登录的文档: class QQ { //$appid 你的appid //$openid 获取到的唯一的用户openid //$openkey 获取到的openkey ...

  7. Laravel 安装代码智能提示扩展「laravel-ide-helper」

    ========================laravel-ide-helper======================== 使用 Laravel 框架IDE居然没有智能提示?这感觉实在太糟糕 ...

  8. Xcode LLDB 调试Tips

    1.  bt -- 显示当前线程调用堆栈 2.  e -- 执行表达式,动态修改当前线程变量的值 3.  frame variable -- 打印当前堆栈所有变量值 4.  expr -O --lan ...

  9. NSIS对话框单位造成的控件移位问题

    在使用NSIS脚本开发安装卸载程序,使用自定义的nsdialog控件.发现在小部分系统上安装时,一些控件会消失,或者挪位.于是排除问题,看看这些控件的为位置和坐标,发现基本上是使用了对话框单位的控件, ...

  10. Unity3D 计算FPS

    using UnityEngine; using System.Collections; public class FPS : MonoBehaviour { private const string ...