注解方式配置拦截器
先上代码:(请注意后面需要注意的问题)
配置文件的配置—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.注意拦截注解的配置,应用范围
相关推荐
8. **拦截器**:`@AspectJ`风格的切面注解,如`@Before`和`@After`,可以创建拦截器,实现请求前后的处理逻辑。 9. **资源处理**:Spring MVC提供`@ResourceMapping`注解,用于处理静态资源或RESTful服务。 10. **...
在这个项目中,你可以了解到如何配置和使用拦截器,以及如何将它们集成到 SpringMVC 应用中。 1. **SpringMVC 概述**: SpringMVC 提供了一个模型-视图-控制器架构,用于处理 HTTP 请求和响应。它简化了 MVC 应用...
在本教程“SpringMVC-12 拦截器”中,我们将深入探讨如何实现和配置自定义拦截器,以及多个拦截器的执行顺序。 首先,我们来了解如何创建一个自定义的拦截器。在Spring MVC中,我们需要创建一个实现了`...
通过这种方式,你可以创建一个通用的拦截器,例如登录检查拦截器,以确保只有已登录的用户才能访问特定的资源。 总的来说,Spring MVC的自定义拦截器结合注解的使用,使得在应用程序中添加额外的处理逻辑变得简单且...
在基于Java配置的Spring MVC应用中,可以使用`@Configuration`和`@EnableWebMvc`注解,并通过`addInterceptors`方法添加拦截器: ```java @Configuration @EnableWebMvc public class WebConfig implements ...
总结起来,非注解方式配置Spring MVC涉及的主要步骤包括:配置DispatcherServlet、扫描Controller、设置视图解析器、处理模型数据、配置拦截器、处理异常、定制消息转换器、映射资源以及实现国际化。这种方式虽然比...
在Spring MVC中,可以通过以下两种方式配置拦截器: 1. 配置XML:在spring-mvc.xml配置文件中,使用标签来定义拦截器。每个标签代表一个拦截器,通过指定拦截的URL模式,标签则定义具体的拦截器实例。 2. 配置Java...
例如,使用注解来定义控制器和处理方法,但通过XML配置来设置全局策略,如拦截器、视图解析器等。 综上所述,Spring MVC的注解和非注解方式各有优势,选择哪种方式取决于项目需求、团队习惯和个人偏好。理解并熟练...
这个示例项目涵盖了Spring MVC中的核心概念,包括注解、拦截器以及文件上传功能,这些都是开发现代Web应用程序的关键技术。 首先,让我们深入了解一下Spring MVC中的注解。在Spring MVC中,注解被广泛用于简化配置...
在SpringMVC框架中,拦截器(Interceptor)和异常处理是两个重要的概念,它们对于构建健壮、可维护的Web应用程序至关重要。本文将深入探讨这两个主题,并解释它们如何协同工作以提升应用性能和用户体验。 首先,让...
- 使用Java配置时,可以通过`@EnableWebMvc` 注解启用Web MVC配置,并在`WebMvcConfigurer` 实现类中重写`addInterceptors()` 方法来注册拦截器。 3. **自定义拦截器**: - 自定义拦截器需要继承`...
配置 SpringMVC 拦截器,我们需要在 `springmvc-config.xml` 文件中添加以下内容: ```xml ... ... ``` 此外,还需要在 `web.xml` 文件中配置 SpringMVC 的前端控制器 DispatcherServlet: ```xml ...
在这个压缩包"springboot学习、springmvc、mybatis、注解、拦截器.zip"中,可能包含了关于这些技术的教程、示例代码或者项目实践。"kwan1117"可能是目录名或者一个具体的文件,可能包含深入讲解这些技术点的文档、...
在SpringMVC的配置文件中,我们需要将自定义的Session拦截器添加到拦截器链中。这通常通过`<mvc:interceptors>`标签和`<mvc:interceptor>`子标签完成。例如: ```xml **" /> <!-- 指定拦截所有路径 --> ...
在实际项目中,可以利用SpringMVC的拦截器机制,结合`@RequestMapping`注解,实现更灵活的请求处理流程。同时,多个拦截器可以按照注册的顺序依次执行,形成一个拦截器链,增强了系统的可扩展性和可维护性。 注意,...
例如,可以创建`WebConfig`类,配置视图解析器、拦截器、消息转换器等。 5. **@Controller与@RequestMapping** `@Controller`注解标记在类上表示这是一个处理HTTP请求的控制器,而`@RequestMapping`用于指定请求...
Spring MVC 的核心配置文件 `dispatcher-servlet.xml`(或者使用 Java 配置类)通常在这里定义,它配置了视图解析器、模型数据转换器、拦截器等组件。 在 Spring MVC 中,注解开发主要涉及以下几个方面: 1. **...
在实际项目中,还会涉及到更多高级特性,如拦截器、异常处理、视图解析等,这些都是SpringMVC注解方式的延伸应用。在"AnnotationTest"文件中,可能包含了实践这些概念的示例代码,进一步加深了对SpringMVC注解方式的...
7. **拦截器**:SpringMVC允许我们定义拦截器,它们在请求处理前后执行,可用于日志记录、权限检查等。配置拦截器需在`<mvc:interceptors>`标签下定义。 8. **注解驱动**:SpringMVC支持使用注解进行配置,如`@...
本实例代码着重讲解了SpringMVC中的四种映射方式以及拦截器的实现,这对于理解和掌握SpringMVC的请求处理机制至关重要。 1. **四种映射方式**: - **通配符映射**:`@RequestMapping("/path/*")`,星号(*)代表任意...