java中,自定义注解拦截器来实现,在需要的拦截的方法上面加上一个注解@AccessRequired
2017-11-24 15:31
711 查看
java中,自定义注解拦截器来实现,在需要的拦截的方法上面加上一个注解@AccessRequired
spring mvc Controller中的使用实例
[java]
view plain
copy
/**
* 注解拦截器方法
* @return
*/
@RequestMapping(value="/urlinter",method=RequestMethod.GET)
@AccessRequired
public @ResponseBody String urlInterceptorTest() {
return "通过拦截器:user"+request.getAttribute("currUser");
}
如何实现以上实例呢?
定义一个注解:
[java]
view plain
copy
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessRequired {
}
搞一个拦截器:
[java]
view plain
copy
/**
* 拦截url中的access_token
* @author Nob
*
*/
public class UserAccessApiInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
AccessRequired annotation = method.getAnnotation(AccessRequired.class);
if (annotation != null) {
System.out.println("你遇到了:@AccessRequired");
String accessToken = request.getParameter("access_token");
/**
* Do something
*/
response.getWriter().write("没有通过拦截,accessToken的值为:" + accessToken);
}
// 没有注解通过拦截
return true;
}
}
在spring mvc配置文件中:
[java]
view plain
copy
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 对所有的请求拦截使用/** ,对某个模块下的请求拦截使用:/myPath/* -->
<mvc:mapping path="/api/**" />
<ref bean="userAccessInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="userAccessInterceptor"
class="com.banmacoffee.web.interceptor.UserAccessApiInterceptor">
</bean>
注意问题:
如果你使用了<mvc:resources mapping="/resources/**" location="/resources/" />来配置静态资源,那么配置如上拦截器的时候就要使用使用了全局拦截/**,否则会拦截静态资源抛出ResourceHttpRequestHandler cannot be cast to HandlerMethod异常
办法一:加上拦截路径前缀
[java]
view plain
copy
<mvc:mapping path="/path/**" />
<!-- 这里使用一个path前置,如api,否则会拦截静态资源 -->
办法二:在自定义拦截器中使用instanceof 过滤ResourceHttpRequestHandler 类型
大功告成,你可以在拦截器里为所欲为,并且把它加载任何你想的Controller 请求的方法上
spring mvc Controller中的使用实例
[java]
view plain
copy
/**
* 注解拦截器方法
* @return
*/
@RequestMapping(value="/urlinter",method=RequestMethod.GET)
@AccessRequired
public @ResponseBody String urlInterceptorTest() {
return "通过拦截器:user"+request.getAttribute("currUser");
}
如何实现以上实例呢?
定义一个注解:
[java]
view plain
copy
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessRequired {
}
搞一个拦截器:
[java]
view plain
copy
/**
* 拦截url中的access_token
* @author Nob
*
*/
public class UserAccessApiInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
AccessRequired annotation = method.getAnnotation(AccessRequired.class);
if (annotation != null) {
System.out.println("你遇到了:@AccessRequired");
String accessToken = request.getParameter("access_token");
/**
* Do something
*/
response.getWriter().write("没有通过拦截,accessToken的值为:" + accessToken);
}
// 没有注解通过拦截
return true;
}
}
在spring mvc配置文件中:
[java]
view plain
copy
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 对所有的请求拦截使用/** ,对某个模块下的请求拦截使用:/myPath/* -->
<mvc:mapping path="/api/**" />
<ref bean="userAccessInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="userAccessInterceptor"
class="com.banmacoffee.web.interceptor.UserAccessApiInterceptor">
</bean>
注意问题:
如果你使用了<mvc:resources mapping="/resources/**" location="/resources/" />来配置静态资源,那么配置如上拦截器的时候就要使用使用了全局拦截/**,否则会拦截静态资源抛出ResourceHttpRequestHandler cannot be cast to HandlerMethod异常
办法一:加上拦截路径前缀
[java]
view plain
copy
<mvc:mapping path="/path/**" />
<!-- 这里使用一个path前置,如api,否则会拦截静态资源 -->
办法二:在自定义拦截器中使用instanceof 过滤ResourceHttpRequestHandler 类型
大功告成,你可以在拦截器里为所欲为,并且把它加载任何你想的Controller 请求的方法上
相关文章推荐
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)里面的坑之 同一个controller部分方法可以拦截,部分方法拦截不了
- 如何开发一个java开源框架-----Jvn框架之实现自定义Annotation以及拦截器(第五讲)
- (日常打卡)自定义的一个模仿ArrayList的类, 你需要实现其中的add, get, remove , 等方法
- Java自定义注解实现Redis自动缓存的方法
- 2017/2/23 Java SpringAOP拦截Service实现日志管理(自定义注解)
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- spring自定义注解实现拦截器的实现方法
- 自定义注解实现spring 方法拦截用于日志,等处理
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- java注解:如何实现和使用一个自定义注解?
- java动态代理对象实现日志的拦截(annotation自定义注解方式)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- java基础问题----java中有几种方法可以实现一个线
- java 学习 私有类实现接口 ,一个类继承来的方法和接口实现方法重复第八天