利用注解来保存uri
一直对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的更多相关文章
- Java开发笔记(八十三)利用注解技术检查空指针
注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架.Mybatis框架,Android开发常见的Butt ...
- 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 ...
- jdbc操作mysql(三):利用注解封装
案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...
- spring利用注解来注册bean到容器
1.spring利用注解来定义bean,或者利用注解来注册装配bean.包括注册到ioc中,装配包括成员变量的自动注入. 1.spring会自动扫描所有类的注解,扫描这些注解后,spring会将这些b ...
- SpringMVC_01 SpringMVC五大组件、SpringMVC编程步骤(不使用注解进行配置)、SpringMVC编程步骤(利用注解进行配置)、参数获取、响应数据
1 什么是SpringMVC 是一个mvc框架,用来简化基于mvc架构的web应用程序的 开发. 2 SpringMVC五大组件 DispatcherServlet (前端控制器) HanlderMa ...
- 如何利用cookie来保存用户登录账号
众所周知,cookie在网页编写中不接或缺,今天就谈谈如何利用cookie技术来保存用户登录账号 1.首先是否保存用户登录账号当然是用户自行决定,所以我们需要在用户登录界面设置一个复选框,以此取得用户 ...
- java 利用注解实现BaseDao 增删查改
第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
- java利用注解及反射做通用的入参校验
一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...
随机推荐
- 使用jstack分析cpu消耗过高的问题
我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2 18 ...
- int与CString互相转化
int num; CString str; //int转CString num=; str.Format(_T("%d"),num); //CString转int str=L&qu ...
- css3 FlexBox 弹性布局
Flex 弹性布局 这个是css3中新添加的内容,现在已经支持所有的浏览器,利用Flex布局,可以简便.完整.响应式地实现各种页面布局. 注意:在设置 flex 后,子元素的flaot ,clear, ...
- noi前机房日常
2015/6/16 上午a了一道省选分组赛day1t2,并在cf100553H双倍经验,好评 bzoj3152(ctsc2013)贪心,用priority_queue要清空 bx2k上午交了几十题,他 ...
- Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)
错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...
- 腾讯开放平台web第三方登录获取信息类(包含签名)
不清楚具体参数的可以先看下第三方登录的文档: class QQ { //$appid 你的appid //$openid 获取到的唯一的用户openid //$openkey 获取到的openkey ...
- Laravel 安装代码智能提示扩展「laravel-ide-helper」
========================laravel-ide-helper======================== 使用 Laravel 框架IDE居然没有智能提示?这感觉实在太糟糕 ...
- Xcode LLDB 调试Tips
1. bt -- 显示当前线程调用堆栈 2. e -- 执行表达式,动态修改当前线程变量的值 3. frame variable -- 打印当前堆栈所有变量值 4. expr -O --lan ...
- NSIS对话框单位造成的控件移位问题
在使用NSIS脚本开发安装卸载程序,使用自定义的nsdialog控件.发现在小部分系统上安装时,一些控件会消失,或者挪位.于是排除问题,看看这些控件的为位置和坐标,发现基本上是使用了对话框单位的控件, ...
- Unity3D 计算FPS
using UnityEngine; using System.Collections; public class FPS : MonoBehaviour { private const string ...