springMVC注解方式配置拦截器

注解方式配置拦截器
先上代码:(请注意后面需要注意的问题)
配置文件的配置—springmvc-servlet.xml中配置
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.hope.common.FilterUser"/>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>



我自己的拦截器:


public class FilterUser extends HandlerInterceptorAdapter {

private Logger log = Logger.getLogger(UserLoginController.class);//日志


@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception{
// System.out.println("执行afterCompletion方法");

// TODO Auto-generated method stub

}

@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception{
// System.out.println("执行postHandle方法");
// TODO Auto-generated method stub

}

/**
* preHandle:用户登陆的拦截. <br/>
* @author chenyunxia
* @param request,handler,response
* @return  如果true继续进行不进行拦截,false进行拦截返回登陆页面
* @since JDK 1.6
*/
@Override

public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception{

log.info("判断是否登陆拦截");

System.out.println("执行preHandle方法");
HandlerMethod handlerMethod = (HandlerMethod) handler;
HttpSession session = request.getSession();

//1方法前有注解,0方法前没有注解
Method method = handlerMethod.getMethod();
Class<?> clazz = method.getDeclaringClass();
boolean result = false;
int status = getStatus(clazz, method);
System.out.println("staus="+status);
if(status == 0){
result = true;
}else if(status == 1){
//判断用户是否登陆
  if(session.getAttribute("userId")==null ||session.getAttribute("userId")==""){
 
  result = false;
  }else{
  result = true;
  }
}
if(!result){
response.sendRedirect(request.getContextPath()+"/login");
}
return result;
}

/**
* getStatus:判断方法前有没有NeedLogin的注解. <br/>
* @param clazz
* @param method
* @return  1方法前有NeedLogin注解,0方法前没有注解
* @since JDK 1.6
*/
public int getStatus(Class clazz, Method method){
log.info("判断方法前是否有NeedLogin注解");

int status = 0;//为0表示方法前面没有注解,1表示方法前有注解
if(clazz.getAnnotations() == null || clazz.getAnnotations().length == 0){
if(method.getAnnotations() == null || method.getAnnotations().length == 0){
status = 0;
}else if(method.isAnnotationPresent(NeedLogin.class)){
status = 1;
}else {
status = 1;
}
}else if(clazz.isAnnotationPresent(NeedLogin.class)){
status = 1;
}else {
if(method.getAnnotations() == null || method.getAnnotations().length == 0){
status = 0;
}else if(method.isAnnotationPresent(NeedLogin.class)){
status = 1;
}else{
status = 0;
}
}
return status;

}

我自己的拦截注解:
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)//VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

public @interface NeedLogin {

}

需要注意的问题是:
1.我如上配置拦截器是一直不拦截,后来发现问题因为我在开始的代码写了<mvc:annotation-driven />它默认已经注册了DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
而xml中注册的DefaultAnnotationHandlerMapping,没有真正覆盖掉DispatcherServlet注册的默认RequestMappingHandlerMapping
所以我去掉<mvc:annotation-driven />自己注册
2.并且配置访问到静态的文件,如jpg,js,css我使用<mvc:default-servlet-handler />
代码解释:会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访    问由HandlerMapping
转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet
拦截静态资源使用:
   <!-- 配置资源过滤 -->
<mvc:resources mapping="/style/css/**" location="/style/css/" />
<mvc:resources mapping="/style/js/**" location="/style/js/"/>
3.如果出现DefaultServletHttpRequestHandler,代码会报错。

  HandlerMethod handlerMethod = (HandlerMethod) handler;不能转换

4.注意拦截注解的配置,应用范围

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值